diff --git a/404.html b/404.html new file mode 100644 index 0000000..ce596c4 --- /dev/null +++ b/404.html @@ -0,0 +1,21 @@ + + + + + + Alterforia + + + + + + + + + + + +

404

Нет такой страницы :(

:(((

+ + + diff --git a/about.html b/about.html new file mode 100644 index 0000000..84640b7 --- /dev/null +++ b/about.html @@ -0,0 +1,23 @@ + + + + + + Что это? | Alterforia + + + + + + + + + + + +

My personal website... None of your business 😃

Это блог. Он посвящен моей деятельности и достижениям как разработчика, музыканта, человека. Недавно мне пришлось доказывать что я не верблюд, уверен, этот сайт поможет мне больше не попадать в такие ситуации.

Технологии и Тулсет:

  • Jekyll (╯°□°)╯︵ ┻━┻,
  • В основе - фреймворк Vuepress, расширенный собственными компонентами,
  • Среди них - анимированный Canvas (Вкл!) в заголовке и несколько анимаций внутри статей,
  • Эта и другие страницы находятся на приветливых GitHub Pages, куда попадают через GitHub Actions.
+ + + diff --git a/assets/css/0.styles.74593e54.css b/assets/css/0.styles.74593e54.css new file mode 100644 index 0000000..e25b1e8 --- /dev/null +++ b/assets/css/0.styles.74593e54.css @@ -0,0 +1 @@ +.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}.icon{width:.75em;height:.75em;margin-right:1em;display:inline-block;vertical-align:top}:nth-child(2 of .socials a) .icon{width:1.5em;height:1.5em}.icon:hover{color:pink}.site-header{position:relative;background:#111;background-size:cover;background-position:50%;z-index:1}.site-header .fullscreen{position:fixed;left:0;top:0;width:100%;height:100%}.site-header .animation-toggler{position:absolute;right:3em}.site-header .animation-toggler a{color:#ff0;font-size:.825em;text-decoration:none;border-bottom:1px dotted pink}.site-header .animation-toggler.top-1{top:1em}.site-header .animation-toggler.top-2{top:2em}.site-header .page-title{color:#fff;font-size:calc(1.3em + 3vw);transition:opacity 2s ease-in-out 1s;transition:transform 2s ease-in-out 1s}.site-header .main-title,.site-header .page-title{letter-spacing:-1px;position:absolute;margin:0;padding:0;text-align:center;top:50%;left:50%;transform:translate3d(-50%,-50%,0)}.site-header .main-title{font-size:5vw;line-height:1.75;transition:opacity 2s ease-in-out 1s}.site-header .main-title sup{top:-2.25em;font-size:.25em}.site-header .main-title sup a{color:pink}.site-header .main-title sup a:hover{color:#fdfdfd}.site-header .main-title a{color:#fdfdfd;text-decoration:none}.site-header .main-title a:hover{color:pink}ol[data-v-6c022017],ul[data-v-6c022017]{list-style:none;margin:0;padding:0}.footer[data-v-6c022017]{min-height:60px;box-sizing:border-box;background-color:#111;display:flex;padding:15px 32px;color:#fff}.footer .footer-right-wrap[data-v-6c022017]{flex:1;display:flex;align-items:center;justify-content:center}@media (min-width:959px){.footer .footer-right-wrap[data-v-6c022017]{justify-content:flex-end}}.footer .footer-right-wrap .copyright[data-v-6c022017]{display:flex;justify-content:flex-end}.footer .footer-right-wrap .copyright .copyright-item[data-v-6c022017]{flex:0 0 auto;padding:0 10px;position:relative;line-height:12px;border-right:1px solid #828282}.footer .footer-right-wrap .copyright .copyright-item[data-v-6c022017]:last-child{border-right:none}.footer .footer-right-wrap .copyright .copyright-item a[data-v-6c022017]{font-size:12px;color:#828282;text-decoration:none;transition:color .3s}.footer .footer-right-wrap .copyright .copyright-item a[data-v-6c022017]:hover{color:hsla(0,0%,100%,.9)}@media (max-width:719px){.footer[data-v-6c022017]{min-height:100px;flex-direction:column}.footer .footer-left-wrap[data-v-6c022017]{align-items:center;justify-content:center}.footer .footer-right-wrap .copyright[data-v-6c022017]{display:block}.footer .footer-right-wrap .copyright .copyright-item[data-v-6c022017]{line-height:1;border-right:none;text-align:center}}main[data-v-4d3dfa27]{overflow:hidden}.content-wrapper[data-v-4d3dfa27]{padding:2em 1em 5em;max-width:50em;margin:0 auto}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:none;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8292a2}.token.punctuation{color:#f8f8f2}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}@font-face{font-family:"PT Serif";font-style:normal;font-weight:400;font-display:swap;src:local("PT Serif"),local("PTSerif-Regular"),url(/assets/fonts/EJRVQgYoZZY2vCFuvAFbzr-_dSb_nco.9738e026.woff2) format("woff2");unicode-range:U+0460-052f,U+1c80-1c88,U+20b4,U+2de0-2dff,U+a640-a69f,U+fe2e-fe2f}@font-face{font-family:"PT Serif";font-style:normal;font-weight:400;font-display:swap;src:local("PT Serif"),local("PTSerif-Regular"),url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-family:"PT Serif";font-style:normal;font-weight:400;font-display:swap;src:local("PT Serif"),local("PTSerif-Regular"),url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-family:"PT Serif";font-style:normal;font-weight:400;font-display:swap;src:local("PT Serif"),local("PTSerif-Regular"),url(/assets/fonts/EJRVQgYoZZY2vCFuvAFWzr-_dSb_.b450bfca.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.content__default code{color:#476582;padding:.1rem .4rem;margin:.1rem;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:15px}.content__default code .token.deleted{color:#ec5975}.content__default code .token.inserted{color:#3eaf7c}.content__default pre,.content__default pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content__default pre[class*=language-] code,.content__default pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:hsla(0,0%,100%,.2)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.global-ui .sw-update-popup{border-color:#3eaf7c;color:#3eaf7c;border-radius:10px}.global-ui .sw-update-popup button{background:#d05dd2;color:#fff;border-radius:5px;border:none}body,html{padding:0;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50;background-color:#fff}.content__default:not(.custom) a:hover{text-decoration:underline}.content__default:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content__default:not(.custom) img{max-width:100%}.content__default.custom{padding:0;margin:0}.content__default.custom img{max-width:100%}a{font-weight:500;color:#3eaf7c;text-decoration:underline}a:hover{color:#328c63}p a code{font-weight:400;color:#3eaf7c}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:.9rem;color:#1f573e;border-left:3px solid #3eaf7c;margin:.5rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25;font-family:PT Serif,Serif}.content__default:not(.custom)>h1,.content__default:not(.custom)>h2,.content__default:not(.custom)>h3,.content__default:not(.custom)>h4,.content__default:not(.custom)>h5,.content__default:not(.custom)>h6{margin-top:calc(.5rem - 80px);padding-top:calc(80px + 1rem);margin-bottom:0}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}@media (max-width:719px){.content__default:not(.custom)>h1:first-child{padding-top:2rem}}@media (max-width:419px){h1{font-size:1.9rem}.content__default div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]-moz-focusring,[type=reset]-moz-focusring,[type=submit]-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.container{margin:10px auto;max-width:600px;text-align:center}h1{margin:30px 0;font-size:4em;line-height:1;letter-spacing:-1px}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline;outline:none}.pagination>li>a,.pagination>li>span{transition:color .2s,background-color .2s;outline:none;position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#3eaf7c;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#3eaf7c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#3eaf7c;border-color:#3eaf7c}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#ddd;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.simple-pagination a{margin-right:20px;color:#000;height:38px;line-height:38px;transition:all .3s ease;position:relative;overflow:hidden;display:inline-block;background:#fff;padding:0 15px;text-decoration:none;border:1px solid #000;border-radius:5px;transition:all .5s}.simple-pagination a:hover{color:#fff;border:1px solid #3eaf7c;background-color:#3eaf7c}.common-layout .content-wrapper{padding-bottom:80px}.ui-post{padding-bottom:25px;margin-bottom:25px;border-bottom:1px solid #eaecef}.ui-post:last-child{border-bottom:0;margin-bottom:0}.ui-post-title{font-family:PT Serif,Serif;font-size:28px;border-bottom:0}.ui-post-title a{cursor:pointer;color:#000;transition:all .2s;text-decoration:none}.ui-post-title a:hover{text-decoration:underline}.ui-post-summary{font-size:14px;color:rgba(0,0,0,.54);font-weight:200}.ui-post-meta{display:inline-flex;align-items:center;font-size:12px;line-height:12px}.ui-post-meta:not(:last-child){margin-bottom:3px;margin-right:20px}.ui-post-meta svg{margin-right:5px;width:14px;height:14px}@media (max-width:719px){.ui-post-meta{display:flex}.ui-post-meta:not(:last-child){margin-bottom:10px}}.ui-post-author{color:rgba(0,0,0,.84);font-weight:400}.ui-post-date,.ui-post-tag{color:rgba(0,0,0,.54);font-weight:200}.ui-post-tag a{color:inherit;font-weight:200;text-decoration:none;margin-right:5px}.ui-post-tag a:hover{color:#3eaf7c}.blog-tag{display:inline-flex;align-items:center;height:45px;word-break:break-word;font-size:20px;margin-right:20px;margin-bottom:20px;padding:0 15px;border-radius:5px;font-weight:300;text-align:left;box-sizing:border-box;transition:background-color .3s;color:#000;border:1px solid #000;text-decoration:none;transition:all .5s}.blog-tag:hover{color:#3eaf7c!important;border:1px solid #3eaf7c;box-shadow:0 0 5px #3eaf7c}@media screen and (max-width:768px){.blog-tag{font-size:14px;padding:3px 10px;margin-right:10px;margin-bottom:10px}}.blog-tags{width:66%}@media screen and (max-width:1000px){.blog-tags{width:90%}}.nav-link{color:#000}.nav-link.router-link-active,.nav-link:hover{color:#3eaf7c} \ No newline at end of file diff --git a/assets/fonts/EJRVQgYoZZY2vCFuvAFWzr-_dSb_.b450bfca.woff2 b/assets/fonts/EJRVQgYoZZY2vCFuvAFWzr-_dSb_.b450bfca.woff2 new file mode 100644 index 0000000..5d27466 Binary files /dev/null and b/assets/fonts/EJRVQgYoZZY2vCFuvAFWzr-_dSb_.b450bfca.woff2 differ diff --git a/assets/fonts/EJRVQgYoZZY2vCFuvAFbzr-_dSb_nco.9738e026.woff2 b/assets/fonts/EJRVQgYoZZY2vCFuvAFbzr-_dSb_nco.9738e026.woff2 new file mode 100644 index 0000000..9d860a9 Binary files /dev/null and b/assets/fonts/EJRVQgYoZZY2vCFuvAFbzr-_dSb_nco.9738e026.woff2 differ diff --git a/assets/js/10.5ec625cf.js b/assets/js/10.5ec625cf.js new file mode 100644 index 0000000..eb1654c --- /dev/null +++ b/assets/js/10.5ec625cf.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{416:function(n,t,e){"use strict";e.r(t);var l=e(15),a=Object(l.a)({},(function(){var n=this.$createElement,t=this._self._c||n;return t("main",[t("article",[t("Content")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/11.3fdea1ce.js b/assets/js/11.3fdea1ce.js new file mode 100644 index 0000000..b2070cf --- /dev/null +++ b/assets/js/11.3fdea1ce.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{414:function(t,e,s){"use strict";s.r(e);var a=s(15),n=Object(a.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"vuepress-theme-blog__tags-layout"}},[e("BlogTags",{attrs:{tags:this.$frontmatterKey.list}})],1)}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/12.bddb77d0.js b/assets/js/12.bddb77d0.js new file mode 100644 index 0000000..09693e0 --- /dev/null +++ b/assets/js/12.bddb77d0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{418:function(t,e,n){"use strict";n.r(e);var s=n(15),l=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("Недавно я наконец ушёл в нормальный отпуск и решил навести порядок в личных проектах. Так и родился этот блог, в котором я постараюсь использовать всё самое лучшее из прошлых наработок и передовой опыт последних лет работы.")])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/13.670a997d.js b/assets/js/13.670a997d.js new file mode 100644 index 0000000..d3a95da --- /dev/null +++ b/assets/js/13.670a997d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{419:function(v,_,t){"use strict";t.r(_);var e=t(15),l=Object(e.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("blockquote",[t("p",[v._v("Reflect (verb): to prevent passage of and cause to change direction\n— "),t("a",{attrs:{href:"https://www.merriam-webster.com/dictionary/reflect",target:"_blank",rel:"noopener noreferrer"}},[v._v("Marriam-Webster dictionary"),t("OutboundLink")],1)])]),v._v(" "),t("p",[v._v("Умение смотреть назад, на самого себя и на содержание и функции своего сознания - наиважнейший навык в карьерном росте. Это называется рефлексией.")]),v._v(" "),t("p",[v._v("Анализируя своё прошлое, можно понять что на самом деле важно и каким образом формируются цели, решения, желания.")]),v._v(" "),t("p",[v._v("Если вам что-то на самом деле важно, вы действуете. Поэтому важно прояснить ценности чтобы принимать важные решения уверенно. Также, осознание своих ценностей даёт вам мощное ощущение собственной идентичности и уникальности.")]),v._v(" "),t("p",[v._v("Ценности познаются в сравнении. Ценность возникает при сравнении с чем-либо.\nЯ могу сказать что мне важны деньги, но бывают ситуации, когда деньги уже не имеют такой ценности - при проблемах со здоровьем, с близкими. Это ставит деньги в иерархии ценностей чуть ниже чем здоровье и отношения.")]),v._v(" "),t("p",[v._v("Также, потребность в уважении может перевесить ценность отношений или денег.")]),v._v(" "),t("p",[v._v("Ценности требуют жертв. Чем-то приходится жертвовать в пользу того, что важно.")]),v._v(" "),t("p",[v._v("Возьмем за основу деньги. Но что значат деньги? Безопасность? Может быть, статус? Возможность путешествовать? То есть, деньги это важно, но ценность не в них самих, а в возможностях, которые они дают и как вы их используете.")]),v._v(" "),t("p",[v._v("Ценности меняются со временем, поэтому очень важно периодически пересматривать их для понимания куда двигаться дальше.")]),v._v(" "),t("hr"),v._v(" "),t("p",[v._v("Давайте проделаем простое упражнение")]),v._v(" "),t("ol",{attrs:{start:"0"}},[t("li",[v._v("Нарисуйте горизонтальную линию.")]),v._v(" "),t("li",[v._v("Определите временной промежуток для ревизии. Стартовой точкой может быть выпуск из университета, начало работы как специалиста. Важно чтобы можно было обнаружить повторяющиеся паттерны в принятии решений.")]),v._v(" "),t("li",[v._v("Определите периоды для ревизии. Это могут быть отчетные месяцы, или переходы между проектами или должностями.")]),v._v(" "),t("li",[v._v("Вспомните что вы делали на каждом этапе. Резюме или дневник могут помочь освежить память.")]),v._v(" "),t("li",[v._v("Нарисуйте вертикальную линию в точке старта и начертите кривую своего эмоционального состояния через все периоды.")]),v._v(" "),t("li",[v._v("Назовите эти эмоции и их противоположности, это могут быть:\n"),t("ul",[t("li",[v._v("любопытство-скука")]),v._v(" "),t("li",[v._v("благодарность-сожаление")]),v._v(" "),t("li",[v._v("радость-печаль")]),v._v(" "),t("li",[v._v("принадлежность-изолированность")]),v._v(" "),t("li",[v._v("добавьте своих")])])]),v._v(" "),t("li",[v._v("Подумайте что было важно для вас в то время. Какие потребности были удовлетворены или нет.")]),v._v(" "),t("li",[v._v("Ищите паттерны, ответьте на несколько вопросов:\n"),t("ul",[t("li",[v._v("Были ли эмоции, которые повторялись снова и снова?")]),v._v(" "),t("li",[v._v("Были ли реакции, которые сложно объяснить?")]),v._v(" "),t("li",[v._v("Были ли ситуации когда вы что-то не хотели замечать, но это сильно сказалось потом?")]),v._v(" "),t("li",[v._v("На что вам следует обращать внимание в будущем чтобы ваши потребности были с большей вероятностью удовлетворены?")])])])])])}),[],!1,null,null,null);_.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/14.c9f3cb74.js b/assets/js/14.c9f3cb74.js new file mode 100644 index 0000000..6b67407 --- /dev/null +++ b/assets/js/14.c9f3cb74.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{420:function(v,_,l){"use strict";l.r(_);var i=l(15),t=Object(i.a)({},(function(){var v=this,_=v.$createElement,l=v._self._c||_;return l("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[l("p",[v._v("В прошлом посте ("),l("a",{attrs:{href:"/reflection"}},[v._v("о рефлексии")]),v._v(") я рассказывал об упражнении на выявление своих потребностей и ценностей. Сегодня мы обогатим наш лексикон парой готовых фреймворков ценностей и приоритезируем наши нужды.")]),v._v(" "),l("p",[v._v("Первый фреймворк ценностей в нашем списке был создан в 1960-х Рене Доуисом и Ллойдом Лофкистом:")]),v._v(" "),l("ul",[l("li",[v._v("Достижения - результаты и процесс")]),v._v(" "),l("li",[v._v("Комфорт - отсутствие стресса")]),v._v(" "),l("li",[v._v("Статус - признание и престиж")]),v._v(" "),l("li",[v._v("Альтруизм - гармоничное служение другим")]),v._v(" "),l("li",[v._v("Безопасность - предсказуемость и стабильность")]),v._v(" "),l("li",[v._v("Автономия - возможность управлять и инициативность")])]),v._v(" "),l("p",[v._v("В 2000-х Эдвард Дечи и Ричард Райан создали теорию Само-определения, она содержит всего три мотивирующих фактора, которые присущи всем человеческим существам:")]),v._v(" "),l("ul",[l("li",[v._v("Компетенции - мастерство в своей сфере деятельности")]),v._v(" "),l("li",[v._v("Причастность - забота и контакт с окружающими")]),v._v(" "),l("li",[v._v("Автономия - управление, выбор, свобода")])]),v._v(" "),l("p",[v._v('Если вы выполнили упражнение в статье о Рефлексии, у вас уже есть некоторый список того, что важно именно вам, и это в тысячу раз более ценно, чем пользование готовыми системами. Фреймворки могут помочь обратить внимание на то, что вы, возможно упустили в самоанализе. Также список обычно увеличивается ответом на вопрос "Почему вы делаете то, что вы делаете?"')]),v._v(" "),l("p",[v._v("Можно использовать любую технику приоретизации, которая вам нравится. Если у вас нет такой техники, вот три на выбор:")]),v._v(" "),l("ul",[l("li",[v._v("Прогрессивное вычеркивание - постепенно вычеркивайте то, от чего вы откажетесь не раздумывая, пункт за пунктом")]),v._v(" "),l("li",[v._v("Выбор - берем пункты попарно и выбираем один, потом берем ещё один пункт и выбираем снова")]),v._v(" "),l("li",[v._v("Категоризация - разместить пункты по категориям - критично, важно, желательно, опционально")])]),v._v(" "),l("hr"),v._v(" "),l("p",[v._v("Упражнение этого поста состоит в следующем:")]),v._v(" "),l("ol",{attrs:{start:"0"}},[l("li",[v._v("Выпишите ваши ценности в столбик, например:\n"),l("ul",[l("li",[v._v("комфорт")]),v._v(" "),l("li",[v._v("справедливость")]),v._v(" "),l("li",[v._v("автономия")]),v._v(" "),l("li",[v._v("причастность")]),v._v(" "),l("li",[v._v("статус")]),v._v(" "),l("li",[v._v("востребованность навыков")]),v._v(" "),l("li",[v._v("перспективы - надежность и определенность")]),v._v(" "),l("li",[v._v("прогрессирующие трудности")]),v._v(" "),l("li",[v._v("деньги")]),v._v(" "),l("li",[v._v("возможность свободно креативить и самовыражаться")]),v._v(" "),l("li",[v._v("компетентность коллег")])])]),v._v(" "),l("li",[v._v("Путем вычеркивания, выбора или категоризации, оставьте из них половину наиболее значимых")]),v._v(" "),l("li",[v._v("Внимательно изучите список и выберите три наиболее значимых. Взгляните ещё раз на график эмоций, который вы построили в прошлый раз. Что вызывало у вас самые положительные эмоции или самые отрицательные?")])]),v._v(" "),l("p",[v._v('Ещё один важный инструмент для само-определения - ранжирование. Любая ценность имеет свои "слишком мало" или "слишком много". Есть определенное количество и качество аспекта, при котором всё хорошо. Например, ваш приоритет - общение с людьми. Но если вам предложат работу где вам нужно общаться с 1 человеком в месяц или с сотней в день, это вам вряд ли подойдёт. Поэтому важно понимать приемлемый уровень - минимум и максимум.')]),v._v(" "),l("p",[v._v("Ранжировав свои top-3 ценности, вы можете выбирать более подходящую вам рабочую роль и задавать на собеседовании вопросы, которые помогут сделать правильный выбор, с большей вероятностью ведущий к успеху и позитивным эмоциям.")])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/assets/js/15.5ed643c9.js b/assets/js/15.5ed643c9.js new file mode 100644 index 0000000..bbbc298 --- /dev/null +++ b/assets/js/15.5ed643c9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{421:function(t,e,n){"use strict";n.r(e);var o=n(15),l=Object(o.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("Как мы здесь живем — великая тайна,")]),t._v(" "),n("p",[t._v("Все кричат «вира», а выходит «майна».")]),t._v(" "),n("p",[n("cite",[t._v("— (Б. Гребенщиков)")])])]),t._v(" "),n("p",[t._v("Выбирая новое место работы, вам наверняка хотелось бы чтобы ценности людей, которые будут вас окружать, делали ваше пребывание в компании продуктивным и приятным. То, в каких действиях выражаются ценности компании, очень сильно скажется на вашем опыте работы в ней.")]),t._v(" "),n("p",[t._v("Ценности компании как правило размещены на сайте. Но как узнать заранее, правда ли это, что это не просто набор красивых слов? После приема на работу задавать такие вопросы уже поздно, поэтому желательно поспрашивать о компании у знакомых. Поэтому первый способ - простой networking. Вопросы желательно задавать не прямые, а с использованием воображаемых ситуаций. Например, как поступил бы человек в ситуации когда нужно выбрать между качеством продукта и хорошим отзывом от клиента за своевременную поставку.")]),t._v(" "),n("p",[t._v("Вариант для более смелых - спросить у собеседующего - а как вы, персонально, проявляете ценности компании?")])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/16.01abde41.js b/assets/js/16.01abde41.js new file mode 100644 index 0000000..9e24046 --- /dev/null +++ b/assets/js/16.01abde41.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{422:function(t,e,s){"use strict";s.r(e);var n=s(15),l=Object(n.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("Блог мигрировал с Jekyll на Vuepress.")])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/17.bdd1dc39.js b/assets/js/17.bdd1dc39.js new file mode 100644 index 0000000..09142ba --- /dev/null +++ b/assets/js/17.bdd1dc39.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{423:function(e,t,r){"use strict";r.r(t);var n=r(15),v=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("Первые попытки резиновой, то есть, адаптирующейся к ширине экрана, верстки были аж в 2004-ом году, судя по "),r("a",{attrs:{href:"http://www.themaninblue.com/writing/perspective/2004/09/21/",target:"_blank",rel:"noopener noreferrer"}},[e._v("чудом сохранившейся статье в блоге Man in Blue"),r("OutboundLink")],1)]),e._v(" "),r("p",[e._v("Когда адаптивность стала входить в обиход (точкой отсчета принято считать "),r("a",{attrs:{href:"https://alistapart.com/article/responsive-web-design/",target:"_blank",rel:"noopener noreferrer"}},[e._v("эту статью Итана Маркотта"),r("OutboundLink")],1),e._v(", то есть 10 лет назад, мы использовали "),r("em",[e._v("%")]),e._v(" и "),r("em",[e._v("em")]),e._v(" в качестве единиц измерения для шрифтов и отступов. Чтобы увеличить или уменьшить шрифт, мы использовали "),r("em",[e._v("media queries")]),e._v(", которые позволяли задать "),r("em",[e._v("font-size")]),e._v(" для body, от которого зависят все размеры, указанные в em-ах.")]),e._v(" "),r("p",[e._v("Верстальщику всё время нужно было подбирать определенную величину, при которой блоки не наезжали друг на друга, текст не выпячивал за пределы блока, учитывать читаемость и компоновку элементов для четырёх размеров экранов как минимум.")]),e._v(" "),r("p",[e._v("Все современные браузеры поддерживают "),r("em",[e._v("vw")]),e._v(" и "),r("em",[e._v("vh")]),e._v(" в качестве величин, относительных высоте и ширине viewport-а (окна браузера). Если вы потянете за угол окна браузера прямо сейчас, вы сможете заметить, что заголовок страницы будет плавно уменьшаться, это потому что его размер шрифта указан в "),r("em",[e._v("vw")]),e._v(". Раньше это можно было сделать, указав размер в процентах, но эти проценты считались от ширины блока.")]),e._v(" "),r("p",[e._v("Чтобы текст не ужимался до нечитабельного состояния, можно указать минимальный размер через calc():")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",[r("code",[e._v("h1 {\n font-size: calc(1.3rem + 3.6vw);\n}\n")])])]),r("p",[e._v("Несмотря на то, что эта технология появилась 8 лет назад, вместе с CSS3 ("),r("a",{attrs:{href:"https://generatedcontent.org/post/21279324555/viewportunits",target:"_blank",rel:"noopener noreferrer"}},[e._v("одна из первых статей про vueport units"),r("OutboundLink")],1),e._v("), огромное число разработчиков до сих пор оперируют пикселями и, в лучшем случае, "),r("em",[e._v("em")]),e._v(". Оставим это на их совести и совести UX-специалистов, которые делают статичные макеты.")]),e._v(" "),r("p",[e._v("Почаще заходите сюда, и на "),r("a",{attrs:{href:"https://caniuse.com/viewport-units",target:"_blank",rel:"noopener noreferrer"}},[e._v("Can I Use"),r("OutboundLink")],1),e._v(", и здесь и там очень много полезной и актуальной информации.")]),e._v(" "),r("p",[e._v("Да, читайте, пожалуйста, "),r("a",{attrs:{href:"https://www.w3.org/TR/css3-values/#viewport-relative-lengths",target:"_blank",rel:"noopener noreferrer"}},[e._v("спецификацию"),r("OutboundLink")],1),e._v("!")])])}),[],!1,null,null,null);t.default=v.exports}}]); \ No newline at end of file diff --git a/assets/js/18.2c0a35da.js b/assets/js/18.2c0a35da.js new file mode 100644 index 0000000..fd578c2 --- /dev/null +++ b/assets/js/18.2c0a35da.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{424:function(t,e,n){"use strict";n.r(e);var v=n(15),_=Object(v.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("В самом чувстве сопротивления нет ничего хорошего или плохого (привет оценочному суждению). Это механизм защиты от неблагоприятных внешних факторов. Всё ради того чтобы сохранить привычный образ жизни и deal with вторжениями и террором.")]),t._v(" "),n("p",[t._v('Если человек может сказать "Нет, я против!" это воспринимается нормальным, человек хорошо понимает свои границы и отстаивает свои интересы. Но бывают ситуации, когда неблагоприятные факторы отсутствуют, а сопротивление чувствуется.')]),t._v(" "),n("p",[t._v("Сопротивление возникает при попытках выбраться из состояния стагнации, гомеостаза, привычного образа жизни. Даже если этот образ жизни деструктивен и наполнен негативными переживаниями. Так уж устроена психика.")]),t._v(" "),n("p",[t._v('Многим известен принцип психологического айкидо - сначала согласитесь с оппонентом, а потом выскажите свою точку зрения. Но здесь есть пара нюансов - если вы согласны только на словах, оппонент все равно чувствует ваше сопротивление в голосе, интонациях. Второй момент - за психологическим айкидо часто скрывается неумение говорить "нет" когда это действительно нужно.')]),t._v(" "),n("p",[t._v("В восточных боевых искусствах устойчивость достигается через мягкость. При столкновении тело сначала резко наполняется силой, а потом моментально становится как бы прозрачным. Мягкость обескураживает ожидающего сопротивление противника, как и внезапная техничная резкость. Расслабленную руку гораздо проще убрать из захвата.")]),t._v(" "),n("p",[t._v("Существуют разные подходы к преодолению сопротивления. Я писал эту статью почти три дня. Очень много чувства сопротивления у меня возникло, болела голова, появлялись более важные дела. Это новая для меня тема, я в ней вообще не разбираюсь, что обо мне скажут знающие люди? Страх оценки, я могу выглядеть глупо. Или страх перед тем, что в результате самоанализа я откопаю что-то страшное. Возникает реальное сопротивление перед воображаемой ситуацией в будущем.")]),t._v(" "),n("p",[t._v("Все входят в холодную реку по-разному, я - постепенно, а кто-то представляет себя берсерком и идёт напролом. А кто-то вообще не заходит, предпочитая игру в поддавки. А у кого-то холодная река вообще не вызывает сопротивления.")])])}),[],!1,null,null,null);e.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/19.5687852f.js b/assets/js/19.5687852f.js new file mode 100644 index 0000000..78cb94f --- /dev/null +++ b/assets/js/19.5687852f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{425:function(e,r,t){"use strict";t.r(r);var o=t(15),a=Object(o.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Это больно. Это неприятно. Это может довести до отчаяния.")]),e._v(" "),t("p",[e._v("Упражнение от даосских мастеров на проработку всего позвоночника:")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/2Zf8GKCo_jw",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),e._v(" "),t("p",[e._v("Комплекс для укрепления и растяжки всего позвоночника (выглядит страшно, но я делаю, хорошо помогает):")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/Odr05xnYxU0",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),e._v(" "),t("p",[e._v("Правильная растяжка для здоровья колена:")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/jseATxkZIHs",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),e._v(" "),t("p",[e._v("Упражнение для суставов колена:")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/BEB254DCyf0",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),e._v(" "),t("p",[e._v("Акупунктура колена:")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/yXw0_dGsTh4",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),e._v(" "),t("p",[e._v("Укрепление связок колена:")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/YlGXEE126ac",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),e._v(" "),t("p",[e._v("Массаж и тейпирование колена:")]),e._v(" "),t("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/JSS-aNKvGoE",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})])}),[],!1,null,null,null);r.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/20.a18014b6.js b/assets/js/20.a18014b6.js new file mode 100644 index 0000000..32bb797 --- /dev/null +++ b/assets/js/20.a18014b6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{426:function(v,_,l){"use strict";l.r(_);var i=l(15),t=Object(i.a)({},(function(){var v=this,_=v.$createElement,l=v._self._c||_;return l("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[l("p",[v._v("В конфликты попадают так или иначе все, но все мы по-разному из них выходим.")]),v._v(" "),l("p",[v._v("Под конфликтом я понимаю состояние ситуации, когда есть два субъекта и есть их отношение по поводу какого-либо объекта, приправленное негативными эмоциями друг к другу с обеих сторон. Ссора от конфликта отличается отсутствием объекта. Кроме межличностного конфликт также бывает внутриличностным, суть та же.")]),v._v(" "),l("p",[v._v("Можно выделить несколько путей выхода из конфликта")]),v._v(" "),l("ul",[l("li",[v._v("избегание,")]),v._v(" "),l("li",[v._v("пассивный,")]),v._v(" "),l("li",[v._v("агрессивный,")]),v._v(" "),l("li",[v._v("компромисс,")]),v._v(" "),l("li",[v._v("сотрудничество.")])]),v._v(" "),l("p",[v._v("Оптимальным считается выход на сотрудничество, но мало кто объясняет как это сделать, мол, разбирайтесь сами, вот вам апельсин.")]),v._v(" "),l("p",[v._v('Похожий на правду ответ я нашёл для себя в книге Даниеля Шапиро "Negotiating Nonnegotiable". Чтобы "излечить" конфликт, он говорит, нужно смотреть на "трансцедентальную общность", на что-то что объединяет всё сущее, это поможет подняться над своим эго и племенной идентичностью, и создать контакт с другим человеком. Если вас задевают слова или поступки другого человека, перепалка кажется иногда единственным вариантом отстоять свою идентичность. Ваш оппонент думает так же.')]),v._v(" "),l("p",[v._v("Ещё мне нравится концепция территорий. Они могут быть не только физическими - например, заняли ваш стул или место на паркове, чем вызвали бурный негатив, но и ментальными - вас оскорбили прилюдно, а с вами так нельзя, вы и покалечить случайно можете.")]),v._v(" "),l("p",[v._v("Чтобы избегать подобных ситуаций, можно, конечно, накачаться, ходить на тренировки по боевым искусствам, но это тоже не спасает от неадекватных людей.")]),v._v(" "),l("p",[v._v("Как вариант, имеет смысл завести привычку на каждый контакт ставить цель, не жёстко, конечно, по ходу контакта всё может измениться, но в целом, иметь цель на каждую коммуникацию желательно.")]),v._v(" "),l("p",[v._v("Хорошая цель коммуникации:")]),v._v(" "),l("ul",[l("li",[v._v("экологична (win-win),")]),v._v(" "),l("li",[v._v("измерима и доказуема,")]),v._v(" "),l("li",[v._v("достижима участниками,")]),v._v(" "),l("li",[v._v('выражена позитивным языком (без "не" и "без"),')]),v._v(" "),l("li",[v._v("ранжирована (не меньше чем, но и не больше чем, где-то между)")])]),v._v(" "),l("p",[v._v("Типы целей могут быть:")]),v._v(" "),l("ul",[l("li",[v._v("получение информации")]),v._v(" "),l("li",[v._v("изменение эмоционального состояния")]),v._v(" "),l("li",[v._v("принятие решения")]),v._v(" "),l("li",[v._v("действие")])]),v._v(" "),l("p",[v._v("Внутриличностные конфликты (неврозы) можно решать точно так же. Поставить на стол две куклы-фигуры, положить между ними объект конфликта и, целенаправленно, вербализировать внутренний диалог.")]),v._v(" "),l("p",[v._v("Звучит странно, выглядит тоже, но это бездонный источник лулзов и открытий.")])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/assets/js/21.cbd3109a.js b/assets/js/21.cbd3109a.js new file mode 100644 index 0000000..f363f6a --- /dev/null +++ b/assets/js/21.cbd3109a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{427:function(v,_,l){"use strict";l.r(_);var t=l(15),i=Object(t.a)({},(function(){var v=this,_=v.$createElement,l=v._self._c||_;return l("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[l("p",[v._v('Архетипы как психологическое понятие введено в прошлом веке Карлом Густавом Юнгом для обозначения структурного элемента коллективного бессознательного – захватывающие "изначальные" образы, которые притягивают к себе максимальное количество психической энергии и заставляют эго служить им.')]),v._v(" "),l("p",[v._v('Классификация опросника PMAI® (Pearson-Marr Archetype Indicator®), основанного на мифологии "путешествия героя" содержит в себе следующие образы (и их потребности), сгруппированные по базовому желанию:')]),v._v(" "),l("p",[v._v("Структурирование мира:")]),v._v(" "),l("ul",[l("li",[v._v("Опекун - комфорт")]),v._v(" "),l("li",[v._v("Правитель - ценности")]),v._v(" "),l("li",[v._v("Творец - новаторство")])]),v._v(" "),l("p",[v._v("Духовный путь (дорога в рай):")]),v._v(" "),l("ul",[l("li",[v._v("Невинный - безопасность")]),v._v(" "),l("li",[v._v("Мудрец - ясность")]),v._v(" "),l("li",[v._v("Искатель - свобода")])]),v._v(" "),l("p",[v._v("Оставить след:")]),v._v(" "),l("ul",[l("li",[v._v("Бунтарь - кризис")]),v._v(" "),l("li",[v._v("Маг - поведение")]),v._v(" "),l("li",[v._v("Воин - мастерство")])]),v._v(" "),l("p",[v._v("Контакт с другими:")]),v._v(" "),l("ul",[l("li",[v._v("Сирота (славный малый) - принадлежность")]),v._v(" "),l("li",[v._v("Любовник - близость")]),v._v(" "),l("li",[v._v("Шут - удовольствие")])]),v._v(" "),l("p",[v._v("Идеи архетипов в наше время активно используют многие публичные компании при формировании бренда (опять же, репутации). Обратите внимание на то, какие славные малые работают в ИКЕА и как заботится о вас Nivea.")]),v._v(" "),l("p",[v._v("С понятием архетипов у меня ассоциируется понятие репутации.")]),v._v(" "),l("p",[v._v("Если вы обнаружили в себе несколько архетипов - это нормально, они все присутствуют в каждом из нас. Идея в том, чтобы не распылять психическую энергию, а выявить доминирующий и уделять ему больше внимания. Чем он более выражен, тем сильнее вы притягиваете к себе внимание людей с этим невыраженным архетипом. Наверное, это можно назвать харизмой.")]),v._v(" "),l("p",[v._v("Помимо образных архетипов, Юнг ввёл также понятия Анима и Анимус для обозначения гендерных архетипов (да, они оба тоже присутствуют во всех).")]),v._v(" "),l("blockquote",[l("p",[v._v('Если бы мне нужно было одним словом обозначить то, в чем состоит различие между мужчиной и женщиной в этом отношении, и, таким образом, то, что характеризует анимус в отличии от анимы, то я мог бы сказать только одно: если анима производит настроения, то анимус — мнения, и как настроения мужчины появляются на свет из темных глубин, так и мнения женщин основываются на столь же бессознательных, априорных предпосылках.\n- Карл Густав Юнг, "Анима и Анимус"')])]),v._v(" "),l("p",[v._v('Юнг также указывает на множественность Анимуса (судебная коллегия) и единичность Анимы, это связано, по его мнению, с особенностями мировосприятия. Для Анимы мир состоит из их близких и таких же конгламератов, замкнутых, как правило, на себе. Для Анимуса мир это народ, "государство". Во снах образ Анимы связан с образом какой-либо из богинь, образ Анимуса это летучие голландцы, всегда неопределенно-неуловимые.')])])}),[],!1,null,null,null);_.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/22.0097bfaa.js b/assets/js/22.0097bfaa.js new file mode 100644 index 0000000..1405a43 --- /dev/null +++ b/assets/js/22.0097bfaa.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{430:function(a,t,v){"use strict";v.r(t);var s=v(15),_=Object(s.a)({},(function(){var a=this,t=a.$createElement,v=a._self._c||t;return v("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[v("p",[a._v("Я начал работать из дома после 10 лет работы в офисе. Задолго до того как это стало мэйнстримом, в 2018 году я перешёл на удалёнку full-time, прекрасно понимая с какими трудностями мне придётся столкнуться, но это был скорее вынужденный шаг, чем моё осознанное решение. А поскольку с такими проблемами столкнулись многие, и это растянулось на долгие месяцы, делюсь своим двухлетним опытом.")]),a._v(" "),v("h2",{attrs:{id:"work-life-ballance"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#work-life-ballance"}},[a._v("#")]),a._v(" Work/life ballance")]),a._v(" "),v("p",[a._v('"Работа из дома это когда время 9 вечера, а ты всё ещё на работе" - сказал один мой коллега. Я, как трудоголик, вообще не понимаю этой проблемы - работа это большая часть жизни. Но есть проблема перенапряжения, и тут как в качалке - если мышщу не расслаблять, она не накачается. Длительное напряжение со временем становится нормой и может привести к болезням. Важно уметь расслабляться. Да, для этого нужно время, но оно воздастся. Просто сядьте или встаньте в удобную позу, потяните макушку вверх, копчик вниз, почувствуйте где напряжено и спокойно дайте команду этому месту расслабиться, и так до тех пор пока не наступит состояние, в котором комфортно находиться часами. Есть много техник - випассана для пассивных, йога для активных, цигун для ленивых - выбирайте на свой вкус. Лишь бы нравилось. Китайский мастер тайцзи Ван Лин говорил на семинаре - если не нравиться, зачем заниматься?')]),a._v(" "),v("h2",{attrs:{id:"отсутствие-взаимопонимания-и-поддержки"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#отсутствие-взаимопонимания-и-поддержки"}},[a._v("#")]),a._v(" Отсутствие взаимопонимания и поддержки")]),a._v(" "),v("p",[a._v('В этом основная сложность работы в изоляции. В офисе светская беседа (small talk) происходит автоматически, тогда как онлайн общение часто начинается "сразу к делу".\nВыделенный уютный чатик для чаепитий и созвонов на поболтать на полчаса отчасти закрывают эту потребность, но трудоголикам желательно иметь близкий круг людей, с которыми невозможно говорить о работе. И да, small talk не возникает сам по себе, его инициируют. Будьте проактивны.')]),a._v(" "),v("h2",{attrs:{id:"работа-с-документами"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#работа-с-документами"}},[a._v("#")]),a._v(" Работа с документами")]),a._v(" "),v("p",[a._v("У меня это 3-4 письма в год, в основном заявления на отпуск и приказы о премиях. Струйный принтер стоит недорого, а помощь соседям, которым нужно распечатать (раз в месяц нужно прогревать чернила, иначе сопла сохнут) - очень ценный нетворкинг. Желательно запасаться впрок конвертами, бланками и наличкой чтобы было чуть более комфортно. Адреса можно распечатать на том же принтере, но я предпочитаю писать от руки, иначе навык атрофируется.")]),a._v(" "),v("h2",{attrs:{id:"уборка"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#уборка"}},[a._v("#")]),a._v(" Уборка")]),a._v(" "),v("p",[a._v('Мытьё посуды, полов, ремонт - обо всём этом не думаешь в офисе, это за тебя делают другие. Посудомойка лучшее изобретение человечества. Мытьё полов я делаю как тренировку - можно тянуть широчайшие мышцы спины и заднюю часть бедра. Ремонт - это работа над soft-skills - общение с людьми разных уровней требует особых навыков коммуникации. Книга "Лидер и Племя" и групповые тренировки по боевым искусствам очень мне в этом помогли.')]),a._v(" "),v("h2",{attrs:{id:"готовка"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#готовка"}},[a._v("#")]),a._v(" Готовка")]),a._v(" "),v("p",[a._v('Рекомендую книгу "Очаровательный кишечник", она покрывает многие вопросы питания. Доставка - лучшие друзья, я обычно заказываю не фаст-фуд, а обычную, "рустикальную" еду - плов, суп, салат.')]),a._v(" "),v("p",[a._v("Если у вас 3-4 созвона в день, забейте место в календаре под обед.")]),a._v(" "),v("p",[a._v("В СПб и Москве есть Яндекс.Шеф, это бывшая Партия еды, а это 7 пакетов с продуктами и рецептами на неделю. Готовка не должна занимать больше получаса. В качестве быстрого перекуса у меня всегда есть яблоки и бананы и несколько простых рецептов, для которых всегда припасена нужная бакалея:")]),a._v(" "),v("ul",[v("li",[a._v("Помидоры, отруби, майонез")]),a._v(" "),v("li",[a._v("Паста с песто")]),a._v(" "),v("li",[a._v("Быстрорастворимые супы из экомаркета")]),a._v(" "),v("li",[a._v("Творог с ягодами")])]),a._v(" "),v("h2",{attrs:{id:"отвлекающие-факторы"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#отвлекающие-факторы"}},[a._v("#")]),a._v(" Отвлекающие факторы")]),a._v(" "),v("p",[a._v("Дети, перфоратор, дела по ремонту, жена - решаются очень легко - берём рабочий ноутбук и без сомнений снимаем квартиру чисто для работы. Это никак больше не решается. В коворкингах, даже в специальных тихих комнатах (читай, все на созвонах) тоже бывает шумно.")]),a._v(" "),v("h2",{attrs:{id:"зависимости"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#зависимости"}},[a._v("#")]),a._v(" Зависимости")]),a._v(" "),v("p",[a._v("Игры, порно, алкоголь, табак и тд - возникают как компенсация отсутствия желаемого. В изоляции зависимости усиливаются, поскольку нет ограничивающих факторов. Решается обычной психотерапией, но должно быть желание. В целом, лечение любых аддикций сводится к их замене на конструктивные. Мой вариант - трудоголизм и цигун. Кто-то сидит годами на антидепрессантах или анонимных группах. Всё это вполне рабочие варианты.")]),a._v(" "),v("h2",{attrs:{id:"быть-всегда-на-связи"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#быть-всегда-на-связи"}},[a._v("#")]),a._v(" Быть всегда на связи")]),a._v(" "),v("p",[a._v("Достаточно держать связь с членами команды, понимать кто что делает в этот день и включить все оповещения в основном инструменте связи. Остальные каналы - скайп, телефон, почта - достаточно проверять два раза в день. Никто не ожидает что вы будете отвечать моментально, потребность постоянно проверять не пришло ли чего-нибудь очень выматывает. Достаточно быть онлайн и отвечать на все сообщения день в день, или на следующий день.")]),a._v(" "),v("h2",{attrs:{id:"непрозрачность"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#непрозрачность"}},[a._v("#")]),a._v(" Непрозрачность")]),a._v(" "),v("p",[a._v("Вас никто не видит и не знает что конкретно вы делаете и в каком настроении в течение дня. Что и какими интонациями вы говорите на созвонах влияет на ваш имидж и отношение к вам. Умение создать раппорт через подстраивание под ценности и репрезентативную систему может помочь быть более понятным и доступным. А открытое выражение своих чувств и эмоций по поводу сказанного - приветствуется.")]),a._v(" "),v("h2",{attrs:{id:"тревожность"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#тревожность"}},[a._v("#")]),a._v(" Тревожность")]),a._v(" "),v("p",[a._v("Я заметил это у себя в голосе когда пересматривал свой вебинар и у многих других начинающих удалёнщиков. Человек, говорящий из офиса, или привыкший к частым онлайн-переговорам звучит иначе, более уверенно, он в роли. Играть роль, говоря в пустоту бывает сложно. Поэтому важно сначала выслушать других людей, понять цель диалога, с кем вы говорите, и потом вам будет проще наладить уверенное общение.")]),a._v(" "),v("p",[a._v("А главное, никогда не ленитесь заниматься физкультурой, есть, спать и чистить зубы, это влияет на стрессоустойчивость.")]),a._v(" "),v("h2",{attrs:{id:"экзистенциальщина"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#экзистенциальщина"}},[a._v("#")]),a._v(" Экзистенциальщина")]),a._v(" "),v("p",[a._v("Под этим понимается спектр эмоций, связанных с бессмысленностью бытия. Чувствуется как некая дыра, пустота, бездна, которая затягивает. Просто не смотрите туда, вы не найдёте там смысла. Зачем искать смысл в бессмыссленности?) Просто отвернитесь от неё. Загрузитесь рутинами.")]),a._v(" "),v("h2",{attrs:{id:"депрессия"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#депрессия"}},[a._v("#")]),a._v(" Депрессия")]),a._v(" "),v("p",[a._v("Ощущается другими людьми как подавленность, апатичность, вялость. Изнутри не чувствуется, видно только снижение продуктивности. Депрессия возникает от большого расхода ресурсов на сдерживание огромного количества подавленных, вытесненных эмоций. Чаще всего это гнев и злость, как затабуированные социумом выражения агрессии и недовольства. В некоторых социальных средах не принято даже жаловаться. Решение - создать окружение, в котором можно открыто выражать свои чувства, например, психологические группы, где ценна группа сама по себе, но отдельные члены, если вы, конечно, не социофоб, не несут большой значимости и поэтому злость можно выражать открыто.")]),a._v(" "),v("p",[a._v("Не бойтесь кому-нибудь навредить. Если вам кажется, что внутри вас зверь, это не так, вы его настолько подавили, что там мышка. Попробуйте-ка порычать. Открытое выражение гнева чаще всего самый простой способ выхода из депрессии. К тому же, вы же работаете из дома, можете себе позволить накричать на стену. Просто за то, что она такая вот. Под песни Nirvana или The Hustle Standard.")])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/23.801b5ae1.js b/assets/js/23.801b5ae1.js new file mode 100644 index 0000000..9cf0aba --- /dev/null +++ b/assets/js/23.801b5ae1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{428:function(_,v,t){"use strict";t.r(v);var e=t(15),r=Object(e.a)({},(function(){var _=this,v=_.$createElement,t=_._self._c||v;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("p",[_._v("Эмпатия это осознанное сопереживание другому человеку без потери ощущения источника этого переживания.")]),_._v(" "),t("p",[_._v("Если источник переживания не осознаётся, это называется слиянием, отождествлением себя с другим. Моих чувств нет, есть только чувства другого человека.")]),_._v(" "),t("p",[_._v("Эмпатия является важным профессиональным навыком специалистов, работающих с людьми. Развить эмпатию может любой, кроме людей с нарциссическими и психопатическими расстройствами, но им это и не нужно, ибо восприятие другого как субъекта для них просто невозможно.")]),_._v(" "),t("p",[_._v('Человек, способный к эмпатии, воспринимается как человек, смотрящий "прямо в душу", "он меня видит", что иногда воспринимается сначала с опасением неблагоприятной реакции на переживания. Но эмпатичные люди, как правило, понимают и соблюдают границы.')]),_._v(" "),t("p",[_._v('Эмпатическое слушание, или активное слушание позволяет точно понять эмоциональное состояние собеседника, один мой знакомый психотерапевт шутя утверждает, что он зарабатывает исключительно произнося фразы "Ага", "Угу", "Продолжайте", "Так-так", "Ммм", "Хм..." в правильных интонациях, но, увы, это лишь "первая психологическая помощь", вопреки мифам, этого недостаточно чтобы быть профессиональным психологом.')]),_._v(" "),t("p",[_._v("Автор развивает эмпатию слушая музыку. Любая музыка это выражение эмоции, песня богата интонациями, которые можно услышать и в речи. Можно закрыть глаза и представить себе театр, где каждая партия - это персонаж со своей индивидуальностью и отношениями с другими. Мелодия как правило построена по тем же принципам, что и пьеса, и любая другая лирика. Пролог, завязка, развитие действия, кульминация, завязка, эпилог. Кульминаций может быть несколько, каждая со своей завязкой, ведущей к следующему моменту наивысшего напряжения.")]),_._v(" "),t("p",[_._v("Сольфеджио, столь непонятное мне в детстве, в зрелости лет заиграло новыми красками. Все знают что минорный аккорд звучит печально, а мажорный - радостно. Но можно построить последовательность минорных аккордов так, что она зазвучит с надеждой, напряжением, благородством. Кварто-квинтовый круг можно изучать бесконечно.")]),_._v(" "),t("p",[_._v("Сложности возникают с называнием переживаний, это приходит только с опытом и определенным образованием в этой области. Хорошо помогает изучение "),t("a",{attrs:{href:"http://urokikino.ru/emotion_theory_1/",target:"_blank",rel:"noopener noreferrer"}},[_._v("цветка эмоций Роберта Плутчика и различных списков эмоций"),t("OutboundLink")],1)]),_._v(" "),t("p",[_._v("Самое сложное в общении, обычно, слушать и слышать, а не ждать очереди высказаться.")]),_._v(" "),t("p",[_._v('Поделюсь с вами одной историей с хорошим таким панчем в конце. Эндрю Скотт, сыгравший Мориарти в сериале BBC "Шерлок" из отвратительного психованного злодея вдруг стал секс-символом всей Великобритании благодаря роли священника в сериале "Дрянь". Так почему актёр-гей, сыгравший священника-алкоголика с темным прошлым стал "hot priest"?')]),_._v(" "),t("p",[_._v("В передаче Saturday Night Live автор и главная героиня сериала Уоллер-Бридж призналась, что они с Эндрю долго пытались понять, в чем секрет успеха его героя. Но в итоге разгадка оказалась совсем легкой — он просто умеет слушать.")]),_._v(" "),t("p",[_._v("Примерно такой же посыл у британского многосерийного фильма Казанова 2005 года.")]),_._v(" "),t("p",[_._v("Психологи и психотерапевты используют следующие техники активного слушания для поддержания фокуса внимании на клиенте и развития беседы, когда повисла тишина:")]),_._v(" "),t("ul",[t("li",[_._v("Пауза (прежде чем что-то ответить, сделайте два-три вдоха и выдоха)")]),_._v(" "),t("li",[_._v("Уточнение (если что-то непонятно, не нужно делать вид что вы поняли, переспросите)")]),_._v(" "),t("li",[_._v("Парафраз - обобщите сказанное своими словами")]),_._v(" "),t("li",[_._v("Развитие мысли - скажите какие ассоциации приходят по поводу сказанного")]),_._v(" "),t("li",[_._v("Сообщение о своих чувствах или возможных чувствах собеседника")]),_._v(" "),t("li",[_._v('Замечания о контексте беседы, например, "похоже, мы зашли в тупик" или, мой любимый вопрос "как вам кажется, что сейчас происходит?"')])])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/24.0b5f153b.js b/assets/js/24.0b5f153b.js new file mode 100644 index 0000000..2f703fc --- /dev/null +++ b/assets/js/24.0b5f153b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{429:function(v,_,l){"use strict";l.r(_);var t=l(15),i=Object(t.a)({},(function(){var v=this,_=v.$createElement,l=v._self._c||_;return l("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[l("p",[v._v("Травля - это агрессивное преследование одного из членов коллектива. У взрослых, в рабочей среде, это называется моббинг. Как явление обозначено в 80-х годах прошлого века.")]),v._v(" "),l("p",[v._v('Моббинг как правило имеет форму морального давления. Тонкие оскорбления, угрозы, физическая агрессия (доминирующая поза, пристальный взгляд), постоянная негативная оценка жертвы и её деятельности, "газлайтинг" (с тобой что-то не так), отказ в доверии, делегировании полномочий - всё это можно расценивать как проявления травли.')]),v._v(" "),l("p",[v._v('Всех жертв травли объединяет одна черта: чаще всего объектами издевательств становятся дети и подростки, обладающие повышенной чувствительностью, показывающие свою "слабость" (страх, обиду или злость). Их реакция соответствует ожиданиям агрессоров, рождая искомое ощущение превосходства.')]),v._v(" "),l("p",[v._v("Важно помнить что травля не имеет смысла для агрессора если нет молчаливых свидетелей.")]),v._v(" "),l("p",[v._v("Причины моббинга у взрослых:")]),v._v(" "),l("ul",[l("li",[v._v("желание подчинить")]),v._v(" "),l("li",[v._v("желание возвыситься")]),v._v(" "),l("li",[v._v("но чаще всего - зависть к более удачливому и успешному коллеге")])]),v._v(" "),l("p",[v._v("Кстати, иногда такое давление в коллективе, особенно новом - временное явление, проба на зуб. Теория формирования команд гласит что есть четыре фазы")]),v._v(" "),l("ul",[l("li",[v._v("forming")]),v._v(" "),l("li",[v._v("storming")]),v._v(" "),l("li",[v._v("norming")]),v._v(" "),l("li",[v._v("performing")])]),v._v(" "),l("p",[v._v("Но мало кто знает, что фазу пертурбаций можно разделить ещё на две - в первой люди притираются друг с другом, наводят мосты, выясняют кто есть кто, лидер в это время остаётся как бы в тени.")]),v._v(" "),l("p",[v._v("Во второй фазе команда обращает внимание на лидера и начинаются проверки и нападки на него. Это может выглядеть как травля, но при правильном поведении это быстро сходит на нет.")]),v._v(" "),l("p",[v._v("Есть два основных способа предотвращения травли, буллинга, моббинга, включая такие явления как рэкет и шантаж:")]),v._v(" "),l("ul",[l("li",[v._v("не показывайте что это как-то на вас влияет, изобразите уверенное спокойствие. Без психологического эффекта мотивация агрессоров падает, а вы становитесь для них обычным свидетелем")]),v._v(" "),l("li",[v._v("для смелых и находчивых - дискредитируйте лидера агрессоров, таким образом вы встанете на роль антилидера и, вступив в открытый конфликт, вы сможете выйти из ситуации уже не пассивной жертвой, а может быть даже в сотрудничество.")])])])}),[],!1,null,null,null);_.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/25.b6545389.js b/assets/js/25.b6545389.js new file mode 100644 index 0000000..d755f63 --- /dev/null +++ b/assets/js/25.b6545389.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{431:function(t,n,a){"use strict";a.r(n);var s=a(15),e=Object(s.a)({},(function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Да, наконец-то техническая статья 😃")]),t._v(" "),a("p",[t._v("Резолверы это ядро языка запросов, о котором пойдёт речь.")]),t._v(" "),a("p",[t._v("Сначала пара слов о том, что такое GraphQL и зачем он понадобился.")]),t._v(" "),a("p",[t._v("Когда микросервисы вошли в обиход любого мало-мальски серьезного проекта, собирать данные на клиенте - делая несколько запросов - стало большой болью фронтенд-разработчиков. Несмотря на то, что мы уже активно пользуемся null-safe navigation operator (?.) для предотвращения падений из-за отсутствия каких-либо данных, приходящая с сервера модель может отличаться от контрактной, да и собирать запросы в кучу через Promise.all или RxJS тоже требует особого образования и мышления.")]),t._v(" "),a("p",[t._v("Сначала мы ввели понятие BFF (Backend-for-Frontend) и его разновидность Backend-in-the-Frontend. Суть в том, чтобы агрегировать запросы в модели данных, необходимые клиенту, но в случае REST API, запросы все-равно имели место быть неудобными и деревянными. И нужно было пилить собственный json-schema валидатор чтобы быть уверенным что данные соответствуют контракту.")]),t._v(" "),a("p",[t._v("GraphQL решает эту задачу наилучшим образом, позволяя клиенту делать запросы вида:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("query Category {\n category(id:12) {\n products(limit:3) {\n name\n price\n photoUrl\n }\n subCategories {\n name\n photoUrl\n }\n }\n}\n")])])]),a("p",[t._v("Запрос при этом проходит три фазы:")]),t._v(" "),a("ol",[a("li",[t._v("построение абстрактного синтаксического дерева (AST)")]),t._v(" "),a("li",[t._v("валидация AST на соответствие каталогу типов (schema)")]),t._v(" "),a("li",[t._v("исполнение резолверов полей для формирования результата в JSON-формате (автору JSON нравится когда это произносят с французским прононсом)")])]),t._v(" "),a("p",[t._v("Резолверы работают следующим образом:")]),t._v(" "),a("ul",[a("li",[t._v("запросы на одном уровне дерева исполняются в параллели")]),t._v(" "),a("li",[t._v('если запрос асинхронный, его потомки ждут пока он "зарезолвится"')]),t._v(" "),a("li",[t._v("поскольку запросы выполняются в параллели, лучше всего если они атомарны, идемпотентны (один и тот же запрос приводит к одинаковым результатам) и без сайд-эффектов (нетоксичными 😃)")])]),t._v(" "),a("p",[t._v("Сигнатура метода резолвера проста:")]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fieldName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("parent"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" info")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("p",[t._v("Где,")]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("parent —")]),t._v(" данные родительского резолвера,")]),t._v(" "),a("li",[a("strong",[t._v("args —")]),t._v(" параметры, переданные в query,")]),t._v(" "),a("li",[a("strong",[t._v("context —")]),t._v(" объект, который предоставлен всем резолвером, который можно менять (но не стоит), он чистится между запросами, в нём принято хранить данные аутентификации и авторизации, модели, фетчеры, данные запросов. Не стоит использовать его для кеширования")]),t._v(" "),a("li",[a("strong",[t._v("info —")]),t._v(" редко используемый объект, специфичная информация для поля")])]),t._v(" "),a("p",[t._v("Необязательно создавать резолвер на каждое поле, достаточно указать корневой, остальные подставятся сами.")]),t._v(" "),a("p",[t._v("Несмотря на очевидное преимущество перед REST API в удобстве использования, GraphQL имеет несколько недостатков.")]),t._v(" "),a("p",[t._v("GraphQL не даёт делать рекурсивные запросы (надеюсь, не нужно объяснять почему, это скорее фича, а не баг), каждое вложенное поле нужно описывать явно, ограничивая дерево запросов.")]),t._v(" "),a("p",[t._v('В случае когда корень дерева содержит множество элементов, и вы запрашиваете поле внутри каждого из них, которое тоже является отдельным запросом, вы рискуете сделать сотни запросов. Это называется проблемой N+1. Проще говоря, это проблема "batch" запросов.Каждый случай индивидуален, но для решения вполне можно использовать context для кеширования промежуточных данных.')]),t._v(" "),a("p",[t._v("Источник вдохновения:\nhttps://medium.com/paypal-engineering/graphql-resolvers-best-practices-cd36fdbcef55")])])}),[],!1,null,null,null);n.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/26.8178c0ae.js b/assets/js/26.8178c0ae.js new file mode 100644 index 0000000..4683bde --- /dev/null +++ b/assets/js/26.8178c0ae.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{432:function(e,t,a){"use strict";a.r(t);var n=a(15),r=Object(n.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[e._v("Critical Rendering Path это последовательность шагов по превращению браузером HTML, CSS и JavaScript в пиксели на экране.")]),e._v(" "),a("p",[e._v("Итак, браузер получает на обработку HTML-файл. Парсер проходит его байт за байтом и вычленяет токены (самые главные - startTag, endTag), потом из набора токенов строятся ноды, а из иерархии нод получается Document Object Model (DOM) на основе информации о последовательности токенов. В DOM содержится весь контент страницы.")]),e._v(" "),a("p",[e._v("Когда парсер находит токены запросов внешних ресурсов (стилей, картинок, скриптов), он их запрашивает, но от 4 до 7 за раз в зависимости от браузера. Некоторые запросы блокируют парсинг, некоторые могут идти в параллели.")]),e._v(" "),a("p",[e._v("Когда парсер видит токен стилей, он начинает строить CSS Object Model (CSSOM). Оно строится очень быстро, поэтому оптимизация CSS-селекторов не даёт большого прироста к производительности, а минификация и отложенный запрос второстепенных стилей - даёт. Когда DOM и CSSOM готовы, начинается создание Render Tree.")]),e._v(" "),a("p",[e._v("Render Tree содержит в себе весь контент и его стилизацию. Кроме явно скрытых (display:none) элементов.")]),e._v(" "),a("p",[e._v("Эти три фазы, как правило,происходят один раз, но возможны ситуации когда свежезагруженный скрипт основательно меняет DOM (размеры элементов, отступы), тогда этот процесс происходит заново.")]),e._v(" "),a("p",[e._v("На основе Render Tree строится Layout - расположение элементов друг относительно друга и размеры блоков на основе их содержимого. Нужно помнить, что изменение размеров окна браузера, поворот смартфона, а и иногда и обычный запрос из скрипта расстояния между элементами может привести к пересчёту всего Layout. Чем больше DOM, тем больше занимает время пересчёт Layout (reflow). В это время страница не может реагировать на действия пользователя. Желательно что бы reflow занимал максимум 10 миллисекунд чтобы добиться 60 кадров в секунду.")]),e._v(" "),a("p",[e._v('Следующий шаг - Paint. Обычно он не доставляет хлопот в оптимизации, он просто растеризует (превращает в пиксели с помощью GPU) то, что насчиталось в Layout. Paint происходит в несколько слоёв в зависимости от позиционирования элементов. Проблемы с ним бывают при работе со сложной анимацией в canvas, они решаются отрисовкой в памяти, "за экраном" с помощью OffScreenCanvas или WebWorker-ов.')]),e._v(" "),a("p",[e._v("Поскольку отрисовка многослойная, мы получаем возможность двигать элементы не вызывая Paint снова. Пока только два стиля - opacity и transition - работают на этом этапе. Указать парсеру что элемент будет двигаться можно заранее с помощью")]),e._v(" "),a("div",{staticClass:"language-css extra-class"},[a("pre",{pre:!0,attrs:{class:"language-css"}},[a("code",[a("span",{pre:!0,attrs:{class:"token property"}},[e._v("will-change")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" transform"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("p",[e._v("но не нужно делать этого повсеместно чтобы не нагружать GPU.")]),e._v(" "),a("p",[e._v("Поскольку браузер - основная платформа веб-разработчиков, непонимание вышеописанного процесса ведёт к созданию неотзывчивых сайтов.")]),e._v(" "),a("p",[e._v("Секунды задержки в интернет-магазинах приводят к миллионам недополученной прибыли. А из-за отсутствия при старте проекта требований к производительности, веб-приложение для гос-служащих с 15Мб скриптов на Камчатке грузится 38 минут.")]),e._v(" "),a("p",[e._v("Источники:")]),e._v(" "),a("p",[e._v("Личный опыт")]),e._v(" "),a("p",[e._v("https://developers.google.com/web/fundamentals/performance/rendering")]),e._v(" "),a("p",[e._v("https://developer.mozilla.org/en-US/docs/Web/Performance/Critical_rendering_path")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/27.8774537d.js b/assets/js/27.8774537d.js new file mode 100644 index 0000000..5f2d13f --- /dev/null +++ b/assets/js/27.8774537d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{433:function(v,_,t){"use strict";t.r(_);var r=t(15),s=Object(r.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("p",[v._v('Это, наверное, тот самый важный навык, которого мне не хватает. На одном из собеседований на стандартный вопрос "А как у вас со стрессоустойчивостью" я на голубом глазу ответил что я не стрессоустойчив, чем вызвал у собеседующего поток нравоучений. Стресс, тем не менее, неотъемлемая часть жизни.')]),v._v(" "),t("p",[v._v("Этой статьёй я попробую немного разобраться в этом вопросе.")]),v._v(" "),t("p",[v._v("За последние три года я объективно пережил столько стресса и отчаяния, сколько не было за всю мою прошедшую жизнь (а я пережил 90-е в Тольятти). Начиная от переездов и пожара, заканчивая ремонтом и проблемами со здоровьем и работой.")]),v._v(" "),t("p",[v._v('Да, я крепкий человек. В английском есть подходящее слово "tenance" - способность ухватиться за что-то и держать это крепко. Выкручиваясь из разных ситуаций, в некоторые из которых я сам себя привёл гиперответственностью, верностью своему слову и решениям, я продолжал упорствовать и жрать кактус.')]),v._v(" "),t("p",[v._v('Но это сложно назвать стрессоустойчивостью. Наблюдая за людьми, я замечаю, что некоторые люди по-другому реагируют на стресс, они чувствуют себя энергичнее под давлением, не устают, не ноют и не агрессируют. В ютюб-шоу "СтопХам" это всё видно очень наглядно, поведение людей в ситуации когда всё идёт не так как им хочется очень разное, кто-то конфликтует, кто-то хитрит, а кто-то просто спокойно разворачивается и едет как нужно. Если бы все были стрессоустойчивые, шоу бы не получилось.')]),v._v(" "),t("p",[v._v('Итак, мы наткнулись на первый важный аспект неустойчивости - убежденность в своей правоте, "всё должно быть так, как я хочу".')]),v._v(" "),t("p",[v._v("Ещё один стрессоген - осознанное принятие жизненных решений - выбрать ту работу или эту, бить или бежать, тот человек или этот. Тревожный мозг в фоновом режиме перебирает все негативные варианты развития событий. Лично я в какой-то момент просто устаю и выбираю не решать, успокаиваюсь, а потом просто думаю о том, что же мне на самом деле нужно.")]),v._v(" "),t("p",[v._v("Я собрал несколько техник по профилактическому развитию стрессоустойчивости из интернета. Их можно выполнять в спокойные периоды для тренировки:")]),v._v(" "),t("ul",[t("li",[t("strong",[v._v("Самообразование -")]),v._v(" вас никто никуда не гонит, можно делать подходы в удобное время и развивать устойчивость при решении проблем.")]),v._v(" "),t("li",[t("strong",[v._v("Почаще просите -")]),v._v(" регулируйте уровень стресса прося в ситуациях когда возможность отказа велика.")]),v._v(" "),t("li",[t("strong",[v._v("Выйдите из зоны комфорта -")]),v._v(' да, когда вы слишком долго в комфорте, ваша стрессоустойчивость страдает - простым языком, найдите среду где вы будете "чувствовать себя мудаком", где все кажутся лучше чем вы в чем-то. Важно также уметь собрать обратную связь.')]),v._v(" "),t("li",[t("strong",[v._v("Ведите дневник энергии и эмоционального состояния -")]),v._v(" со временем вы поймете что влияет на ваш уровень энергии и сможете сами управлять её уровнем, понимая как её правильно восстанавливать и когда вы наиболее наполнены чтобы распределять задачи конструктивно. Рефлексируйте временами, это помогает быть более уверенным в принятии решений.")])]),v._v(" "),t("p",[v._v('В острые периоды, когда кажется что конца и края этому нет, важно уметь переключаться на режим "дорога возникает под ногами идущего", "this too shall pass", это помогает разгрузить мозг и не поддаваться панике, сфокусироваться на себе и на том, что на данный момент поддается контролю.')]),v._v(" "),t("p",[v._v("После стрессовой ситуации, даже если вы не ответственны за её создание, важно подумать о том что вы могли бы сделать по-другому и о том, как вы привыкли реагировать в таких ситуациях. Потратьте некоторое время, оно воздастся в будущем.")]),v._v(" "),t("p",[v._v("В целом, стратегия проста:")]),v._v(" "),t("ul",[t("li",[v._v("Оценивайте свои "),t("strong",[v._v("поступки")])]),v._v(" "),t("li",[v._v("Поддерживайте позитивный и конструктивный настрой")]),v._v(" "),t("li",[v._v("Получайте обратную связь")]),v._v(" "),t("li",[v._v("Передохните чтобы сменить направление")]),v._v(" "),t("li",[v._v("Оставьте ситуацию в прошлом")])]),v._v(" "),t("p",[v._v('Лично меня в периоды стресса раздражают фразы "если судьба приподнесла вам лимоны, сделайте из них лимонад", "думай позитивно, стакан всегда наполовину полон, всегда", "узбагойся", и тд. Это обесценивание проблемы и пассивный подход. Если проблема есть, значит за ней что-то ценное. В психологии есть поняние "интеграция тени", оно заключается в том, чтобы подсвечивать тёмные стороны своей личности и осваивать их.')]),v._v(" "),t("iframe",{staticStyle:{border:"none",width:"100%",height:"180px"},attrs:{frameborder:"0",width:"100%",height:"180",src:"https://music.yandex.ru/iframe/#track/30767185/6554921"}},[v._v("Слушайте "),t("a",{attrs:{href:"https://music.yandex.ru/album/6554921/track/30767185"}},[v._v("Думай позитивно")]),v._v(" — "),t("a",{attrs:{href:"https://music.yandex.ru/artist/218095"}},[v._v("Кровосток")]),v._v(" на Яндекс.Музыке")])])}),[],!1,null,null,null);_.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/28.91e0fc22.js b/assets/js/28.91e0fc22.js new file mode 100644 index 0000000..3078926 --- /dev/null +++ b/assets/js/28.91e0fc22.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{434:function(v,_,a){"use strict";a.r(_);var t=a(15),i=Object(t.a)({},(function(){var v=this,_=v.$createElement,a=v._self._c||_;return a("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[a("p",[v._v("Всё, что нужно знать об SDLC и Agile, это то, что это про деньги. Чем чаще релизы, тем чаще можно брать за это деньги.")]),v._v(" "),a("p",[v._v("Документация, ревизия кода, рефакторинг, работа с техдолгом, чеклисты, тесты, митинги, риск-менеджмент, бюрократия - это не то, за что заказчик платит с удовольствием.")]),v._v(" "),a("p",[v._v("Аналогия со строительством дома не подходит к разработке. Ближайшая метафора - конструкторское бюро или исследовательский центр.")]),v._v(" "),a("h2",{attrs:{id:"традиционные-подходы"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#традиционные-подходы"}},[v._v("#")]),v._v(" Традиционные подходы")]),v._v(" "),a("h3",{attrs:{id:"waterfall"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#waterfall"}},[v._v("#")]),v._v(" Waterfall")]),v._v(" "),a("p",[v._v("Без комментариев, все знают что такое waterfall и как долго заказчику приходится ждать первых результатов.")]),v._v(" "),a("h3",{attrs:{id:"rup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#rup"}},[v._v("#")]),v._v(" RUP")]),v._v(" "),a("p",[v._v("Компания Rational Software изобрела унифицированный язык описания объектно-ориентированной модели UML, и описала фазы разработки как:")]),v._v(" "),a("ul",[a("li",[v._v("Inception (discovery)")]),v._v(" "),a("li",[v._v("Elaboration (architecture)")]),v._v(" "),a("li",[v._v("Construction (MVP)")]),v._v(" "),a("li",[v._v("Transition (production)")])]),v._v(" "),a("p",[v._v("У каждой из фаз может быть несколько итераций, и у каждой из фаз есть свои вехи и дедлайны.")]),v._v(" "),a("p",[v._v("В разработке в той или иной степени (в зависимости от фазы) учавствуют следующие дисциплины:")]),v._v(" "),a("ul",[a("li",[v._v("Моделирование бизнеса")]),v._v(" "),a("li",[v._v("Требования")]),v._v(" "),a("li",[v._v("Анализ и дизайн")]),v._v(" "),a("li",[v._v("Разработка")]),v._v(" "),a("li",[v._v("Тестирование")]),v._v(" "),a("li",[v._v("Публикация (deployment)")]),v._v(" "),a("li",[v._v("Управление конфигурациями")]),v._v(" "),a("li",[v._v("Проектный менеджмент")]),v._v(" "),a("li",[v._v("Среда (environment)")])]),v._v(" "),a("p",[v._v("Одного взгляда на список достаточно чтобы понять что это дорого и трудно - управлять всем этим так, чтобы каждая дисциплина успевала вовремя и выдавала продукт в нужном качестве. Для этого нужна зрелость команды и процессов. Также нужен поток проектов чтобы у специалистов всегда была равномерная нагрузка.")]),v._v(" "),a("h2",{attrs:{id:"раннии-agile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#раннии-agile"}},[v._v("#")]),v._v(" Ранний Agile")]),v._v(" "),a("h3",{attrs:{id:"dsdm"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dsdm"}},[v._v("#")]),v._v(" DSDM")]),v._v(" "),a("p",[v._v("Чтобы делать продукты быстрее и дешевле, в 1994-м году энтузиасты создали DSDM (Dynamic System Development Method) консорциум, который в 2014-м году выпустил публичный handbook и переименовался в Agile Business Consorcium.")]),v._v(" "),a("p",[v._v("DSDM состоит всего из трех фаз:")]),v._v(" "),a("ul",[a("li",[v._v("Предпроектная подготовка - анализ, оценка реализуемости, бизнес-кейсы")]),v._v(" "),a("li",[v._v("Проектный жизненный цикл - итеративная разработка, определение максимального лимита времени, MoSCoW-приоретизация (Must, Should, Could, Won't)")]),v._v(" "),a("li",[v._v("Постпроектный этап - ретроспектива")])]),v._v(" "),a("h3",{attrs:{id:"fdd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fdd"}},[v._v("#")]),v._v(" FDD")]),v._v(" "),a("p",[v._v("Ещё один подход к разработке - очень легковесный и простой - FDD (Feature Driven Development). Фича - это работающая функция, которая приносит бизнес-ценность. Продукт - это просто набор готовых фич. В результате, поставляются только готовые фичи. Описание фичи содержит в себе действие, объект и результат.")]),v._v(" "),a("p",[v._v("Жизненный цикл FDD состоит из пяти этапов:")]),v._v(" "),a("ul",[a("li",[v._v("Разработка общей модели (доменная модель)")]),v._v(" "),a("li",[v._v("Написание списка фич")]),v._v(" "),a("li",[v._v("Планирование фич")]),v._v(" "),a("li",[v._v("Дизайн фич")]),v._v(" "),a("li",[v._v("Разработка фич (dev, test, deploy)")])]),v._v(" "),a("p",[v._v("В процессе реализации мониторится процент готовности фич. Фишка этого подхода - над продуктом может работать несколько команд одновременно. А команда - это состав, который необходим для реализации фичи целиком.")]),v._v(" "),a("h3",{attrs:{id:"crystal-methods"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#crystal-methods"}},[v._v("#")]),v._v(" Crystal Methods")]),v._v(" "),a("p",[v._v("Это семейство методологий, помеченных цветами. Выбор метода зависит от размера команды и критичности фейла продукта.\nКритичность оценивается возможными потерями и ранжируется по следующей шкале - комфорт, деньги, большие деньги, жизнь.\nРазмеры команд - 1-6, 7-20, 21-40, 41-80, 81-200.")]),v._v(" "),a("p",[v._v("Чем больше команда и чем выше риски, тем больше формализованных процессов добавляется к методу.")]),v._v(" "),a("p",[v._v("Основные ценности этого метода - люди, близкие и открытые коммуникации, легкий доступ к экспертам, персональная безопасность, частые поставки и ретроспективы, а также все современные техники, такие как автотесты и CI/CD")]),v._v(" "),a("h2",{attrs:{id:"современные-методы-разработки"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#современные-методы-разработки"}},[v._v("#")]),v._v(" Современные методы разработки")]),v._v(" "),a("h3",{attrs:{id:"scrum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#scrum"}},[v._v("#")]),v._v(" Scrum")]),v._v(" "),a("p",[v._v("Как методология был описан ещё в 1995-м. В одном предложении это маленька кросс-функциональная команда, которая короткими итерациями работает над созданием работающего продукта. Итерации называются спринтами (от дня до 30 дней).")]),v._v(" "),a("p",[v._v("Процесс на самом деле прост, но чтобы выдавать предсказуемый результат нужны годы практики и я в своей 10-летней практике встречал только одного человека, которого могу назвать Scrum-мастером.")]),v._v(" "),a("p",[v._v("Основные артифакты:")]),v._v(" "),a("ul",[a("li",[v._v("Продуктовый бэклог - пополняемый набор задач")]),v._v(" "),a("li",[v._v("Бэклог спринта - задачи, готовые к работе")]),v._v(" "),a("li",[v._v("Ежедневные планёрки - что сделано, что будешь делать, есть ли проблемы\n"),a("ul",[a("li",[v._v("План действий")])])]),v._v(" "),a("li",[v._v("Продуктовый инкремент - релиз")])]),v._v(" "),a("p",[v._v("Роли: владелец продукта (PO), скрам-мастер (SM) и команда разработки (Team).")]),v._v(" "),a("p",[v._v("PO владеет продуктовым бэклогом - задачами, дефектами, пользовательскими историями, требованиями, улучшениями и тд. Он определяет что будет сделано и в каком порядке.")]),v._v(" "),a("p",[v._v("SM это Agile-коуч, это лидер и фанатик оптимизации, он не рулит, он толкает.")]),v._v(" "),a("p",[v._v("Team - самоорганизуемая группа специалистов, необходимых для выполнения задачи.")]),v._v(" "),a("p",[v._v("В начале спринта команда собирается на планнинг спринта и с помощью PO, при фасилитации SM, выбирает задачи на спринт. Каждый день спринта команда собирается на еженедельные планерки, где отчитывается о прогрессе. В конце спринта команда собирается на ревью того, что было сделано и подводит итоги. Опционально проводится ретроспектива, где команда делится соображениями по улучшению процесса. Результат ретроспективы - план действий с ответственными за их выполнение.")]),v._v(" "),a("h3",{attrs:{id:"lean-software-development"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#lean-software-development"}},[v._v("#")]),v._v(" Lean Software Development")]),v._v(" "),a("p",[v._v("Смоделирована по принципам производства Toyota. Фокусируется на минимизации затрат, визуализации продуктивности и находить узкие места.")]),v._v(" "),a("p",[v._v("Один из артифактов - Value Stream Map. Он должен содержать только важные шаги и никаких лишних телодвижений.")]),v._v(" "),a("p",[v._v("Основные принципы этого метода")]),v._v(" "),a("ul",[a("li",[v._v("уничтожение всего, что не приносит ценности")]),v._v(" "),a("li",[v._v("никаких золотых тарелок")]),v._v(" "),a("li",[v._v("избегание ненужных фич и смены контекстов")]),v._v(" "),a("li",[v._v("улучшение обучения")]),v._v(" "),a("li",[v._v("принятие решений в последний момент - никак не заранее, потому что всё меняется")]),v._v(" "),a("li",[v._v("поставки как можно скорее (fail fast)")]),v._v(" "),a("li",[v._v("поддержка команды, развитие креативности")]),v._v(" "),a("li",[v._v("концептуальная интегрированность команды - все немного знают чем занимаются другие")]),v._v(" "),a("li",[v._v("частые коммуникации с заказчиком")]),v._v(" "),a("li",[v._v("целостное видение")])]),v._v(" "),a("h3",{attrs:{id:"kanban"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#kanban"}},[v._v("#")]),v._v(" Kanban")]),v._v(" "),a("p",[v._v("Это инструмент метода LSD для визуализации процесса работы. Выглядит просто - это вертикальные колонки на доске, отражающие этапы разработки, без лишних шагов, количество унифицированных задач на каждом этапе зависит от количества участникав и обязательно должно быть ограничено числом или сложностью.")]),v._v(" "),a("p",[v._v("Kanban позволяет получить усредненное значение времени, необходимого на работу над задачей путем простого разделения количества задач в колонке на время прихода этих задач.")]),v._v(" "),a("p",[v._v("Kanban позволяет визализировать узкие места и вовремя среагировать на них благодаря ограничению на количество задач. Каждая колонка может быть разделена ещё на две - в процессе и сделано.")]),v._v(" "),a("p",[v._v("Единственная церемония - ежедневные стендапы перед доской. Итерации отсутствуют, происходит непрерывная поставка по мере готовности.")]),v._v(" "),a("h3",{attrs:{id:"экстремальное-программирование-xp"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#экстремальное-программирование-xp"}},[v._v("#")]),v._v(" Экстремальное программирование (XP)")]),v._v(" "),a("p",[v._v("Состоит из коротких недельных итераций, клиенто-ориентированной колаборации и ежеквартального макро-планирования.\nНа дизайн тратится не более 10 минут, также часто используется парное программирование и TDD.")]),v._v(" "),a("h3",{attrs:{id:"spotify-agile"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#spotify-agile"}},[v._v("#")]),v._v(" Spotify Agile")]),v._v(" "),a("p",[v._v('Фишка в том, что Spotify отказался от использования любых методологий в пользу изучения реальных кейсов и создание культуры взамен какой-либо одной методологии ради гибкости. Подход к релизам у них следующий - небольшие группы людей работают над задачами в параллели и выпускают небольшие частые релизы. Релиз должен быть рутиной, а не драмой. Они также ввели понятия "поезда релизов" и фича-тогглинг (выключание фич по запросу и готовности сторонних систем)')]),v._v(" "),a("p",[v._v("Для постоянных улучшений используется Kata Board - описание проблемы, идеальное решение, реалистичный вариант и как выход - 3 топ действия которые приведут к улучшению.")]),v._v(" "),a("p",[v._v("Также Spotify широко используют понятие гильдий - людей с одинаковыми интересами, объединенные в комьюнити для обмена знаниями.")]),v._v(" "),a("h2",{attrs:{id:"ci-cd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ci-cd"}},[v._v("#")]),v._v(" CI/CD")]),v._v(" "),a("p",[v._v("Все просто")]),v._v(" "),a("ul",[a("li",[v._v("CI требует от разработчиков стабильных инкрементов")]),v._v(" "),a("li",[v._v("CD требует от продакшн-сред стабильности и безболезненных релизов")])]),v._v(" "),a("p",[v._v("DevOps практики требуют тесной колаборации между разработчиками и тестировщиками и использования автоматизированных инструментов для обеспечения быстрых релизов.")]),v._v(" "),a("h2",{attrs:{id:"несколько-дополнительных-подходов"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#несколько-дополнительных-подходов"}},[v._v("#")]),v._v(" Несколько дополнительных подходов")]),v._v(" "),a("h3",{attrs:{id:"cmmi-capability-maturity-model-integration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cmmi-capability-maturity-model-integration"}},[v._v("#")]),v._v(" CMMI - Capability Maturity Model Integration")]),v._v(" "),a("p",[v._v("Это модель и гайд для улучшения процессов организации, используется практически во всех сферах.")]),v._v(" "),a("p",[v._v("Модель содержит оценку зрелости от 1 до 5, где:")]),v._v(" "),a("ol",[a("li",[v._v("Непредсказуемость и реактивность - не укладываемся в сроки и бюджеты")]),v._v(" "),a("li",[v._v("Менеджмент на уровне проекта - присутствует планирование, оценки, контроль")]),v._v(" "),a("li",[v._v("Проактивность - менеджмент на уровне организации - стандартизация проектов, програм и портфолио")]),v._v(" "),a("li",[v._v("Количественный менеджмент и контроль - предсказуемые улучшения, основанные на фактах, полученных системами учета")]),v._v(" "),a("li",[v._v("Стабильность и гибкость - организация сфокусированна на постоянных улучшениях, а стабильный фундамент позволяет гибко встречать изменения и возможности")])]),v._v(" "),a("h3",{attrs:{id:"six-sigma"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#six-sigma"}},[v._v("#")]),v._v(" Six Sigma")]),v._v(" "),a("p",[v._v("Это техника для решения проблем из Моторолы. И тема для отдельного поста ввиду обширности тулсета, от PDCA до DMAIC.")]),v._v(" "),a("p",[v._v("Обзор методологий описаны по мотивам курса Software Development Life Cycle (SDLC) with Shashi Shekhar на LinkenIn Learning.")])])}),[],!1,null,null,null);_.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/29.61c5f0a9.js b/assets/js/29.61c5f0a9.js new file mode 100644 index 0000000..3c9c4f6 --- /dev/null +++ b/assets/js/29.61c5f0a9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{435:function(t,e,n){"use strict";n.r(e);var o=n(15),l=Object(o.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v('Гиперответственность - это хомут, который несут гордо. Со временем (чем больше человек делает для других, но не получает того же) формируется стойкое ощущение "мне все должны" и чувство собственной важности раздувается до уровня синдрома вахтёра.')]),t._v(" "),n("p",[t._v("По сути своей это желание быть хорошим для других. Человек старается изо всех сил, соблюдает правила, показывает другим пример и считает людей, которые так не делают зловредами и недоумками, в тяжёлых случаях, пытается переучить других. Нужно помнить что и Гитлер и Сталин были идеалистами и романтиками.")]),t._v(" "),n("p",[t._v("Упорство, чувство собственной правоты и праведности, попытки прогнуть окружающих, навязать свои ценности, конечно же путь к разочарованию и отчаянию.")]),t._v(" "),n("blockquote",[n("p",[t._v("Всучить ответственность за себя другим, взвалить все остальное на себя - заповедь созависимого человека\n– Альберт Мухаметшин")])]),t._v(" "),n("p",[t._v("Здоровая позиция предполагает ответственность только за свои поступки и реакции.")]),t._v(" "),n("p",[t._v('Когда виноват кто-то другой, тут уже ничего не поделать - "они..."')])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/3.fdb731c5.js b/assets/js/3.fdb731c5.js new file mode 100644 index 0000000..a54d846 --- /dev/null +++ b/assets/js/3.fdb731c5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{369:function(t,e,n){},370:function(t,e,n){},371:function(t,e,n){},381:function(t,e,n){t.exports=function(){"use strict";var t="minute",e=/[+-]\d\d(?::?\d\d)?/g,n=/([+-]|\d\d)/g;return function(r,i,o){var s=i.prototype;o.utc=function(t){var e={date:t,utc:!0,args:arguments};return new i(e)},s.utc=function(e){var n=o(this.toDate(),{locale:this.$L,utc:!0});return e?n.add(this.utcOffset(),t):n},s.local=function(){return o(this.toDate(),{locale:this.$L,utc:!1})};var a=s.parse;s.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),a.call(this,t)};var u=s.init;s.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else u.call(this)};var c=s.utcOffset;s.utcOffset=function(r,i){var o=this.$utils().u;if(o(r))return this.$u?0:o(this.$offset)?c.call(this):this.$offset;if("string"==typeof r&&null===(r=function(t){void 0===t&&(t="");var r=t.match(e);if(!r)return null;var i=(""+r[0]).match(n)||["-",0,0],o=i[0],s=60*+i[1]+ +i[2];return 0===s?0:"+"===o?s:-s}(r)))return this;var s=Math.abs(r)<=16?60*r:r,a=this;if(i)return a.$offset=s,a.$u=0===r,a;if(0!==r){var u=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(a=this.local().add(s+u,t)).$offset=s,a.$x.$localOffset=u}else a=this.utc();return a};var f=s.format;s.format=function(t){var e=t||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return f.call(this,e)},s.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||(new Date).getTimezoneOffset());return this.$d.valueOf()-6e4*t},s.isUTC=function(){return!!this.$u},s.toISOString=function(){return this.toDate().toISOString()},s.toString=function(){return this.toDate().toUTCString()};var p=s.toDate;s.toDate=function(t){return"s"===t&&this.$offset?o(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():p.call(this)};var l=s.diff;s.diff=function(t,e,n){if(t&&this.$u===t.$u)return l.call(this,t,e,n);var r=this.local(),i=o(t).local();return l.call(r,i,e,n)}}}()},382:function(t,e,n){"use strict";n(369)},383:function(t,e,n){"use strict";n(370)},384:function(t,e,n){"use strict";var r=n(10),i=n(0),o=n(4),s=n(118),a=n(18),u=n(12),c=n(200),f=n(37),p=n(88),l=n(201),h=n(5),g=n(63).f,v=n(39).f,m=n(14).f,d=n(385),_=n(386).trim,$=i.Number,y=$.prototype,x=i.TypeError,b=o("".slice),k=o("".charCodeAt),O=function(t){var e=l(t,"number");return"bigint"==typeof e?e:w(e)},w=function(t){var e,n,r,i,o,s,a,u,c=l(t,"number");if(p(c))throw x("Cannot convert a Symbol value to a number");if("string"==typeof c&&c.length>2)if(c=_(c),43===(e=k(c,0))||45===e){if(88===(n=k(c,2))||120===n)return NaN}else if(48===e){switch(k(c,1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+c}for(s=(o=b(c,2)).length,a=0;ai)return NaN;return parseInt(o,r)}return+c};if(s("Number",!$(" 0o1")||!$("0b1")||$("+0x1"))){for(var C,I=function(t){var e=arguments.length<1?0:$(O(t)),n=this;return f(y,n)&&h((function(){d(n)}))?c(Object(e),n,I):e},T=r?g($):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),P=0;T.length>P;P++)u($,C=T[P])&&!u(I,C)&&m(I,C,v($,C));I.prototype=y,y.constructor=I,a(i,"Number",I)}},385:function(t,e,n){var r=n(4);t.exports=r(1..valueOf)},386:function(t,e,n){var r=n(4),i=n(36),o=n(19),s=n(387),a=r("".replace),u="["+s+"]",c=RegExp("^"+u+u+"*"),f=RegExp(u+u+"*$"),p=function(t){return function(e){var n=o(i(e));return 1&t&&(n=a(n,c,"")),2&t&&(n=a(n,f,"")),n}};t.exports={start:p(1),end:p(2),trim:p(3)}},387:function(t,e){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},388:function(t,e,n){var r=n(214),i=n(207),o=n(389),s=n(393);t.exports=function(t,e){if(null==t)return{};var n=r(s(t),(function(t){return[t]}));return e=i(e),o(t,n,(function(t,n){return e(t,n[0])}))}},389:function(t,e,n){var r=n(130),i=n(390),o=n(119);t.exports=function(t,e,n){for(var s=-1,a=e.length,u={};++s1&&t.paginationComponent?n(t.paginationComponent,{tag:"component"}):t._e()],1)}),[],!1,null,null,null));e.default=x.exports}}]); \ No newline at end of file diff --git a/assets/js/30.17ce7f72.js b/assets/js/30.17ce7f72.js new file mode 100644 index 0000000..ad984e5 --- /dev/null +++ b/assets/js/30.17ce7f72.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{436:function(t,s,n){"use strict";n.r(s);var i=n(15),e=Object(i.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[s("p",[this._v('Принципиальный человек - хороший специалист, но хреновый сотрудник. Из-за его принципов страдают все - и коллеги, и заказчик. О принципах не спорят, если ты придерживаешься каких-то других принципов - ты не свой. А это уже попахивает нацизмом потому что появляются некие "мы" и "они". А как следствие - пассивная агрессивность.')]),this._v(" "),s("p",[this._v("Принципиальный человек не может объяснить откуда взялись его принципы. Он просто уверен что так правильно и никаких гвоздей.")]),this._v(" "),s("p",[this._v('Это роль поучающего родителя. Он говорит что надо ходить в штанах, но не может объяснить почему. Как и со внутренним родителем, с внешним можно справиться включив "рацио", задавая открытые вопросы "Почему? Зачем? Как? Когда? Где? Кто?" из позиции взрослого (держа в голове общую выгоду, win-win).')])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/31.1ddcc857.js b/assets/js/31.1ddcc857.js new file mode 100644 index 0000000..51a7afd --- /dev/null +++ b/assets/js/31.1ddcc857.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{437:function(t,e,n){"use strict";n.r(e);var s=n(15),l=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("Тренируйтесь дома.")])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/32.0d42e7d5.js b/assets/js/32.0d42e7d5.js new file mode 100644 index 0000000..fa14dee --- /dev/null +++ b/assets/js/32.0d42e7d5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{438:function(t,a,e){"use strict";e.r(a);var o=e(15),r=Object(o.a)({},(function(){var t=this.$createElement,a=this._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[a("p",[this._v("Стоило отписаться от Яндекс Музыки, мой мозг сразу стал генератором собственной.\nСвежачок:\n"),a("iframe",{attrs:{width:"100%",height:"600",scrolling:"no",frameborder:"no",allow:"autoplay",src:"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1045016950&color=%23540444&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"}})]),a("div",{staticStyle:{"font-size":"10px",color:"#cccccc","line-break":"anywhere","word-break":"normal",overflow:"hidden","white-space":"nowrap","text-overflow":"ellipsis","font-family":"Interstate,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Garuda,Verdana,Tahoma,sans-serif","font-weight":"100"}},[a("a",{staticStyle:{color:"#cccccc","text-decoration":"none"},attrs:{href:"https://soundcloud.com/alterforia",title:"Alterforia",target:"_blank"}},[this._v("Alterforia")]),this._v(" · "),a("a",{staticStyle:{color:"#cccccc","text-decoration":"none"},attrs:{href:"https://soundcloud.com/alterforia/paupiauau",title:"Paupiauau",target:"_blank"}},[this._v("Paupiauau")])]),a("p")])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/33.718d32c8.js b/assets/js/33.718d32c8.js new file mode 100644 index 0000000..0f5653f --- /dev/null +++ b/assets/js/33.718d32c8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{439:function(n,t,e){"use strict";e.r(t);var p=e(15),_=Object(p.a)({},(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":n.$parent.slotKey}},[e("p",[n._v("Важно понимать, что кризисы это неотъемлемая часть развития.\nО том, какие психологические и биологические кризисы бывают вы можете почитать тут:\nhttps://ru.wikipedia.org/wiki/Нормативные_кризисы_развития")]),n._v(" "),e("p",[n._v("В то же время, в кризис что-то понимать что-то сложно, потому что мозг на начальных этапах не работает.")]),n._v(" "),e("p",[n._v("Вкратце о фазах любого кризиса (нет, не модель Кюблер-Росс):")]),n._v(" "),e("p",[n._v('Любой кризис начинается с нарушения рутин, то, что раньше было опорой начинает раздражать.\nЧеловек чувствует горе, отчаяние, угрозу перспективам, ролевая модель будущего неясна.\nСкорость событий увеличивается, горизонт планирования снижается, при этом качественные изменения отрицаются, предпринимаются попытки "приложить подорожник", вернуться к основам - это с миром что-то не так.\nАктивируются привычные психологические защиты. Часто начинает проявляться инфантилизм, возрастная регрессия.')]),n._v(" "),e("p",[n._v('Фаза дезорганизации - как было не работает, всё рушится, в жизни человека появляется "психолог" - с запросом к нему - верните как было, почините меня, примите меня. Происходит поиск решения.\nФаза поворота - человек приходит к выводу - это непочинимо, надо разрушить и создать новое.\nФаза реорганизации - активный редизайн - принимается множество новых решений на ходу - дорога под ногами идущего.\nФаза восстановления - наблюдается снижение энергии, требуется время чтобы привыкнуть к новой нормальности.')]),n._v(" "),e("p",[n._v("В целом выход из кризиса происходит несколько лет.")])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/34.a3b069dd.js b/assets/js/34.a3b069dd.js new file mode 100644 index 0000000..6f65406 --- /dev/null +++ b/assets/js/34.a3b069dd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{440:function(t,n,e){"use strict";e.r(n);var s=e(15),l=Object(s.a)({},(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("Фрустрацию и аддикцию почему-то принято рассматривать отдельно, хотя это просто два разнонаправленных процесса, две стороны одной медали.\nПервопричина обеих - ожидание награды, поощрения, обладания желаемым.")]),t._v(" "),e("p",[t._v("Если награда не была обещана, в результате фрустрации возникает обида, если была - злость и гнев.")]),t._v(" "),e("p",[t._v("Аддикция возникает к тому, что гарантированно оправдает ожидания. Но при недоступности объекта аддикции возникает фрустрация.")]),t._v(" "),e("p",[t._v('Выйти из этого механизма довольно просто и сложно одновременно. Решение в отказе от гарантированного будущего в процессе движения к путеводной звезде. "Дорога возникает под ногами идущего." Главное - не терять направление.')])])}),[],!1,null,null,null);n.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/35.939cb2e3.js b/assets/js/35.939cb2e3.js new file mode 100644 index 0000000..6c2d704 --- /dev/null +++ b/assets/js/35.939cb2e3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{441:function(n,v,t){"use strict";t.r(v);var _=t(15),e=Object(_.a)({},(function(){var n=this,v=n.$createElement,t=n._self._c||v;return t("ContentSlotsDistributor",{attrs:{"slot-key":n.$parent.slotKey}},[t("p",[n._v('Многих разработчиков привлекает фраза "проект с нуля".\nЭто как искать девственницу - мало кто ответит на вопрос "что ты будешь с ней делать?"\nГораздо проще улучшать существующий проект, чем создавать с нуля свой.\nПроект с нуля это огромный объем работ, который нужно сделать чтобы запуститься.')]),n._v(" "),t("p",[n._v("Для PM это GAP-анализ (чего нет чтобы было), стратегическое планирование, создание плана коммуникаций и выбор методологии управления.\nДля аналитика это подготовка и детализация сотни страниц в базе знаний, описывающих функционал гораздо детальнее, чем в ТЗ.\nДля разработчиков это выбор технологий с учетом ситуации на рынке труда, собственных компетенций и требований (функциональных и нефункциональных).")]),n._v(" "),t("p",[n._v("Это как спроектировать дом в чистом поле.\nНужно учесть всё: ландшафт, климат, доступность стройматериалов и рабочих, площадь участка и обязательно - пожелания заказчика. Учесть нужно также внезапно возникающие требования в середине строительства. Например, заказчик может захотеть камин, хотя летом он от камина отказывался.")]),n._v(" "),t("p",[n._v("При планировании работ надо помнить о праздниках, отпусках и больничных, особенностях работы с квалифицированными и не очень людьми.")]),n._v(" "),t("p",[n._v("В моей практике было только два проекта с нуля. И вот мои усвоенные уроки:")]),n._v(" "),t("ol",[t("li",[n._v("Прежде чем браться за проект, нужно понимать какой объем работ действительно осуществим в текущих условиях. Это должны быть конкретные рамки (scope of work). Остальное можно оставить на потом если хватит средств. Часто выбор очевиден - ради ускорения сайта с 10 до 1 секунды можно переписывать софт пару лет, чтобы получить современный SPA, или пригласить эксперта чтобы он настроил Webpack за день.")]),n._v(" "),t("li",[n._v("Верхнеуровневую оценку после подписания договора можно сразу выбрасывать и начинать делать детальный план работ от простого к сложному. Половину этого плана тоже придётся выбросить после первой демонстрации успехов. Требования меняются. Коммуникации важнее начального ТЗ. Основная ценность проектирования и разработки в том, что мы, делая итеративные поставки, даём заказчику понимание, что он в итоге хочет.")]),n._v(" "),t("li",[n._v("Хорошая практика - в середине проекта объявить о том, что вы готовы поработать ещё пару месяцев за те же деньги (при условии, что это было учтено в изначальной оценке)")]),n._v(" "),t("li",[n._v("Очень важно (!!!) сразу создать план коммуникации со всеми заинтересованными лицами (регулярность обсуждений план-факта, структурность общения, своевременную и качественную обработку предложений). Иначе бывает сложно обеспечить доступность выгодоприобретателей. На каждой встрече должен быть человек, который будет слушать внимательнее всех и не вмешиваться.")]),n._v(" "),t("li",[n._v("Отлично если удастся убедить заказчика провести мини-исследование осуществимости задуманного. Двухнедельный discovery-проект поможет составить чёткое видение будущего продукта и показать возможности и риски ещё до подписания договора.")])])])}),[],!1,null,null,null);v.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/36.02e3783a.js b/assets/js/36.02e3783a.js new file mode 100644 index 0000000..976b368 --- /dev/null +++ b/assets/js/36.02e3783a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{442:function(v,_,t){"use strict";t.r(_);var l=t(15),p=Object(l.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("p",[v._v("Переговоры это самый сложный вид коммуникации.")]),v._v(" "),t("p",[v._v("Чтобы переговоры состоялись, необходимым условием является наличие у сторон общего интереса.")]),v._v(" "),t("p",[v._v("Общепринятая теория психологии переговоров гласит что существует пять стратегий, пять путей выхода из конфликта, пять сильных надёжных позиций в переговорах.")]),v._v(" "),t("ol",[t("li",[v._v("Черепаха.")])]),v._v(" "),t("p",[v._v('"Мне нужно время чтобы подумать/собраться с мыслями/обсудить детали с коллегами/выпить стакан воды"')]),v._v(" "),t("p",[v._v("Черепаха никогда не принимает решения.")]),v._v(" "),t("p",[v._v("Эта стратегия применяется когда нужно тянуть время. Когда происходит давление, когда решение ещё не принято и интересы сторон неясны.")]),v._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[v._v("Лиса.")])]),v._v(" "),t("p",[v._v('"Мы так много для вас сделали, не могли бы вы нам немного помочь".')]),v._v(" "),t("p",[v._v("Эту стратегию лучше всего применять когда позиция чуточку слабее, это путь уступок с нагрузкой. Согласие с условием.")]),v._v(" "),t("p",[v._v('Лиса никогда не бывает прямой. Всегда говорит Мы вместо Я. Лиса не слышит "нет".')]),v._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[v._v("Сова.")])]),v._v(" "),t("p",[v._v('"Учитывая все нюансы и риски, ради общей пользы я предлагаю обсудить все возможные решения и выбрать наилучшее"')]),v._v(" "),t("p",[v._v("Сова сфокусирована на пользе и сотрудничестве. Применять следует тогда когда ситуация предельно ясна и проработана в деталях. Экспертная позиция, рациональная аргументация.")]),v._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[v._v("Плюшевый мишка.")])]),v._v(" "),t("p",[v._v('"Вы правы, мне не следовало этого делать, я совершил ошибку и очень сильно раскаиваюсь. Простите меня."')]),v._v(" "),t("p",[v._v("Применяется в наиболее слабой позиции, когда нужно вызвать симпатию, эмпатию, желаение обнять и пожалеть чтобы избежать санкций и неблагоприятной ситуации даже ценой собственных интересов.")]),v._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[v._v("Акула.")])]),v._v(" "),t("p",[v._v('"Ситуация очень критическая. Это недопустимое поведение и если так будет продолжаться, я буду ходатайствовать о применении соответствующих санкций в отношении всех пречисленных в отчете лиц"')]),v._v(" "),t("p",[v._v("Применяется очень дозированно в ситуации когда позиция явно сильнее, сроки поджимают и ситуация критическая. Акула даёт оценку ситуации и делает это тоном злой учительницы ясно и четко выговаривая каждую фразу.")]),v._v(" "),t("p",[v._v("Несколько важных замечаний:")]),v._v(" "),t("ul",[t("li",[v._v("встать и уйти стандартная реакция в ходе сложных переговоров, но это провал")]),v._v(" "),t("li",[v._v("эмоции вообще - враг в любых переговорах, как хорошие так и плохие")]),v._v(" "),t("li",[v._v("решение задачи не должно являться целью переговоров, цель переговоров - согласие сторон")]),v._v(" "),t("li",[v._v("то, что вы делаете в точке перехода хода меняет ход переговоров гораздо круче того что вы выражаете вербально")])])])}),[],!1,null,null,null);_.default=p.exports}}]); \ No newline at end of file diff --git a/assets/js/37.74c703b2.js b/assets/js/37.74c703b2.js new file mode 100644 index 0000000..0ec9b0b --- /dev/null +++ b/assets/js/37.74c703b2.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{443:function(v,_,t){"use strict";t.r(_);var l=t(15),p=Object(l.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("p",[v._v("Основной инструмент лидера команды или формального управленца это другие люди.")]),v._v(" "),t("p",[v._v("Добиться чего-либо от людей можно только через техники влияния.")]),v._v(" "),t("p",[v._v("Разделить техники влияния можно на две категории: варварские и цивилизованные.")]),v._v(" "),t("p",[v._v("Если с цивилизованными всё просто - аргументация и контр-аргументация. С варварскими всё немного сложнее. Их хотелось бы разобрать подробнее.")]),v._v(" "),t("p",[v._v("Варварские методы:")]),v._v(" "),t("ul",[t("li",[v._v("угрозы, принуждение, моральное давление")]),v._v(" "),t("li",[v._v("манипуляции (лесть, ложь)")]),v._v(" "),t("li",[v._v("нападение:\n"),t("ul",[t("li",[v._v("непрошенные советы")]),v._v(" "),t("li",[v._v("деструктивная критика")]),v._v(" "),t("li",[v._v("деструктивная констатация")])])])]),v._v(" "),t("p",[v._v("Варварские методы действуют на эмоции, разжигают гнев, злобу, вызывают чувство вины и беспомощности.")]),v._v(" "),t("p",[v._v("Наиболее эффективный способ отбить нападение - психологическое айкидо.")]),v._v(" "),t("p",[v._v('Вдох, выдох, - "Да, Игорь, возможно вы правы"')]),v._v(" "),t("p",[v._v("В особо жарких ситуациях хорошо работает испорченная пластинка - повторять одну и ту же фразу пока человек не успокоится.")]),v._v(" "),t("p",[v._v("Также можно уточнить - а как бы человек принял решение в этой ситуации.")]),v._v(" "),t("p",[v._v("Если ваша позиция чуть сильнее - можно объяснить своё поведение личностными качествами.")]),v._v(" "),t("p",[v._v("В любом случае, важно сразу отбить атаку так, чтобы конфликт не дошёл до точки невозврата - неконтролируемых эмоций.")]),v._v(" "),t("p",[v._v("Ни в коем случае не оправдываться, не шутить и не говорить снисходительно - это тоже конфликтогены.")])])}),[],!1,null,null,null);_.default=p.exports}}]); \ No newline at end of file diff --git a/assets/js/38.a952d7c0.js b/assets/js/38.a952d7c0.js new file mode 100644 index 0000000..f2747e1 --- /dev/null +++ b/assets/js/38.a952d7c0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{444:function(t,e,n){"use strict";n.r(e);var v=n(15),_=Object(v.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("blockquote",[n("p",[t._v("Если после каждого падения ты находишь в себе силы подняться, то скорее всего ты - синусоида.")])]),t._v(" "),n("p",[t._v("Мотивом сменить место жительства, работу, закончить старые и начать новые отношения всегда является ожидание чего-то лучшего, большего и вкусного. Вдоволь нафрустрировавшись очередным несоответствием желаемого и действительного, я выработал в себе привычку адаптироваться.")]),t._v(" "),n("p",[t._v("Адаптация происходит постепенно.")]),t._v(" "),n("p",[t._v("Во-первых, правильные вопросы. Примеры неправильных вопросов - почему все так плохо? За что?! Где этому конец? и так далее.\nПримеры правильных вопросов - Что я могу сделать в сложившейся ситуации чтобы стало лучше чем было и по ходу получать удовольствие от процесса? Какое решение мне нужно принять чтобы перестать беспокоиться и начать жить и радоваться каждому мгновению? и так далее.")]),t._v(" "),n("p",[t._v("Хороший вопрос от плохого отличается тем, что меняет фокус восприятия в сторону изменения ситуации, а не заставляет копаться в прошлом и анализировать.")]),t._v(" "),n("p",[t._v("Во-вторых, внутреннее состояние. Каждое мое утро начинается с поиска и воссоединения с собой. Не скажу что это легко, но двигаясь в эту сторону рано или поздно будет результат в виде неописуемого и непередаваемого восторга жизни. Всякий раз это по-разному. Снаружи я могу все так же суетиться или механически куда-то идти, но в процессе вслушивания вглубь себя, рано или поздно я нахожу этот пульт внутреннего управления.")]),t._v(" "),n("p",[t._v('В-третьих, осознание себя в ситуации. К ситуационному мышлению я пришел своим умом, но потом узнал, что это довольно продвинутый способ мышления. У каждой ситуации есть начало и есть конец и они перетекают друг в друга. Осознание себя не только в пространстве, но и в ситуации, делают жизнь более полной и насыщенной ситуациями. Но насыщение происходит изнутри меня ответом на вопрос "Чем я наполняю эту ситуацию?" Таким образом возникает резонанс и причинно-следственный альянс состояние-ситуация.')]),t._v(" "),n("p",[t._v("Адаптация через резонанс видится мне более органичной чем механическое выстраивание отношений с миром и людьми через ярлыки и метафоры.")])])}),[],!1,null,null,null);e.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/39.4c106810.js b/assets/js/39.4c106810.js new file mode 100644 index 0000000..1d4331f --- /dev/null +++ b/assets/js/39.4c106810.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{445:function(t,e,n){"use strict";n.r(e);var v=n(15),_=Object(v.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("Время - категория относительная, мера движения одних вещей относительно других и можно с уверенностью заявить что как феномена его не существует, поэтому речь по сути идет об управлении вниманием. Умении удерживать внимание на определенном пространстве и переключаться между пространствами. Я умышленно не употребляю слово объект, поскольку это не отражает сути и термин довольно плоский. Пространство, как некий объем (тела, души, сознания), требует навыка распределенного внимания и более жизненно.")]),t._v(" "),n("p",[t._v("Итак, мы определились с основным инструментарием - это управление пространственным вниманием.")]),t._v(" "),n("p",[t._v('Продолжая движение из плоского мира целей, желаний, событий, из, так называемого, "клипового мышления" в мир ситуаций, включенности и непрерывного движения, давайте введем термин "путь". Путь определяется намерением. А намерение это по сути взаимное притяжение того пространства где мы находимся с тем пространством, где наше внимание.')]),t._v(" "),n("p",[t._v('Намерение и пространственное внимание взамен плоских и узких целей и фиксации на объектах порождают мышление в четырех изменениях, где четвертым измерением является "ход вещей", который принято называть временем, а так же здравую оценку ситуации и поведение, которое обеспечит ход вещей согласно главной задаче.')]),t._v(" "),n("p",[t._v('Разумеется, другие люди, социальные модели, правила и законы социума, ядро личности так или иначе будут влиять на ситуации, но если представить это как некую внешнюю сферу, внешний интерфейс, то внутри есть еще одно ядро - субъективная реальность. В противовес социальной реальности оно живет по другим законам и правилам. Это и есть тот, всеми искомый "источник", точка подзарядки, соединение с собой. И из этой субъективной реальности мы можем влиять на свои состояния, мысли, чувства, эмоции. Как око тайфуна, это пространство часто называют "внутренний стержень", на который всегда можно опереться и черпать жизненный потенциал даже (и особенно) в трудных жизненых ситуациях.')]),t._v(" "),n("p",[t._v("Механизм работы с субъективным пространством тот что что и с социальным - через намерение-притяжение.")]),t._v(" "),n("p",[t._v("Огромное количество людей лишено контакта с этим внутренним стержнем и поэтому в целях синергии и общего блага влиять на них можно и нужно с помощью создания единого мнения в каждой субъективной реальности с помощью моделей, правил, законов и пропоганды.")])])}),[],!1,null,null,null);e.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/4.f0747ded.js b/assets/js/4.f0747ded.js new file mode 100644 index 0000000..abd5d25 --- /dev/null +++ b/assets/js/4.f0747ded.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{374:function(t,n,e){},403:function(t,n,e){"use strict";var r=e(3),i=e(404);r({target:"String",proto:!0,forced:e(405)("link")},{link:function(t){return i(this,"a","href",t)}})},404:function(t,n,e){var r=e(4),i=e(36),l=e(19),a=/"/g,o=r("".replace);t.exports=function(t,n,e,r){var u=l(i(t)),s="<"+n;return""!==e&&(s+=" "+e+'="'+o(l(r),a,""")+'"'),s+">"+u+""}},405:function(t,n,e){var r=e(5);t.exports=function(t){return r((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}))}},406:function(t,n,e){"use strict";var r=e(13),i=e(204),l=e(11),a=e(90),o=e(19),u=e(36),s=e(62),c=e(205),f=e(206);i("match",(function(t,n,e){return[function(n){var e=u(this),i=null==n?void 0:s(n,t);return i?r(i,n,e):new RegExp(n)[t](o(e))},function(t){var r=l(this),i=o(t),u=e(n,r,i);if(u.done)return u.value;if(!r.global)return f(r,i);var s=r.unicode;r.lastIndex=0;for(var d,k=[],m=0;null!==(d=f(r,i));){var v=o(d[0]);k[m]=v,""===v&&(r.lastIndex=c(i,a(r.lastIndex),s)),m++}return 0===m?null:k}]}))},407:function(t,n,e){"use strict";e(374)},410:function(t,n,e){"use strict";e.r(n);e(403),e(217),e(9),e(91),e(46),e(125),e(124),e(406);var r=/#.*$/,i=/\.(md|html)$/,l=/\/$/,a=/^(https?:|mailto:|tel:)/;function o(t){return a.test(t)}function u(t){if(o(t))return t;var n=t.match(r),e=n?n[0]:"",a=function(t){return decodeURI(t).replace(r,"").replace(i,"")}(t);return l.test(a)?t:a+".html"+e}var s={props:{link:{required:!0}},computed:{normalizedlink:function(){return u(this.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some((function(n){return n===t.normalizedlink})):"/"===this.normalizedlink}},methods:{isExternal:o,isMailto:function(t){return/^mailto:/.test(t)},isTel:function(t){return/^tel:/.test(t)}}},c=(e(407),e(15)),f=Object(c.a)(s,(function(){var t=this,n=t.$createElement,e=t._self._c||n;return t.isExternal(t.normalizedlink)?e("a",{staticClass:"nav-link external",attrs:{href:t.normalizedlink,target:t.isMailto(t.normalizedlink)||t.isTel(t.normalizedlink)?null:"_blank",rel:t.isMailto(t.normalizedlink)||t.isTel(t.normalizedlink)?null:"noopener noreferrer"}},[t._t("default")],2):e("router-link",{staticClass:"nav-link",attrs:{to:t.normalizedlink,exact:t.exact}},[t._t("default")],2)}),[],!1,null,null,null);n.default=f.exports}}]); \ No newline at end of file diff --git a/assets/js/40.37b1d280.js b/assets/js/40.37b1d280.js new file mode 100644 index 0000000..6205081 --- /dev/null +++ b/assets/js/40.37b1d280.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{446:function(v,_,l){"use strict";l.r(_);var t=l(15),i=Object(t.a)({},(function(){var v=this,_=v.$createElement,l=v._self._c||_;return l("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[l("p",[v._v("Речь пойдет о выборе и использовании fullstack-инструментария после 10 лет занятия разработкой на проектах, из которых с нуля я начинал только 2.")]),v._v(" "),l("p",[v._v("Стек технологий очень важен, он выбирается один раз на всю жизнь проекта, а некоторые проекты вдруг обнаруживают что заменить mongodb на postgresql когда база данных уже весит несколько гигабайт и активно используется очень дорого, а найти разработчиков со знанием graphql очень сложно.")]),v._v(" "),l("p",[v._v("Поэтому при выборе очень часто принято отталкиваться от рынка. Ведь правда - чем больше хайпа вокруг фреймворка, тем проще на нем разрабатывать и искать исполнителей.")]),v._v(" "),l("p",[v._v("Я люблю Ruby on Rails, но выбрать его для нового проекта я бы не хотел, потому что замена разработчика будет стоить очень дорого.")]),v._v(" "),l("p",[v._v("Как бы мне не был отвратителен React и как бы у меня не болели глаза от миллионов строк кода, которые я увидел, выбирать Vue и Angular тоже довольно рискованно ввиду ригидности этих технологий.")]),v._v(" "),l("p",[v._v("Стек технологий обычно содержит")]),v._v(" "),l("ul",[l("li",[v._v("хранилище данных - это база данных и файловое хранилище\n"),l("ul",[l("li",[v._v("базы данных\n"),l("ul",[l("li",[v._v("Postgres")]),v._v(" "),l("li",[v._v("MS SQL")]),v._v(" "),l("li",[v._v("Elasticsearch")]),v._v(" "),l("li",[v._v("MongoDB")]),v._v(" "),l("li",[v._v("memcached,")]),v._v(" "),l("li",[v._v("Redis")]),v._v(" "),l("li",[v._v("etc...")])])]),v._v(" "),l("li",[v._v("хранилища\n"),l("ul",[l("li",[v._v("minio")]),v._v(" "),l("li",[v._v("S3")]),v._v(" "),l("li",[v._v("RAS")])])])])]),v._v(" "),l("li",[v._v("бэкенд-фреймворк - его выбор зависит от ландшафта и требований, обычно содержит ORM - синтаксический сахар над SQL-запросами.\n"),l("ul",[l("li",[v._v("Django (Python)")]),v._v(" "),l("li",[v._v("Ruby on Rails")]),v._v(" "),l("li",[v._v("ExpressJS (Nest, Next, Nuxt, Meteor)")]),v._v(" "),l("li",[v._v("Lavarel (PHP)")]),v._v(" "),l("li",[v._v(".Net core")]),v._v(" "),l("li",[v._v("Spring (Java)")]),v._v(" "),l("li",[v._v("Jamstack - Headless CMS (Strapi, Contentful, Gatsby) - пользовательский интерфейс для создания и изменения структур контента")])])]),v._v(" "),l("li",[v._v("фронтенд-фреймворк - его выбор зависит от набора компонентов пользовательского интерфейса и количества и динамичности данных которые будут обрабатываться на фронтенде.\n"),l("ul",[l("li",[v._v("React")]),v._v(" "),l("li",[v._v("Angular")]),v._v(" "),l("li",[v._v("Vue")]),v._v(" "),l("li",[v._v("Ember")]),v._v(" "),l("li",[v._v("Svelte")]),v._v(" "),l("li",[v._v("Tooling - typescript, eslint, prettier, webpack, turbopack, etc...")]),v._v(" "),l("li",[v._v("кроме прочего, нужно выбрать библиотеку компонент и css-framework (tailwind, bootstrap, foundation)")])])]),v._v(" "),l("li",[v._v("системы виртуализации-контейнеризации\n"),l("ul",[l("li",[v._v("Docker (kubernetes)")]),v._v(" "),l("li",[v._v("VMWare")])])]),v._v(" "),l("li",[v._v("API (внутренний или внешний программный интерфейс для интеграции), например:\n"),l("ul",[l("li",[v._v("Graphql")]),v._v(" "),l("li",[v._v("Kafka")]),v._v(" "),l("li",[v._v("Twilio")]),v._v(" "),l("li",[v._v("Auth0")])])])]),v._v(" "),l("p",[v._v("Также, в зависимости от требований проекта, необходимо заранее задуматься об инфраструктуре и процессе деплоя приложения")]),v._v(" "),l("ul",[l("li",[v._v("CI/CD")]),v._v(" "),l("li",[v._v("мониторинг (prometheus, graphana)")]),v._v(" "),l("li",[v._v("парсер логов (kibana)\nи выписать конкретные показатели которые необходимо отслеживать и ранжировать по критичности.")])]),v._v(" "),l("p",[v._v("Итак, для того чтобы выбрать стек, нужно определить проблему. Затем нужно определить ландшафт и данные, которые мы будем хранить и обрабатывать.")]),v._v(" "),l("p",[v._v("Возьмем для примера несколько кейсов из PropTech, EdTech, FinTech и HR-Tech.")]),v._v(" "),l("h2",{attrs:{id:"кеис-1-edtech"}},[l("a",{staticClass:"header-anchor",attrs:{href:"#кеис-1-edtech"}},[v._v("#")]),v._v(" Кейс 1. EdTech")]),v._v(" "),l("p",[v._v("Необходимо создать систему тестирования учащихся (без уточнения - школ, вузов, онлайн-курсов) с возможностью проведения нескольких видов тестов:")]),v._v(" "),l("ul",[l("li",[v._v("тест на выбор правильного ответа")]),v._v(" "),l("li",[v._v("тест со свободным полем ввода")]),v._v(" "),l("li",[v._v("тест-паззл")]),v._v(" "),l("li",[v._v("загрузка документа с ответом")])]),v._v(" "),l("p",[v._v("И SLA:")]),v._v(" "),l("ul",[l("li",[v._v("загрузка страницы должна быть меньше 1 секунды")]),v._v(" "),l("li",[v._v("система должна выдерживать одновременную нагрузку 10000 учеников.")])]),v._v(" "),l("h2",{attrs:{id:"кеис-2-fintech"}},[l("a",{staticClass:"header-anchor",attrs:{href:"#кеис-2-fintech"}},[v._v("#")]),v._v(" Кейс 2. FinTech")]),v._v(" "),l("p",[v._v("Необходимо создать консоль управления SaaS-инфраструктурой для облачного сервиса и интеграцией с AD заказчика.\nПользователь будет только один - генеральный директор компании, то есть продукт должен быть законченным и не содержать багов.")]),v._v(" "),l("h2",{attrs:{id:"кеис-3-proptech"}},[l("a",{staticClass:"header-anchor",attrs:{href:"#кеис-3-proptech"}},[v._v("#")]),v._v(" Кейс 3. PropTech")]),v._v(" "),l("p",[v._v("Необходимо создать облачное решение для планирования и технического надзора проектного строительства.\nТребования:")]),v._v(" "),l("ul",[l("li",[v._v("Автономная работа без интернета")]),v._v(" "),l("li",[v._v("Умение работать с BIM (стандартизированный формат файлов для описания архитектуры здания)")]),v._v(" "),l("li",[v._v("Безопасность данных\nЗадача - выстроить соответствия между конструкциями здания (водопровод, вентиляция, отделка, перекрытия) и конкретными подрядчиками, выполняющими данный вид работ.")])]),v._v(" "),l("h2",{attrs:{id:"кеис-4-hr-tech"}},[l("a",{staticClass:"header-anchor",attrs:{href:"#кеис-4-hr-tech"}},[v._v("#")]),v._v(" Кейс 4. HR-Tech")]),v._v(" "),l("p",[v._v('Необходимо создать продукт полного цикла для "стаффинга" - поиск и найм кандидатов, ведение личных дел, ознакомление с регламентами компании, фидбеки, интервью, распределение между проектами компании, API для получение информации из других систем и увольнение.')]),v._v(" "),l("h2",{attrs:{id:"кеис-5-личныи-блог-разработчика"}},[l("a",{staticClass:"header-anchor",attrs:{href:"#кеис-5-личныи-блог-разработчика"}},[v._v("#")]),v._v(" Кейс 5. Личный блог разработчика")]),v._v(" "),l("p",[v._v("Полушуточный кейс - необходимо создать бесплатную среду для записи и публикации мыслей в которую будет удобно писать и обслуживание хостинга не должно занимать много времени.")]),v._v(" "),l("hr"),v._v(" "),l("p",[v._v("Чтобы не перегружать статью, мой субъективный выбор архитектуры для каждого кейса будет подробно расписан в следующих статьях.")])])}),[],!1,null,null,null);_.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/41.8909e559.js b/assets/js/41.8909e559.js new file mode 100644 index 0000000..ee7e129 --- /dev/null +++ b/assets/js/41.8909e559.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{447:function(v,_,e){"use strict";e.r(_);var a=e(15),i=Object(a.a)({},(function(){var v=this,_=v.$createElement,e=v._self._c||_;return e("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[e("p",[v._v('Это вторая статья в цикле "Выбор стека технологий".')]),v._v(" "),e("p",[e("a",{attrs:{href:"/stack-1"}},[v._v("1. Выбор стека технологий (введение и кейсы)")])]),v._v(" "),e("p",[v._v("В первой статье мы определили содержание стека технологий. Это:")]),v._v(" "),e("ul",[e("li",[v._v("хранилище данных")]),v._v(" "),e("li",[v._v("бэкенд-фреймворк")]),v._v(" "),e("li",[v._v("фронтенд-фреймворк")]),v._v(" "),e("li",[v._v("системы виртуализации/контейнеризации")]),v._v(" "),e("li",[v._v("DevOps (IaC, мониторинг, логгирование), например, ELK (Elasticsearch, Logstash, Kibana)")])]),v._v(" "),e("hr"),v._v(" "),e("h2",{attrs:{id:"доступность-reliability"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#доступность-reliability"}},[v._v("#")]),v._v(" Доступность (reliability)")]),v._v(" "),e("p",[v._v("Доступность измеряется отношением общества количества запросов к количеству неответов.")]),v._v(" "),e("p",[v._v("Вернемся к кейсам и ранжируем их по требованиям к надежности:")]),v._v(" "),e("p",[v._v("EdTech - SLA 99.999% прописано в контракте (5 минут в год на обслуживание)")]),v._v(" "),e("p",[v._v("HR-Tech - business-critical, SLA 99.99%")]),v._v(" "),e("p",[v._v("PropTech - 2 часа offline в неделю, при том, что это PWA вполне допустимо.")]),v._v(" "),e("p",[v._v("FinTech - консоль SaaS будет использоваться раз в месяц, даже если пролежит неделю - не критично")]),v._v(" "),e("p",[v._v("Blog - мой блог лежал полгода и переезжал с домена на домен, самый менее критичный продукт с требованием к персистентности больше чем к доступности")]),v._v(" "),e("p",[v._v("По стеку что выбрано в результате и на ходу:")]),v._v(" "),e("p",[v._v("EdTech - Postgres, Java 17 Spring Boot, Low-Code, Next.js (SSG+Nginx), Tailwind, отдельный человек-SRE (Docker, minio, Yandex Cloud Kubernetes) - с появлением Java 19, пророчу Java долгую, но сложную жизнь")]),v._v(" "),e("p",[v._v("HR-Tech - Postgres, Java microservices, Angular 1X, Kafka, Shared SRE (0.3 FTE)")]),v._v(" "),e("p",[v._v("PropTech - MongoDB, Redis, Nest.js, React, no devops - MongoDB падает на 200 пользователях, переписать на Postgres - полгода работы пары человек минимум")]),v._v(" "),e("p",[v._v("FinTech - .Net Core (потому что Azure AD), Angular")]),v._v(" "),e("p",[v._v("Blog - GitHub Pages, VuePress, Markdown")]),v._v(" "),e("p",[v._v("По факту, как ни смешно, самым надежным оказался блог на GitHub Pages. Простота = надежность.")]),v._v(" "),e("p",[v._v("На других проектах DevOps-практика подкачала, деплои были большей частью ручные, а релизы - нестабильные.")]),v._v(" "),e("p",[v._v("Вывод - доступность приложения целиком и полностью зависит от Ops и инфраструктуры. Это база, которая закладывается на старте проекта.")]),v._v(" "),e("p",[v._v("Поэтому если доступность одно из требований, уже при инициализации проекта должны быть настроены бэкапы и восстановление, мониторинг, система оповещений об инцидентах, пайплайн поставок, тестовые стенды и простейшие автотесты.")]),v._v(" "),e("p",[v._v("Здесь мой выбор пал на GitLab, Jenkins и AWS. Ввиду отсутствия альтернатив. В случае российских проектов, Yandex Cloud достаточно production-ready с отзывчивой поддержкой.")]),v._v(" "),e("h2",{attrs:{id:"поддерживаемость"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#поддерживаемость"}},[v._v("#")]),v._v(" Поддерживаемость")]),v._v(" "),e("p",[v._v("По стандарту ISO/IEC 25010 поддерживаемость - набор атрибутов, содержащих необходимые усилия для внесения изменений.")]),v._v(" "),e("p",[v._v("Чтобы что-то изменить, это нужно - проанализировать, изменить, отладить и протестировать.")]),v._v(" "),e("p",[e("img",{attrs:{src:"/img.png",alt:"img.png"}})]),v._v(" "),e("p",[v._v("Как человек, проведший огромное количество времени за реверс-инженерией legacy-кода, я ставлю этот атрибут вторым параметром в уравнение поиска идеального стека.")]),v._v(" "),e("p",[v._v("Java 19 догнал в развитии Elixir/Erlang спустя 30 лет этой гонки.")]),v._v(" "),e("p",[v._v("Тем не менее, поддерживаемым код паралельных процессов и всего остального на Java назвать сложно.")]),v._v(" "),e("p",[v._v("Недаром в последнем опросе пользовательских предпочтений StackOverflow, Elixir на втором месте.")]),v._v(" "),e("p",[v._v("Если бы проекты можно было писать без оглядки на рынок, я бы взял для бэкенда Elixir. Ибо любой разработчик поймет код который на нем написан. И сможет писать на нем уже через пару недель. А вот с Java не так.")]),v._v(" "),e("p",[v._v("Elixir это не только синтаксис, сколько среда выполнения, обратите внимание на табличку ниже из книги Elixir in Action:\n"),e("img",{attrs:{src:"/img_1.png",alt:"img_1.png"}})]),v._v(" "),e("p",[v._v("Несмотря на то, что Elixir медленнее компилируемых языков, в плане реализации высокодоступных систем ему нет равных.")]),v._v(" "),e("p",[v._v("Поэтому если бы я выбирал стек технологий снова, он был бы таким:")]),v._v(" "),e("p",[v._v("EdTech - Postgres, Phoenix LiveView, Tailwind")]),v._v(" "),e("p",[v._v("HR-Tech - Postgres, Phoenix LiveView, Kafka")]),v._v(" "),e("p",[v._v("PropTech - просто убрал бы пересчет аналитики в транзакции, JS-стек стартапу подошел хорошо")]),v._v(" "),e("p",[v._v("FinTech - .Net Core (потому что Azure AD), Angular - по-другому никак")]),v._v(" "),e("p",[v._v("Blog - GitHub Pages, VuePress, Markdown - идеально")])])}),[],!1,null,null,null);_.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/42.2e395fd3.js b/assets/js/42.2e395fd3.js new file mode 100644 index 0000000..9633637 --- /dev/null +++ b/assets/js/42.2e395fd3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{448:function(v,_,a){"use strict";a.r(_);var t=a(15),e=Object(t.a)({},(function(){var v=this,_=v.$createElement,a=v._self._c||_;return a("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[a("p",[v._v('Это третья статья в цикле "Выбор стека технологий".')]),v._v(" "),a("p",[a("a",{attrs:{href:"/stack-1"}},[v._v("1. Выбор стека технологий (введение и кейсы)")]),v._v(" "),a("a",{attrs:{href:"/stack-2"}},[v._v("1. Выбор стека технологий (доступность и поддерживаемость)")])]),v._v(" "),a("p",[v._v("В первой статье мы определили содержание стека технологий. Это:")]),v._v(" "),a("ul",[a("li",[v._v("хранилище данных")]),v._v(" "),a("li",[v._v("бэкенд-фреймворк")]),v._v(" "),a("li",[v._v("фронтенд-фреймворк")]),v._v(" "),a("li",[v._v("системы виртуализации/контейнеризации")]),v._v(" "),a("li",[v._v("API")]),v._v(" "),a("li",[v._v("DevOps (IaC, мониторинг, логгирование), например, ELK (Elasticsearch, Logstash, Kibana)")])]),v._v(" "),a("p",[v._v("Во второй статье мы рассмотрели вопрос выбора стека с точки зрения атрибутов качества - доступность и поддерживаемость")]),v._v(" "),a("p",[v._v("В этой статье мы посмотрим на вопрос выбора стека ещё шире, глубже и конкретнее.")]),v._v(" "),a("blockquote",[a("p",[v._v("Critical thinking is the analysis of available facts, evidence, observations, and arguments to form a judgment.")]),v._v(" "),a("p",[v._v('Edward M. Glaser. "'),a("a",{attrs:{href:"https://www.criticalthinking.org/pages/defining-critical-thinking/766",target:"_blank",rel:"noopener noreferrer"}},[v._v("Defining Critical Thinking"),a("OutboundLink")],1),v._v('"')])]),v._v(" "),a("blockquote",[a("p",[v._v("Критическое мышление — способность человека ставить под сомнение поступающую информацию, включая собственные убеждения.")]),v._v(" "),a("p",[v._v("Википедия")])]),v._v(" "),a("p",[v._v("На что не стоит опираться при выборе стека:")]),v._v(" "),a("ul",[a("li",[v._v("Личные предпочтения")]),v._v(" "),a("li",[v._v("Хайп")]),v._v(" "),a("li",[v._v("Советы коллег из других компаний")]),v._v(" "),a("li",[v._v("Звездочки на Github-е")]),v._v(" "),a("li",[v._v("Опросы на Stackoverflow")])]),v._v(" "),a("p",[v._v("На что стоит делать упор:")]),v._v(" "),a("ul",[a("li",[v._v("Личный опыт успешных проектов")]),v._v(" "),a("li",[v._v("Доказанный опыт успешных проектов других компаний")]),v._v(" "),a("li",[v._v("Простоту и удобство использования")]),v._v(" "),a("li",[v._v("Наличие прототипов, реализующих задуманное на конкретной технологии")]),v._v(" "),a("li",[v._v("Отношение потенциальной пользы от внедрения к трудопотерям на внедрение")])]),v._v(" "),a("p",[v._v("Список вопросов, на которые стоит ответить при выборе любого решения, не только стека:")]),v._v(" "),a("ul",[a("li",[a("strong",[v._v("Как долго эта технология будет жива и пользоваться спросом?")]),v._v(" Flash, Pascal, VHS - популярные в прошлом, но забытые сейчас. Нужно брать технологии, у которых впереди в запасе как минимум 10 лет развития.")]),v._v(" "),a("li",[a("strong",[v._v("Легко ли обслуживать эту технологию?")]),v._v(' "Используя популярный тулсет вы с легкостью найдете специалиста" именно этим руководствовались миллионы проектов которые взяли React в качестве фронтенд-фреймворка. В итоге множество проектов завязли в некачественном коде из-за отсутствия архитектуры. Если вам нужно быстро выйти на рынок, проще всего взять PHP и Vue. Но на долгой дистанции с ними будет много мучений.')]),v._v(" "),a("li",[a("strong",[v._v("Какие обременения и накладные расходы у этой технологии?")]),v._v(" О выгодах мы задумываемся автоматически. Они ослепляют. Каждая новая технология это +1 человек к команде. Typescript - кто-то должен писать типы, UI Material - кто-то должен читать документацию, Docker - отдельный человек для написания helm-charts и тд.")]),v._v(" "),a("li",[a("strong",[v._v("Если это миграция - возможен ли откат, какова цена восстановления в случае неудачи?")])]),v._v(" "),a("li",[a("strong",[v._v("Если это внедрение нового - какова стоимость внедрения и сроки окупаемости?")])])]),v._v(" "),a("p",[v._v("Помимо всего прочего, важна экспертная оценка реализации проекта. Желательно иметь подробный ресурсный план для каждой технологии, написанный признанным экспертом.")]),v._v(" "),a("p",[v._v("Может оказаться, что реализация на Java и React займет год и 100 миллионов, но на Go и Angular - полгода и 20 миллионов. Выбор будет очевиден.")]),v._v(" "),a("h2",{attrs:{id:"пример-переусложнения"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#пример-переусложнения"}},[v._v("#")]),v._v(" Пример переусложнения")]),v._v(" "),a("p",[v._v("В этой выдуманной истории огромное количество скрытой иронии, прошу прощения.")]),v._v(" "),a("p",[v._v("Итак, представьте, у генерального директора Андрея появилась идея на миллиард, и даже предварительные договоренности о продажах. Он подходит к своему зятю-программисту Алексею и говорит - нужно сделать проект, поможешь?")]),v._v(" "),a("p",[v._v("Андрей назначает Алексея CTO (станция техобслуживания) и ждет первых результатов.")]),v._v(" "),a("p",[v._v("Алексей, не будучи дураком, начинает мыслить глобально, как настоящий профессионал.")]),v._v(" "),a("p",[v._v("Он начинает с Frontend-а. Язык - без вариантов - JavaScript. Точнее, его типизированная ипостась - Typescript. Из статей в интернете он узнает что у Angular очень высокий порог вхождения, Vue имеет слабую поддержку одним человеком, а jQuery уже устарел и выбирает React. Ведь на рынке огромная толпа разработчиков на React и астрономическое количество готовых компонентов для него. К тому же React не ограничивает архитектуру, гибкость инструмента способствует быстрой разработке.")]),v._v(" "),a("p",[v._v("Также он узнает что Bootstrap уже не моден и в качестве компонентной библиотеки выбирает Material-UI. А в качестве CSS-фреймворка Tailwind.")]),v._v(" "),a("p",[v._v("Также, для фронтенда ему пригодятся Webpack, icomoon и сотня-другая компонентов для реализации задуманного, включая websocket и canvas.")]),v._v(" "),a("p",[v._v("Ах да, он чуть не забыл про State-manager, коих уже десятки, он выбирает самый популярный Redux, ведь, чем больше boilerplate-кода, тем стабильнее и надежнее приложение.")]),v._v(" "),a("p",[v._v("Итак, на фронтенде - React, Redux, Material-UI, Tailwind, Webpack и много всего остального.")]),v._v(" "),a("p",[v._v("Бэкенд - тут Алексей решил не переусложнять, а оставить один язык для всего приложения и на сервере будет запущено приложение на Node.js. Повыбирав из фреймворков (Next.js, Nuxt.js, etc.js...), он решил взять то, что не имеет строгой привязки к фреймворку - Nest.js.")]),v._v(" "),a("p",[v._v("База данных - конечно MongoDB, ведь в интернете написано что она очень быстрая и гибкая. Но, на всякий случай, будем использовать ее как реляционную, все сущности будут связаны и лежать в отдельных коллекциях. Рядом будет in-memory cache Redis на случай большой нагрузки.")]),v._v(" "),a("p",[v._v("В качестве API Алексей решил сделать прямое соединение через Websocket. Это быстро, модно и просто.")]),v._v(" "),a("p",[v._v("Подумав ещё, Алексей решил сразу создать пайплайны CI/CD, и сразу запускать Docker-контейнеры в облако с помощью helm-чартов - в Kubernetes кластер, чтобы иметь возможность горизонтально масштабировать приложение автоматически.")]),v._v(" "),a("p",[v._v("А чтобы контейнеров было побольше - для пущей модульности - сразу решил разделить приложение на микросервисы и положить в разные репозитории, общение организовать через Kafka, а базу данных - реплицировать на три ноды, так точно будет работать быстрее.")]),v._v(" "),a("p",[v._v("Прошло несколько лет, продукт наконец вышел, рос медленно, но верно и продажи поднялись - продукт получил популярность, даже с такими высокими ценами. Алексей решает набрать команду и нанимает 7 фулл-стэк разработчиков. К этому моменту и в последствии, tailwindcss и material-ui использованы в 10% кода, React-компоненты встречаются и в виде классов, и в функциональном стиле со множеством перегруженных кастомных хуков.")]),v._v(" "),a("p",[v._v("А тем временем приложение начинает падать по три раза в день от наплыва пользователей - база данных съедает всю память на самой большой виртуальной машине в облаке потому что деплой в Kubernetes так и не смогли настроить ни подрядчики ни весь отдел разработки, хотя пытались по очереди все. Kafka тоже не поднялась.")]),v._v(" "),a("p",[v._v("Также возникают проблемы с уведомлениями - письма не доходят - падают в спам, заказчики не получают вовремя отчеты, а работа идет все медленнее и медленнее из-за количества багов ввиду излишней гибкости фронтенда.")]),v._v(" "),a("p",[v._v("Поскольку CTO не разбирался в серверах и у него никогда не было больших проектов, место на диске съели логи, продуктовый сервер был настроен абы как, а доступ к нему был у половины разработчиков в любое время без надзора. Разделения сред тоже не продумали, тестовый сервер оккупировал менеджмент для демонстраций заказчику, ломать его было нельзя, данные мало были похожи на реальные.")]),v._v(" "),a("p",[v._v("Наш CTO понимает что пора - пора осуществить задуманное - переехать с MongoDB на RDBMS, например, PostgreSQL, но количество написанных без ORM агрегаций, которыми так славится MongoDB, выглядело неподъемным. Redis не помогал, а больше мешал. Типы были перегруженными, а конвертация данных - повсеместной. В проекте насчитывались тысячи вызовов map и reduce.")]),v._v(" "),a("p",[v._v("Плюс, заказчики стали настаивать на том, чтобы приложение работало оффлайн (эту функцию откладывали до последнего, как слишком простую, были задачи поинтереснее, с canvas-ом). И тут выясняется, что нужно загрузить несколько гигабайт информации на устройство пользователя. А при каждом обновлении приложения эти данные стирать, потому что схема изменилась, то есть, писать миграции для State manager-а.")]),v._v(" "),a("p",[v._v("Генеральный директор, видя что приложение падает под напором, предлагает самым крупным заказчикам беспрецендентный шаг - ради их же безопасности, компания будет устанавливать приложение на сервера заказчика. Первая установка прошла успешно, вторая тоже, но автоматизировать процесс установки не получается - можно только вручную и особо обученным сотрудником - человеком, разбирающемся в приложении, интеграциях и unix-серверах. Такой стоит недешево.")]),v._v(" "),a("p",[v._v("В общем и целом, оверинжиниринг во всей красе - 12 окружений которые нужно обновлять только вручную и только по выходным, плюс множество технологий, которые сильно усложняют общую картину, хотя, казалось бы, призваны решать проблемы.")]),v._v(" "),a("p",[v._v("Цена упрощения такого проекта - примерно 10 миллионов рублей. Это выделенная команда для миграции из 6 человек на год работы.")]),v._v(" "),a("p",[v._v("Несмотря на то, что проект успел заработать в несколько раз больше - такой огромный технический долг его может потопить.")]),v._v(" "),a("h2",{attrs:{id:"пример-упрощения"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#пример-упрощения"}},[v._v("#")]),v._v(" Пример упрощения")]),v._v(" "),a("p",[v._v("В целом, стэк был выбран разумно, но к переусложнению привели другие факторы. Время разобраться.")]),v._v(" "),a("p",[v._v("Давайте сначала выпишем ошибки, которые были допущены выше:")]),v._v(" "),a("ol",[a("li",[v._v("Использование MongoDB как реляционной базы данных привело к дорогим проблемам производительности")]),v._v(" "),a("li",[v._v("Чрезмерная преждевременная оптимизация и решение вымышленных проблем масштабирования привело к потере времени на настройку")]),v._v(" "),a("li",[v._v("Назначение CTO малокомпетентного и неопытного человека")])]),v._v(" "),a("p",[v._v("Исходя из этого, фундамент проекта стоило заложить так:")]),v._v(" "),a("ul",[a("li",[v._v("Использовать MongoDB в качестве хранилища, но как NoSQL - так будет проще работать с данными - агрегации все равно запускаются на JavaScript, также будет проще переходить на реляционную базу - запросы будут проще, да и на несколько баз разделить проще")]),v._v(" "),a("li",[v._v("Ввести правило оценивать трудозатраты и потенциальную выгоду от реализации фич, таким образом ни функциональность, ни архитектура решения не будут страдать от жажды скорой наживы")]),v._v(" "),a("li",[v._v("Начать с самого простого - с монолита, так как очень редко встречаются настолько огромные проекты чтобы вводить микросервисную архитектуру")]),v._v(" "),a("li",[v._v("Поставки приложения - в виде образа виртуальной машины, который достаточно просто развернуть в среде заказчика, руками самого заказчика")]),v._v(" "),a("li",[v._v("Описать архитектуру проекта в виде 4D и менять по мере необходимости")]),v._v(" "),a("li",[v._v("На ранних стадиях ввести мониторинг систем, установить ELK стэк и настроить режим логгирования, бэкапа, управления инцидентами")]),v._v(" "),a("li",[v._v('Следовать принципу "проще - лучше", причем, "так быстрее" - почти всегда плохо и приводит к сложностям')])])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/43.6674ceae.js b/assets/js/43.6674ceae.js new file mode 100644 index 0000000..476eae9 --- /dev/null +++ b/assets/js/43.6674ceae.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{449:function(e,t,s){"use strict";s.r(t);var n=s(15),l=Object(n.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("p",[e._v("My personal website... None of your business 😃")]),e._v(" "),s("p",[e._v("Это блог. Он посвящен моей деятельности и достижениям как разработчика, музыканта, человека. Недавно мне пришлось доказывать что я не верблюд, уверен, этот сайт поможет мне больше не попадать в такие ситуации.")]),e._v(" "),s("p",[e._v("Технологии и Тулсет:")]),e._v(" "),s("ul",[s("li",[s("s",[e._v("Jekyll")]),e._v(" (╯°□°)╯︵ ┻━┻,")]),e._v(" "),s("li",[e._v("В основе - фреймворк Vuepress, расширенный собственными компонентами,")]),e._v(" "),s("li",[e._v("Среди них - анимированный Canvas (Вкл!) в заголовке и несколько анимаций внутри статей,")]),e._v(" "),s("li",[e._v("Эта и другие страницы находятся на приветливых GitHub Pages, куда попадают через GitHub Actions.")])])])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/5.7440ad18.js b/assets/js/5.7440ad18.js new file mode 100644 index 0000000..bb86b91 --- /dev/null +++ b/assets/js/5.7440ad18.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{376:function(t,e,n){"use strict";n(377)("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),n(378))},377:function(t,e,n){"use strict";var r=n(3),i=n(0),o=n(4),s=n(118),a=n(18),u=n(199),l=n(198),f=n(197),v=n(6),c=n(8),d=n(5),h=n(122),p=n(44),g=n(200);t.exports=function(t,e,n){var x=-1!==t.indexOf("Map"),_=-1!==t.indexOf("Weak"),w=x?"set":"add",y=i[t],m=y&&y.prototype,z=y,b={},S=function(t){var e=o(m[t]);a(m,t,"add"==t?function(t){return e(this,0===t?0:t),this}:"delete"==t?function(t){return!(_&&!c(t))&&e(this,0===t?0:t)}:"get"==t?function(t){return _&&!c(t)?void 0:e(this,0===t?0:t)}:"has"==t?function(t){return!(_&&!c(t))&&e(this,0===t?0:t)}:function(t,n){return e(this,0===t?0:t,n),this})};if(s(t,!v(y)||!(_||m.forEach&&!d((function(){(new y).entries().next()})))))z=n.getConstructor(e,t,x,w),u.enable();else if(s(t,!0)){var k=new z,E=k[w](_?{}:-0,1)!=k,M=d((function(){k.has(1)})),O=h((function(t){new y(t)})),C=!_&&d((function(){for(var t=new y,e=5;e--;)t[w](e,e);return!t.has(-0)}));O||((z=e((function(t,e){f(t,m);var n=g(new y,t,z);return null!=e&&l(e,n[w],{that:n,AS_ENTRIES:x}),n}))).prototype=m,m.constructor=z),(M||C)&&(S("delete"),S("has"),x&&S("get")),(C||E)&&S(w),_&&m.clear&&delete m.clear}return b[t]=z,r({global:!0,forced:z!=y},b),p(z,t),_||n.setStrong(z,t,x),z}},378:function(t,e,n){"use strict";var r=n(14).f,i=n(28),o=n(202),s=n(45),a=n(197),u=n(198),l=n(121),f=n(203),v=n(10),c=n(199).fastKey,d=n(38),h=d.set,p=d.getterFor;t.exports={getConstructor:function(t,e,n,l){var f=t((function(t,r){a(t,d),h(t,{type:e,index:i(null),first:void 0,last:void 0,size:0}),v||(t.size=0),null!=r&&u(r,t[l],{that:t,AS_ENTRIES:n})})),d=f.prototype,g=p(e),x=function(t,e,n){var r,i,o=g(t),s=_(t,e);return s?s.value=n:(o.last=s={index:i=c(e,!0),key:e,value:n,previous:r=o.last,next:void 0,removed:!1},o.first||(o.first=s),r&&(r.next=s),v?o.size++:t.size++,"F"!==i&&(o.index[i]=s)),t},_=function(t,e){var n,r=g(t),i=c(e);if("F"!==i)return r.index[i];for(n=r.first;n;n=n.next)if(n.key==e)return n};return o(d,{clear:function(){for(var t=g(this),e=t.index,n=t.first;n;)n.removed=!0,n.previous&&(n.previous=n.previous.next=void 0),delete e[n.index],n=n.next;t.first=t.last=void 0,v?t.size=0:this.size=0},delete:function(t){var e=g(this),n=_(this,t);if(n){var r=n.next,i=n.previous;delete e.index[n.index],n.removed=!0,i&&(i.next=r),r&&(r.previous=i),e.first==n&&(e.first=r),e.last==n&&(e.last=i),v?e.size--:this.size--}return!!n},forEach:function(t){for(var e,n=g(this),r=s(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:n.first;)for(r(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!_(this,t)}}),o(d,n?{get:function(t){var e=_(this,t);return e&&e.value},set:function(t,e){return x(this,0===t?0:t,e)}}:{add:function(t){return x(this,t=0===t?0:t,t)}}),v&&r(d,"size",{get:function(){return g(this).size}}),f},setStrong:function(t,e,n){var r=e+" Iterator",i=p(e),o=p(r);l(t,e,(function(t,e){h(this,{type:r,target:t,state:i(t),kind:e,last:void 0})}),(function(){for(var t=o(this),e=t.kind,n=t.last;n&&n.removed;)n=n.previous;return t.target&&(t.last=n=n?n.next:t.state.first)?"keys"==e?{value:n.key,done:!1}:"values"==e?{value:n.value,done:!1}:{value:[n.key,n.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),n?"entries":"values",!n,!0),f(e)}}},379:function(t,e,n){var r=n(3),i=n(380),o=n(120);r({target:"Array",proto:!0},{fill:i}),o("fill")},380:function(t,e,n){"use strict";var r=n(16),i=n(89),o=n(22);t.exports=function(t){for(var e=r(this),n=o(e),s=arguments.length,a=i(s>1?arguments[1]:void 0,n),u=s>2?arguments[2]:void 0,l=void 0===u?n:i(u,n);l>a;)e[a++]=t;return e}},411:function(t,e,n){"use strict";n.r(e);var r=n(60),i=(n(376),n(9),n(21),n(27),n(379),{mounted:function(){var t=document.getElementById("circle-of-life").getContext("2d");t.imageSmoothingEnabled=!0,t.shadowBlur=2,t.shadowOffsetX=0,t.shadowOffsetY=0;var e=new Map;e.set("Здоровье",5),e.set("Работа",8),e.set("Личное пространство",5),e.set("Отношения",7),e.set("Секс",3),e.set("Репутация",3),e.set("Отношения с собой",3);var n=i(360/e.size);function i(t){return t*Math.PI/180}function o(){return"rgba("+Math.round(255*Math.random())+", "+Math.round(255*Math.random())+","+Math.round(255*Math.random())+")"}!function(){for(var i=0;in+50&&(o.location.x=0),o.location.y<0&&(o.location.y=r+50),o.location.y>r+50&&(o.location.y=0)}}function d(){s(o),n=window.innerWidth,r=window.innerWidth/("/"===i.$page.path?2:4),c.style.height=r+"px",c.style.width=n+"px",c.style.overflow="hidden",u.width=n,u.height=r,t=[],e=r/5;for(var f=0;f=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function h(t){return null==t?"":Array.isArray(t)||f(t)&&t.toString===u?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function m(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function _(t,e){return b.call(t,e)}function x(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var w=/-(\w)/g,k=x((function(t){return t.replace(w,(function(t,e){return e?e.toUpperCase():""}))})),O=x((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),S=/\B([A-Z])/g,E=x((function(t){return t.replace(S,"-$1").toLowerCase()}));var $=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function j(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function C(t,e){for(var n in e)t[n]=e[n];return t}function P(t){for(var e={},n=0;n0,J=G&&G.indexOf("edge/")>0,X=(G&&G.indexOf("android"),G&&/iphone|ipad|ipod|ios/.test(G)||"ios"===Z),Q=(G&&/chrome\/\d+/.test(G),G&&/phantomjs/.test(G),G&&G.match(/firefox\/(\d+)/)),tt={}.watch,et=!1;if(q)try{var nt={};Object.defineProperty(nt,"passive",{get:function(){et=!0}}),window.addEventListener("test-passive",null,nt)}catch(t){}var rt=function(){return void 0===B&&(B=!q&&!W&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ot=q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function it(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,st="undefined"!=typeof Symbol&&it(Symbol)&&"undefined"!=typeof Reflect&&it(Reflect.ownKeys);at="undefined"!=typeof Set&&it(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ct=A,ut=0,ft=function(){this.id=ut++,this.subs=[]};ft.prototype.addSub=function(t){this.subs.push(t)},ft.prototype.removeSub=function(t){g(this.subs,t)},ft.prototype.depend=function(){ft.target&&ft.target.addDep(this)},ft.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(i&&!_(o,"default"))a=!1;else if(""===a||a===E(t)){var c=Ut(String,o.type);(c<0||s0&&(le((c=t(c,(n||"")+"_"+r))[0])&&le(f)&&(l[u]=yt(f.text+c[0].text),c.shift()),l.push.apply(l,c)):s(c)?le(f)?l[u]=yt(f.text+c):""!==c&&l.push(yt(c)):le(c)&&le(f)?l[u]=yt(f.text+c.text):(a(e._isVList)&&i(c.tag)&&o(c.key)&&i(n)&&(c.key="__vlist"+n+"_"+r+"__"),l.push(c)));return l}(t):void 0}function le(t){return i(t)&&i(t.text)&&!1===t.isComment}function pe(t,e){if(t){for(var n=Object.create(null),r=st?Reflect.ownKeys(t):Object.keys(t),o=0;o0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&n&&n!==r&&s===n.$key&&!i&&!n.$hasNormal)return n;for(var c in o={},t)t[c]&&"$"!==c[0]&&(o[c]=ye(e,c,t[c]))}else o={};for(var u in e)u in o||(o[u]=ge(e,u));return t&&Object.isExtensible(t)&&(t._normalized=o),H(o,"$stable",a),H(o,"$key",s),H(o,"$hasNormal",i),o}function ye(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({}),e=(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:fe(t))&&t[0];return t&&(!e||1===t.length&&e.isComment&&!ve(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function ge(t,e){return function(){return t[e]}}function be(t,e){var n,r,o,a,s;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;rdocument.createEvent("Event").timeStamp&&(un=function(){return fn.now()})}function ln(){var t,e;for(cn=un(),an=!0,en.sort((function(t,e){return t.id-e.id})),sn=0;snsn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);on||(on=!0,ne(ln))}}(this)},dn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||c(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';Vt(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},dn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},dn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},dn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:A,set:A};function vn(t,e,n){hn.get=function(){return this[e][n]},hn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,hn)}function mn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},o=t.$options._propKeys=[];t.$parent&&kt(!1);var i=function(i){o.push(i);var a=Dt(i,e,n,t);Et(r,i,a),i in t||vn(t,"_props",i)};for(var a in e)i(a);kt(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?A:$(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;f(e=t._data="function"==typeof e?function(t,e){pt();try{return t.call(e,e)}catch(t){return Bt(t,e,"data()"),{}}finally{dt()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,o=(t.$options.methods,n.length);for(;o--;){var i=n[o];0,r&&_(r,i)||(a=void 0,36!==(a=(i+"").charCodeAt(0))&&95!==a&&vn(t,"_data",i))}var a;St(e,!0)}(t):St(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=rt();for(var o in e){var i=e[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new dn(t,a||A,A,yn)),o in t||gn(t,o,i)}}(t,e.computed),e.watch&&e.watch!==tt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!l(t)&&t.test(e)}function jn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&Cn(n,i,r,o)}}}function Cn(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,g(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=wn++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=It(kn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ke(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=de(e._renderChildren,o),t.$scopedSlots=r,t._c=function(e,n,r,o){return He(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return He(t,e,n,r,o,!0)};var i=n&&n.data;Et(t,"$attrs",i&&i.attrs||r,null,!0),Et(t,"$listeners",e._parentListeners||r,null,!0)}(e),tn(e,"beforeCreate"),function(t){var e=pe(t.$options.inject,t);e&&(kt(!1),Object.keys(e).forEach((function(n){Et(t,n,e[n])})),kt(!0))}(e),mn(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),tn(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(On),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=$t,t.prototype.$delete=jt,t.prototype.$watch=function(t,e,n){if(f(e))return xn(this,t,e,n);(n=n||{}).user=!0;var r=new dn(this,t,e,n);if(n.immediate){var o='callback for immediate watcher "'+r.expression+'"';pt(),Vt(e,this,[r.value],this,o),dt()}return function(){r.teardown()}}}(On),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var o=0,i=t.length;o1?j(n):n;for(var r=j(arguments,1),o='event handler for "'+t+'"',i=0,a=n.length;iparseInt(this.max)&&Cn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Cn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){jn(t,(function(t){return $n(e,t)}))})),this.$watch("exclude",(function(e){jn(t,(function(t){return!$n(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=qe(t),n=e&&e.componentOptions;if(n){var r=En(n),o=this.include,i=this.exclude;if(o&&(!r||!$n(o,r))||i&&r&&$n(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,g(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return N}};Object.defineProperty(t,"config",e),t.util={warn:ct,extend:C,mergeOptions:It,defineReactive:Et},t.set=$t,t.delete=jt,t.nextTick=ne,t.observable=function(t){return St(t),t},t.options=Object.create(null),R.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,C(t.options.components,An),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=j(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=It(this.options,t),this}}(t),Sn(t),function(t){R.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&f(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(On),Object.defineProperty(On.prototype,"$isServer",{get:rt}),Object.defineProperty(On.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(On,"FunctionalRenderContext",{value:Me}),On.version="2.6.14";var Tn=m("style,class"),Ln=m("input,textarea,option,select,progress"),Mn=m("contenteditable,draggable,spellcheck"),zn=m("events,caret,typing,plaintext-only"),In=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Rn="http://www.w3.org/1999/xlink",Dn=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Nn=function(t){return Dn(t)?t.slice(6,t.length):""},Fn=function(t){return null==t||!1===t};function Hn(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Un(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=Un(e,n.data));return function(t,e){if(i(t)||i(e))return Bn(t,Vn(e));return""}(e.staticClass,e.class)}function Un(t,e){return{staticClass:Bn(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Bn(t,e){return t?e?t+" "+e:t:e||""}function Vn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?dr(t,e,n):In(e)?Fn(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Mn(e)?t.setAttribute(e,function(t,e){return Fn(e)||"false"===e?"false":"contenteditable"===t&&zn(e)?e:"true"}(e,n)):Dn(e)?Fn(n)?t.removeAttributeNS(Rn,Nn(e)):t.setAttributeNS(Rn,e,n):dr(t,e,n)}function dr(t,e,n){if(Fn(n))t.removeAttribute(e);else{if(K&&!Y&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var hr={create:lr,update:lr};function vr(t,e){var n=e.elm,r=e.data,a=t.data;if(!(o(r.staticClass)&&o(r.class)&&(o(a)||o(a.staticClass)&&o(a.class)))){var s=Hn(e),c=n._transitionClasses;i(c)&&(s=Bn(s,Vn(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var mr,yr={create:vr,update:vr};function gr(t,e,n){var r=mr;return function o(){var i=e.apply(null,arguments);null!==i&&xr(t,o,n,r)}}var br=Gt&&!(Q&&Number(Q[1])<=53);function _r(t,e,n,r){if(br){var o=cn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}mr.addEventListener(t,e,et?{capture:n,passive:r}:n)}function xr(t,e,n,r){(r||mr).removeEventListener(t,e._wrapper||e,n)}function wr(t,e){if(!o(t.data.on)||!o(e.data.on)){var n=e.data.on||{},r=t.data.on||{};mr=e.elm,function(t){if(i(t.__r)){var e=K?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}i(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),se(n,r,_r,xr,gr,e.context),mr=void 0}}var kr,Or={create:wr,update:wr};function Sr(t,e){if(!o(t.data.domProps)||!o(e.data.domProps)){var n,r,a=e.elm,s=t.data.domProps||{},c=e.data.domProps||{};for(n in i(c.__ob__)&&(c=e.data.domProps=C({},c)),s)n in c||(a[n]="");for(n in c){if(r=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var u=o(r)?"":String(r);Er(a,u)&&(a.value=u)}else if("innerHTML"===n&&Zn(a.tagName)&&o(a.innerHTML)){(kr=kr||document.createElement("div")).innerHTML=""+r+"";for(var f=kr.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;f.firstChild;)a.appendChild(f.firstChild)}else if(r!==s[n])try{a[n]=r}catch(t){}}}}function Er(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var $r={create:Sr,update:Sr},jr=x((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Cr(t){var e=Pr(t.style);return t.staticStyle?C(t.staticStyle,e):e}function Pr(t){return Array.isArray(t)?P(t):"string"==typeof t?jr(t):t}var Ar,Tr=/^--/,Lr=/\s*!important$/,Mr=function(t,e,n){if(Tr.test(e))t.style.setProperty(e,n);else if(Lr.test(n))t.style.setProperty(E(e),n.replace(Lr,""),"important");else{var r=Ir(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(Nr).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Hr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(Nr).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function Ur(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&C(e,Br(t.name||"v")),C(e,t),e}return"string"==typeof t?Br(t):void 0}}var Br=x((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Vr=q&&!Y,qr="transition",Wr="transitionend",Zr="animation",Gr="animationend";Vr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(qr="WebkitTransition",Wr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Zr="WebkitAnimation",Gr="webkitAnimationEnd"));var Kr=q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Yr(t){Kr((function(){Kr(t)}))}function Jr(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),Fr(t,e))}function Xr(t,e){t._transitionClasses&&g(t._transitionClasses,e),Hr(t,e)}function Qr(t,e,n){var r=eo(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?Wr:Gr,c=0,u=function(){t.removeEventListener(s,f),n()},f=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n="transition",f=a,l=i.length):"animation"===e?u>0&&(n="animation",f=u,l=c.length):l=(n=(f=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:f,propCount:l,hasTransform:"transition"===n&&to.test(r[qr+"Property"])}}function no(t,e){for(;t.length1}function co(t,e){!0!==e.data.show&&oo(e)}var uo=function(t){var e,n,r={},c=t.modules,u=t.nodeOps;for(e=0;eh?b(t,o(n[y+1])?null:n[y+1].elm,n,d,y,r):d>y&&x(e,p,h)}(p,m,y,n,f):i(y)?(i(t.text)&&u.setTextContent(p,""),b(p,null,y,0,y.length-1,n)):i(m)?x(m,0,m.length-1):i(t.text)&&u.setTextContent(p,""):t.text!==e.text&&u.setTextContent(p,e.text),i(h)&&i(d=h.hook)&&i(d=d.postpatch)&&d(t,e)}}}function S(t,e,n){if(a(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(M(vo(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function ho(t,e){return e.every((function(e){return!M(e,t)}))}function vo(t){return"_value"in t?t._value:t.value}function mo(t){t.target.composing=!0}function yo(t){t.target.composing&&(t.target.composing=!1,go(t.target,"input"))}function go(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function bo(t){return!t.componentInstance||t.data&&t.data.transition?t:bo(t.componentInstance._vnode)}var _o={model:fo,show:{bind:function(t,e,n){var r=e.value,o=(n=bo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,oo(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=bo(n)).data&&n.data.transition?(n.data.show=!0,r?oo(n,(function(){t.style.display=t.__vOriginalDisplay})):io(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},xo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function wo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?wo(qe(e.children)):t}function ko(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var i in o)e[k(i)]=o[i];return e}function Oo(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var So=function(t){return t.tag||ve(t)},Eo=function(t){return"show"===t.name},$o={name:"transition",props:xo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(So)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=wo(o);if(!i)return o;if(this._leaving)return Oo(t,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var c=(i.data||(i.data={})).transition=ko(this),u=this._vnode,f=wo(u);if(i.data.directives&&i.data.directives.some(Eo)&&(i.data.show=!0),f&&f.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,f)&&!ve(f)&&(!f.componentInstance||!f.componentInstance._vnode.isComment)){var l=f.data.transition=C({},c);if("out-in"===r)return this._leaving=!0,ce(l,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Oo(t,o);if("in-out"===r){if(ve(i))return u;var p,d=function(){p()};ce(c,"afterEnter",d),ce(c,"enterCancelled",d),ce(l,"delayLeave",(function(t){p=t}))}}return o}}},jo=C({tag:String,moveClass:String},xo);function Co(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function Po(t){t.data.newPos=t.elm.getBoundingClientRect()}function Ao(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete jo.mode;var To={Transition:$o,TransitionGroup:{props:jo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Je(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ko(this),s=0;s-1?Kn[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Kn[t]=/HTMLUnknownElement/.test(e.toString())},C(On.options.directives,_o),C(On.options.components,To),On.prototype.__patch__=q?uo:A,On.prototype.$mount=function(t,e){return function(t,e,n){var r;return t.$el=e,t.$options.render||(t.$options.render=mt),tn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new dn(t,r,A,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,tn(t,"mounted")),t}(this,t=t&&q?function(t){if("string"==typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}(t):void 0,e)},q&&setTimeout((function(){N.devtools&&ot&&ot.emit("init",On)}),0),e.a=On},function(t,e,n){var r=n(0),o=n(39).f,i=n(24),a=n(18),s=n(94),c=n(100),u=n(118);t.exports=function(t,e){var n,f,l,p,d,h=t.target,v=t.global,m=t.stat;if(n=v?r:m?r[h]||s(h,{}):(r[h]||{}).prototype)for(f in e){if(p=e[f],l=t.noTargetGet?(d=o(n,f))&&d.value:n[f],!u(v?f:h+(m?".":"#")+f,t.forced)&&void 0!==l){if(typeof p==typeof l)continue;c(p,l)}(t.sham||l&&l.sham)&&i(p,"sham",!0),a(n,f,p,t)}}},function(t,e,n){var r=n(48),o=Function.prototype,i=o.bind,a=o.call,s=r&&i.bind(a,a);t.exports=r?function(t){return t&&s(t)}:function(t){return t&&function(){return a.apply(t,arguments)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){t.exports=function(t){return"function"==typeof t}},function(t,e,n){var r=n(0),o=n(65),i=n(12),a=n(66),s=n(95),c=n(132),u=o("wks"),f=r.Symbol,l=f&&f.for,p=c?f:f&&f.withoutSetter||a;t.exports=function(t){if(!i(u,t)||!s&&"string"!=typeof u[t]){var e="Symbol."+t;s&&i(f,t)?u[t]=f[t]:u[t]=c&&l?l(e):p(e)}return u[t]}},function(t,e,n){var r=n(6);t.exports=function(t){return"object"==typeof t?null!==t:r(t)}},function(t,e,n){var r=n(104),o=n(18),i=n(234);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(t,e,n){var r=n(5);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,e,n){var r=n(0),o=n(8),i=r.String,a=r.TypeError;t.exports=function(t){if(o(t))return t;throw a(i(t)+" is not an object")}},function(t,e,n){var r=n(4),o=n(16),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return i(o(t),e)}},function(t,e,n){var r=n(48),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){var r=n(0),o=n(10),i=n(135),a=n(134),s=n(11),c=n(68),u=r.TypeError,f=Object.defineProperty,l=Object.getOwnPropertyDescriptor;e.f=o?a?function(t,e,n){if(s(t),e=c(e),s(n),"function"==typeof t&&"prototype"===e&&"value"in n&&"writable"in n&&!n.writable){var r=l(t,e);r&&r.writable&&(t[e]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return f(t,e,n)}:f:function(t,e,n){if(s(t),e=c(e),s(n),i)try{return f(t,e,n)}catch(t){}if("get"in n||"set"in n)throw u("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){"use strict";function r(t,e,n,r,o,i,a,s){var c,u="function"==typeof t?t.options:t;if(e&&(u.render=e,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},u._ssrRegister=c):o&&(c=s?function(){o.call(this,(u.functional?this.parent:this).$root.$options.shadowRoot)}:o),c)if(u.functional){u._injectStyles=c;var f=u.render;u.render=function(t,e){return c.call(e),f(t,e)}}else{var l=u.beforeCreate;u.beforeCreate=l?[].concat(l,c):[c]}return{exports:t,options:u}}n.d(e,"a",(function(){return r}))},function(t,e,n){var r=n(0),o=n(36),i=r.Object;t.exports=function(t){return i(o(t))}},function(t,e,n){var r=n(0),o=n(6),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},function(t,e,n){var r=n(0),o=n(6),i=n(12),a=n(24),s=n(94),c=n(73),u=n(38),f=n(99).CONFIGURABLE,l=u.get,p=u.enforce,d=String(String).split("String");(t.exports=function(t,e,n,c){var u,l=!!c&&!!c.unsafe,h=!!c&&!!c.enumerable,v=!!c&&!!c.noTargetGet,m=c&&void 0!==c.name?c.name:e;o(n)&&("Symbol("===String(m).slice(0,7)&&(m="["+String(m).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!i(n,"name")||f&&n.name!==m)&&a(n,"name",m),(u=p(n)).source||(u.source=d.join("string"==typeof m?m:""))),t!==r?(l?!v&&t[e]&&(h=!0):delete t[e],h?t[e]=n:a(t,e,n)):h?t[e]=n:s(e,n)})(Function.prototype,"toString",(function(){return o(this)&&l(this).source||c(this)}))},function(t,e,n){var r=n(0),o=n(74),i=r.String;t.exports=function(t){if("Symbol"===o(t))throw TypeError("Cannot convert a Symbol value to a string");return i(t)}},function(t,e,n){var r=n(47),o=n(36);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(153).charAt,o=n(19),i=n(38),a=n(121),s=i.set,c=i.getterFor("String Iterator");a(String,"String",(function(t){s(this,{type:"String Iterator",string:o(t),index:0})}),(function(){var t,e=c(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r=n(90);t.exports=function(t){return r(t.length)}},function(t,e){t.exports=!1},function(t,e,n){var r=n(10),o=n(14),i=n(41);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(170),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(0),o=n(154),i=n(155),a=n(131),s=n(24),c=n(7),u=c("iterator"),f=c("toStringTag"),l=a.values,p=function(t,e){if(t){if(t[u]!==l)try{s(t,u,l)}catch(e){t[u]=l}if(t[f]||s(t,f,e),o[e])for(var n in a)if(t[n]!==a[n])try{s(t,n,a[n])}catch(e){t[n]=a[n]}}};for(var d in o)p(r[d]&&r[d].prototype,d);p(i,"DOMTokenList")},function(t,e,n){var r,o=n(11),i=n(133),a=n(97),s=n(49),c=n(137),u=n(67),f=n(72),l=f("IE_PROTO"),p=function(){},d=function(t){return" + + diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 0000000..8c15290 --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,77 @@ + + + + + + Page 2 | Home | Alterforia + + + + + + + + + + + +
Новый сингл

+ Стоило отписаться от Яндекс Музыки, мой мозг сразу стал генератором собственной. +Свежачок: +<iframe width="100%" height="600" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud. ... +

Принципиальность

+ Принципиальный человек - хороший специалист, но хреновый сотрудник. Из-за его принципов страдают все - и коллеги, и заказчик. О принципах не спорят, если ты придерживаешься каких-то других принципов - ... +

Гиперответственность

+ Гиперответственность - это хомут, который несут гордо. Со временем (чем больше человек делает для других, но не получает того же) формируется стойкое ощущение "мне все должны" и чувство собственной ва ... +

Жизненный цикл разработки (SDLC)

+ Всё, что нужно знать об SDLC и Agile, это то, что это про деньги. Чем чаще релизы, тем чаще можно брать за это деньги. + +Документация, ревизия кода, рефакторинг, работа с техдолгом, чеклисты, тесты, ми ... +

Стрессоустойчивость

+ Это, наверное, тот самый важный навык, которого мне не хватает. На одном из собеседований на стандартный вопрос "А как у вас со стрессоустойчивостью" я на голубом глазу ответил что я не стрессоустойчи ... +

Critical Rendering Path

+ Critical Rendering Path это последовательность шагов по превращению браузером HTML, CSS и JavaScript в пиксели на экране. + +Итак, браузер получает на обработку HTML-файл. Парсер проходит его байт за ба ... +

Моббинг

+ Травля - это агрессивное преследование одного из членов коллектива. У взрослых, в рабочей среде, это называется моббинг. Как явление обозначено в 80-х годах прошлого века. + +Моббинг как правило имеет ... +

GraphQL резолверы

+ Да, наконец-то техническая статья :) + +Резолверы это ядро языка запросов, о котором пойдёт речь. + +Сначала пара слов о том, что такое GraphQL и зачем он понадобился. + +Когда микросервисы вошли в обиход л ... +

Эмпатия

+ Эмпатия это осознанное сопереживание другому человеку без потери ощущения источника этого переживания. + +Если источник переживания не осознаётся, это называется слиянием, отождествлением себя с другим. ... +

+ + + diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 0000000..59e84b0 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,76 @@ + + + + + + Page 3 | Home | Alterforia + + + + + + + + + + + +
Работа из дома

+ Я начал работать из дома после 10 лет работы в офисе. Задолго до того как это стало мэйнстримом, в 2018 году я перешёл на удалёнку full-time, прекрасно понимая с какими трудностями мне придётся столкн ... +

Архетипы

+ Архетипы как психологическое понятие введено в прошлом веке Карлом Густавом Юнгом для обозначения структурного элемента коллективного бессознательного – захватывающие "изначальные" образы, которые при ... +

Немного конфликтологии

+ В конфликты попадают так или иначе все, но все мы по-разному из них выходим. + +Под конфликтом я понимаю состояние ситуации, когда есть два субъекта и есть их отношение по поводу какого-либо объекта, пр ... +

Межпозвоночная грыжа

+ Это больно. Это неприятно. Это может довести до отчаяния. + +Упражнение от даосских мастеров на проработку всего позвоночника: + +<iframe width="560" height="315" src="https://www.youtube.com/embed/2Zf8GK ... +

Чувство сопротивления

+ В самом чувстве сопротивления нет ничего хорошего или плохого (привет оценочному суждению). Это механизм защиты от неблагоприятных внешних факторов. Всё ради того чтобы сохранить привычный образ жизни ... +

Адаптивные шрифты

+ Первые попытки резиновой, то есть, адаптирующейся к ширине экрана, верстки были аж в 2004-ом году, судя по [чудом сохранившейся статье в блоге Man in Blue](http://www.themaninblue.com/writing/perspect ... +

Исследование ценностей компании

+ Как мы здесь живем &mdash; великая тайна, +> +> Все кричат «вира», а выходит «майна». +> +> &mdash; (Б. Гребенщиков) + +Выбирая новое место работы, вам наверняка хотелось бы чтобы ценности л ... +

Иерархия ценностей

+ В прошлом посте (о рефлексии) я рассказывал об упражнении на выявление своих потребностей и ценностей. Сегодня мы обогатим наш лексикон парой готовых фреймворков ценностей и приоритезир ... +

Рефлексия

+ Reflect (verb): to prevent passage of and cause to change direction +> &mdash; Marriam-Webster dictionary + +Умение смотреть назад, на самого себя ... +

+ + + diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 0000000..ad2ed13 --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,29 @@ + + + + + + Page 4 | Home | Alterforia + + + + + + + + + + + +
Круг жизни

+ Мозг довольно ленивый орган, и если его не мотивировать и не стимулировать, он быстро деградирует, как и мышцы. Но если его постоянно кормить задачами, которые ему по зубам, выделяется гормон азарта д ... +

Немного о том, почему появился этот блог

+ Недавно я наконец ушёл в нормальный отпуск и решил навести порядок в личных проектах. Так и родился этот блог, в котором я постараюсь использовать всё самое лучшее из прошлых наработок и передовой опы ... +

+ + + diff --git a/posts/2020/09/03/why-the-blog-appears/index.html b/posts/2020/09/03/why-the-blog-appears/index.html new file mode 100644 index 0000000..d185b98 --- /dev/null +++ b/posts/2020/09/03/why-the-blog-appears/index.html @@ -0,0 +1,21 @@ + + + + + + Немного о том, почему появился этот блог | Alterforia + + + + + + + + + + + +

Недавно я наконец ушёл в нормальный отпуск и решил навести порядок в личных проектах. Так и родился этот блог, в котором я постараюсь использовать всё самое лучшее из прошлых наработок и передовой опыт последних лет работы.

+ + + diff --git a/posts/2020/09/04/canvas-circle-of-life/index.html b/posts/2020/09/04/canvas-circle-of-life/index.html new file mode 100644 index 0000000..f37ce12 --- /dev/null +++ b/posts/2020/09/04/canvas-circle-of-life/index.html @@ -0,0 +1,23 @@ + + + + + + Круг жизни | Alterforia + + + + + + + + + + + +

Мозг довольно ленивый орган, и если его не мотивировать и не стимулировать, он быстро деградирует, как и мышцы. Но если его постоянно кормить задачами, которые ему по зубам, выделяется гормон азарта допамин, что делает процесс более увлекательным.

Задача самоанализа - самая простая и не требует дополнительных телодвижений, к тому же, любой виток в развитии целесообразно начать с анализа текущей ситуации. +Даже зная точно где находится "точка Б", без точки А маршрут не построить. +Мой любимый инструмент для этого - круг жизни.

Техника простая:

  • выделить сферы жизни - это можно делать от простого к сложному, выписывая всё, чем вы занимаетесь в течение дня и всё, что занимает ваши мысли и потом обобщать и категоризировать, либо, что проще, воспользоваться типичными категориями, которые есть у всех - здоровье, отношения, работа и тд
  • нарисовать круг, разделить его на столько частей сколько сфер получилось
  • заштриховать сектора в соответствии с чувством наполненности или отдалённости от совершенства
  • заметить, что некоторые сектора заштрихованы в равной степени, значит между ними может быть связь, а некоторые заштрихованы больше других, значит им, может быть стоит уделять меньше внимания и заняться теми сферами, в которых чувствуется недостаток

Поскольку я веб-разработчик, без красивой визуализации не могу обойтись 😃

Если ваше "Колесо жизни" выглядит примерно так, оно никуда не поедет, желательно перераспределить энергию чтобы запустить "спиральную динамику" развития.

Рука руку моет, границы между сферами условны, они плавно перетекают друг в друга и дополняют остальные. В моём колесе большие сегменты занимают работа и отношения, в последний год я работал над этими темами очень сильно, но совершенно забросил очень важные аспекты своей жизни и намерен сбалансировать их со временем. Чтобы было вот так:

+ + + diff --git a/posts/2020/09/07/values-prioritization/index.html b/posts/2020/09/07/values-prioritization/index.html new file mode 100644 index 0000000..2d0623c --- /dev/null +++ b/posts/2020/09/07/values-prioritization/index.html @@ -0,0 +1,22 @@ + + + + + + Иерархия ценностей | Alterforia + + + + + + + + + + + +

В прошлом посте (о рефлексии) я рассказывал об упражнении на выявление своих потребностей и ценностей. Сегодня мы обогатим наш лексикон парой готовых фреймворков ценностей и приоритезируем наши нужды.

Первый фреймворк ценностей в нашем списке был создан в 1960-х Рене Доуисом и Ллойдом Лофкистом:

  • Достижения - результаты и процесс
  • Комфорт - отсутствие стресса
  • Статус - признание и престиж
  • Альтруизм - гармоничное служение другим
  • Безопасность - предсказуемость и стабильность
  • Автономия - возможность управлять и инициативность

В 2000-х Эдвард Дечи и Ричард Райан создали теорию Само-определения, она содержит всего три мотивирующих фактора, которые присущи всем человеческим существам:

  • Компетенции - мастерство в своей сфере деятельности
  • Причастность - забота и контакт с окружающими
  • Автономия - управление, выбор, свобода

Если вы выполнили упражнение в статье о Рефлексии, у вас уже есть некоторый список того, что важно именно вам, и это в тысячу раз более ценно, чем пользование готовыми системами. Фреймворки могут помочь обратить внимание на то, что вы, возможно упустили в самоанализе. Также список обычно увеличивается ответом на вопрос "Почему вы делаете то, что вы делаете?"

Можно использовать любую технику приоретизации, которая вам нравится. Если у вас нет такой техники, вот три на выбор:

  • Прогрессивное вычеркивание - постепенно вычеркивайте то, от чего вы откажетесь не раздумывая, пункт за пунктом
  • Выбор - берем пункты попарно и выбираем один, потом берем ещё один пункт и выбираем снова
  • Категоризация - разместить пункты по категориям - критично, важно, желательно, опционально

Упражнение этого поста состоит в следующем:

  1. Выпишите ваши ценности в столбик, например: +
    • комфорт
    • справедливость
    • автономия
    • причастность
    • статус
    • востребованность навыков
    • перспективы - надежность и определенность
    • прогрессирующие трудности
    • деньги
    • возможность свободно креативить и самовыражаться
    • компетентность коллег
  2. Путем вычеркивания, выбора или категоризации, оставьте из них половину наиболее значимых
  3. Внимательно изучите список и выберите три наиболее значимых. Взгляните ещё раз на график эмоций, который вы построили в прошлый раз. Что вызывало у вас самые положительные эмоции или самые отрицательные?

Ещё один важный инструмент для само-определения - ранжирование. Любая ценность имеет свои "слишком мало" или "слишком много". Есть определенное количество и качество аспекта, при котором всё хорошо. Например, ваш приоритет - общение с людьми. Но если вам предложат работу где вам нужно общаться с 1 человеком в месяц или с сотней в день, это вам вряд ли подойдёт. Поэтому важно понимать приемлемый уровень - минимум и максимум.

Ранжировав свои top-3 ценности, вы можете выбирать более подходящую вам рабочую роль и задавать на собеседовании вопросы, которые помогут сделать правильный выбор, с большей вероятностью ведущий к успеху и позитивным эмоциям.

+ + + diff --git a/posts/2020/09/08/organization-values/index.html b/posts/2020/09/08/organization-values/index.html new file mode 100644 index 0000000..e8a84c9 --- /dev/null +++ b/posts/2020/09/08/organization-values/index.html @@ -0,0 +1,27 @@ + + + + + + Исследование ценностей компании | Alterforia + + + + + + + + + + + +

Как мы здесь живем — великая тайна,

Все кричат «вира», а выходит «майна».

— (Б. Гребенщиков)

Выбирая новое место работы, вам наверняка хотелось бы чтобы ценности людей, которые будут вас окружать, делали ваше пребывание в компании продуктивным и приятным. То, в каких действиях выражаются ценности компании, очень сильно скажется на вашем опыте работы в ней.

Ценности компании как правило размещены на сайте. Но как узнать заранее, правда ли это, что это не просто набор красивых слов? После приема на работу задавать такие вопросы уже поздно, поэтому желательно поспрашивать о компании у знакомых. Поэтому первый способ - простой networking. Вопросы желательно задавать не прямые, а с использованием воображаемых ситуаций. Например, как поступил бы человек в ситуации когда нужно выбрать между качеством продукта и хорошим отзывом от клиента за своевременную поставку.

Вариант для более смелых - спросить у собеседующего - а как вы, персонально, проявляете ценности компании?

+ + + diff --git a/posts/2020/09/11/adaptive-fonts/index.html b/posts/2020/09/11/adaptive-fonts/index.html new file mode 100644 index 0000000..f788615 --- /dev/null +++ b/posts/2020/09/11/adaptive-fonts/index.html @@ -0,0 +1,24 @@ + + + + + + Адаптивные шрифты | Alterforia + + + + + + + + + + + +

Первые попытки резиновой, то есть, адаптирующейся к ширине экрана, верстки были аж в 2004-ом году, судя по чудом сохранившейся статье в блоге Man in Blue (opens new window)

Когда адаптивность стала входить в обиход (точкой отсчета принято считать эту статью Итана Маркотта (opens new window), то есть 10 лет назад, мы использовали % и em в качестве единиц измерения для шрифтов и отступов. Чтобы увеличить или уменьшить шрифт, мы использовали media queries, которые позволяли задать font-size для body, от которого зависят все размеры, указанные в em-ах.

Верстальщику всё время нужно было подбирать определенную величину, при которой блоки не наезжали друг на друга, текст не выпячивал за пределы блока, учитывать читаемость и компоновку элементов для четырёх размеров экранов как минимум.

Все современные браузеры поддерживают vw и vh в качестве величин, относительных высоте и ширине viewport-а (окна браузера). Если вы потянете за угол окна браузера прямо сейчас, вы сможете заметить, что заголовок страницы будет плавно уменьшаться, это потому что его размер шрифта указан в vw. Раньше это можно было сделать, указав размер в процентах, но эти проценты считались от ширины блока.

Чтобы текст не ужимался до нечитабельного состояния, можно указать минимальный размер через calc():

h1 {
+    font-size: calc(1.3rem + 3.6vw);
+}
+

Несмотря на то, что эта технология появилась 8 лет назад, вместе с CSS3 (одна из первых статей про vueport units (opens new window)), огромное число разработчиков до сих пор оперируют пикселями и, в лучшем случае, em. Оставим это на их совести и совести UX-специалистов, которые делают статичные макеты.

Почаще заходите сюда, и на Can I Use (opens new window), и здесь и там очень много полезной и актуальной информации.

Да, читайте, пожалуйста, спецификацию (opens new window)!

+ + + diff --git a/posts/2020/09/11/vuepress-migration/index.html b/posts/2020/09/11/vuepress-migration/index.html new file mode 100644 index 0000000..4aefda2 --- /dev/null +++ b/posts/2020/09/11/vuepress-migration/index.html @@ -0,0 +1,21 @@ + + + + + + Блог переехал на Vuepress | Alterforia + + + + + + + + + + + +

Блог мигрировал с Jekyll на Vuepress.

+ + + diff --git a/posts/2020/09/13/resistance/index.html b/posts/2020/09/13/resistance/index.html new file mode 100644 index 0000000..009ae05 --- /dev/null +++ b/posts/2020/09/13/resistance/index.html @@ -0,0 +1,21 @@ + + + + + + Чувство сопротивления | Alterforia + + + + + + + + + + + +

В самом чувстве сопротивления нет ничего хорошего или плохого (привет оценочному суждению). Это механизм защиты от неблагоприятных внешних факторов. Всё ради того чтобы сохранить привычный образ жизни и deal with вторжениями и террором.

Если человек может сказать "Нет, я против!" это воспринимается нормальным, человек хорошо понимает свои границы и отстаивает свои интересы. Но бывают ситуации, когда неблагоприятные факторы отсутствуют, а сопротивление чувствуется.

Сопротивление возникает при попытках выбраться из состояния стагнации, гомеостаза, привычного образа жизни. Даже если этот образ жизни деструктивен и наполнен негативными переживаниями. Так уж устроена психика.

Многим известен принцип психологического айкидо - сначала согласитесь с оппонентом, а потом выскажите свою точку зрения. Но здесь есть пара нюансов - если вы согласны только на словах, оппонент все равно чувствует ваше сопротивление в голосе, интонациях. Второй момент - за психологическим айкидо часто скрывается неумение говорить "нет" когда это действительно нужно.

В восточных боевых искусствах устойчивость достигается через мягкость. При столкновении тело сначала резко наполняется силой, а потом моментально становится как бы прозрачным. Мягкость обескураживает ожидающего сопротивление противника, как и внезапная техничная резкость. Расслабленную руку гораздо проще убрать из захвата.

Существуют разные подходы к преодолению сопротивления. Я писал эту статью почти три дня. Очень много чувства сопротивления у меня возникло, болела голова, появлялись более важные дела. Это новая для меня тема, я в ней вообще не разбираюсь, что обо мне скажут знающие люди? Страх оценки, я могу выглядеть глупо. Или страх перед тем, что в результате самоанализа я откопаю что-то страшное. Возникает реальное сопротивление перед воображаемой ситуацией в будущем.

Все входят в холодную реку по-разному, я - постепенно, а кто-то представляет себя берсерком и идёт напролом. А кто-то вообще не заходит, предпочитая игру в поддавки. А у кого-то холодная река вообще не вызывает сопротивления.

+ + + diff --git a/posts/2020/09/15/spinal-hernia/index.html b/posts/2020/09/15/spinal-hernia/index.html new file mode 100644 index 0000000..df41d2d --- /dev/null +++ b/posts/2020/09/15/spinal-hernia/index.html @@ -0,0 +1,25 @@ + + + + + + Межпозвоночная грыжа | Alterforia + + + + + + + + + + + +

Это больно. Это неприятно. Это может довести до отчаяния.

Упражнение от даосских мастеров на проработку всего позвоночника:

Комплекс для укрепления и растяжки всего позвоночника (выглядит страшно, но я делаю, хорошо помогает):

Правильная растяжка для здоровья колена:

Упражнение для суставов колена:

Акупунктура колена:

Укрепление связок колена:

Массаж и тейпирование колена:

+ + + diff --git a/posts/2020/09/17/conflict-management/index.html b/posts/2020/09/17/conflict-management/index.html new file mode 100644 index 0000000..ed93f05 --- /dev/null +++ b/posts/2020/09/17/conflict-management/index.html @@ -0,0 +1,23 @@ + + + + + + Немного конфликтологии | Alterforia + + + + + + + + + + + +

В конфликты попадают так или иначе все, но все мы по-разному из них выходим.

Под конфликтом я понимаю состояние ситуации, когда есть два субъекта и есть их отношение по поводу какого-либо объекта, приправленное негативными эмоциями друг к другу с обеих сторон. Ссора от конфликта отличается отсутствием объекта. Кроме межличностного конфликт также бывает внутриличностным, суть та же.

Можно выделить несколько путей выхода из конфликта

  • избегание,
  • пассивный,
  • агрессивный,
  • компромисс,
  • сотрудничество.

Оптимальным считается выход на сотрудничество, но мало кто объясняет как это сделать, мол, разбирайтесь сами, вот вам апельсин.

Похожий на правду ответ я нашёл для себя в книге Даниеля Шапиро "Negotiating Nonnegotiable". Чтобы "излечить" конфликт, он говорит, нужно смотреть на "трансцедентальную общность", на что-то что объединяет всё сущее, это поможет подняться над своим эго и племенной идентичностью, и создать контакт с другим человеком. Если вас задевают слова или поступки другого человека, перепалка кажется иногда единственным вариантом отстоять свою идентичность. Ваш оппонент думает так же.

Ещё мне нравится концепция территорий. Они могут быть не только физическими - например, заняли ваш стул или место на паркове, чем вызвали бурный негатив, но и ментальными - вас оскорбили прилюдно, а с вами так нельзя, вы и покалечить случайно можете.

Чтобы избегать подобных ситуаций, можно, конечно, накачаться, ходить на тренировки по боевым искусствам, но это тоже не спасает от неадекватных людей.

Как вариант, имеет смысл завести привычку на каждый контакт ставить цель, не жёстко, конечно, по ходу контакта всё может измениться, но в целом, иметь цель на каждую коммуникацию желательно.

Хорошая цель коммуникации:

  • экологична (win-win),
  • измерима и доказуема,
  • достижима участниками,
  • выражена позитивным языком (без "не" и "без"),
  • ранжирована (не меньше чем, но и не больше чем, где-то между)

Типы целей могут быть:

  • получение информации
  • изменение эмоционального состояния
  • принятие решения
  • действие

Внутриличностные конфликты (неврозы) можно решать точно так же. Поставить на стол две куклы-фигуры, положить между ними объект конфликта и, целенаправленно, вербализировать внутренний диалог.

Звучит странно, выглядит тоже, но это бездонный источник лулзов и открытий.

+ + + diff --git a/posts/2020/09/18/archetypes/index.html b/posts/2020/09/18/archetypes/index.html new file mode 100644 index 0000000..83498ca --- /dev/null +++ b/posts/2020/09/18/archetypes/index.html @@ -0,0 +1,22 @@ + + + + + + Архетипы | Alterforia + + + + + + + + + + + +

Архетипы как психологическое понятие введено в прошлом веке Карлом Густавом Юнгом для обозначения структурного элемента коллективного бессознательного – захватывающие "изначальные" образы, которые притягивают к себе максимальное количество психической энергии и заставляют эго служить им.

Классификация опросника PMAI® (Pearson-Marr Archetype Indicator®), основанного на мифологии "путешествия героя" содержит в себе следующие образы (и их потребности), сгруппированные по базовому желанию:

Структурирование мира:

  • Опекун - комфорт
  • Правитель - ценности
  • Творец - новаторство

Духовный путь (дорога в рай):

  • Невинный - безопасность
  • Мудрец - ясность
  • Искатель - свобода

Оставить след:

  • Бунтарь - кризис
  • Маг - поведение
  • Воин - мастерство

Контакт с другими:

  • Сирота (славный малый) - принадлежность
  • Любовник - близость
  • Шут - удовольствие

Идеи архетипов в наше время активно используют многие публичные компании при формировании бренда (опять же, репутации). Обратите внимание на то, какие славные малые работают в ИКЕА и как заботится о вас Nivea.

С понятием архетипов у меня ассоциируется понятие репутации.

Если вы обнаружили в себе несколько архетипов - это нормально, они все присутствуют в каждом из нас. Идея в том, чтобы не распылять психическую энергию, а выявить доминирующий и уделять ему больше внимания. Чем он более выражен, тем сильнее вы притягиваете к себе внимание людей с этим невыраженным архетипом. Наверное, это можно назвать харизмой.

Помимо образных архетипов, Юнг ввёл также понятия Анима и Анимус для обозначения гендерных архетипов (да, они оба тоже присутствуют во всех).

Если бы мне нужно было одним словом обозначить то, в чем состоит различие между мужчиной и женщиной в этом отношении, и, таким образом, то, что характеризует анимус в отличии от анимы, то я мог бы сказать только одно: если анима производит настроения, то анимус — мнения, и как настроения мужчины появляются на свет из темных глубин, так и мнения женщин основываются на столь же бессознательных, априорных предпосылках. +- Карл Густав Юнг, "Анима и Анимус"

Юнг также указывает на множественность Анимуса (судебная коллегия) и единичность Анимы, это связано, по его мнению, с особенностями мировосприятия. Для Анимы мир состоит из их близких и таких же конгламератов, замкнутых, как правило, на себе. Для Анимуса мир это народ, "государство". Во снах образ Анимы связан с образом какой-либо из богинь, образ Анимуса это летучие голландцы, всегда неопределенно-неуловимые.

+ + + diff --git a/posts/2020/09/19/working-from-home/index.html b/posts/2020/09/19/working-from-home/index.html new file mode 100644 index 0000000..b12e2d5 --- /dev/null +++ b/posts/2020/09/19/working-from-home/index.html @@ -0,0 +1,22 @@ + + + + + + Работа из дома | Alterforia + + + + + + + + + + + +

Я начал работать из дома после 10 лет работы в офисе. Задолго до того как это стало мэйнстримом, в 2018 году я перешёл на удалёнку full-time, прекрасно понимая с какими трудностями мне придётся столкнуться, но это был скорее вынужденный шаг, чем моё осознанное решение. А поскольку с такими проблемами столкнулись многие, и это растянулось на долгие месяцы, делюсь своим двухлетним опытом.

# Work/life ballance

"Работа из дома это когда время 9 вечера, а ты всё ещё на работе" - сказал один мой коллега. Я, как трудоголик, вообще не понимаю этой проблемы - работа это большая часть жизни. Но есть проблема перенапряжения, и тут как в качалке - если мышщу не расслаблять, она не накачается. Длительное напряжение со временем становится нормой и может привести к болезням. Важно уметь расслабляться. Да, для этого нужно время, но оно воздастся. Просто сядьте или встаньте в удобную позу, потяните макушку вверх, копчик вниз, почувствуйте где напряжено и спокойно дайте команду этому месту расслабиться, и так до тех пор пока не наступит состояние, в котором комфортно находиться часами. Есть много техник - випассана для пассивных, йога для активных, цигун для ленивых - выбирайте на свой вкус. Лишь бы нравилось. Китайский мастер тайцзи Ван Лин говорил на семинаре - если не нравиться, зачем заниматься?

# Отсутствие взаимопонимания и поддержки

В этом основная сложность работы в изоляции. В офисе светская беседа (small talk) происходит автоматически, тогда как онлайн общение часто начинается "сразу к делу". +Выделенный уютный чатик для чаепитий и созвонов на поболтать на полчаса отчасти закрывают эту потребность, но трудоголикам желательно иметь близкий круг людей, с которыми невозможно говорить о работе. И да, small talk не возникает сам по себе, его инициируют. Будьте проактивны.

# Работа с документами

У меня это 3-4 письма в год, в основном заявления на отпуск и приказы о премиях. Струйный принтер стоит недорого, а помощь соседям, которым нужно распечатать (раз в месяц нужно прогревать чернила, иначе сопла сохнут) - очень ценный нетворкинг. Желательно запасаться впрок конвертами, бланками и наличкой чтобы было чуть более комфортно. Адреса можно распечатать на том же принтере, но я предпочитаю писать от руки, иначе навык атрофируется.

# Уборка

Мытьё посуды, полов, ремонт - обо всём этом не думаешь в офисе, это за тебя делают другие. Посудомойка лучшее изобретение человечества. Мытьё полов я делаю как тренировку - можно тянуть широчайшие мышцы спины и заднюю часть бедра. Ремонт - это работа над soft-skills - общение с людьми разных уровней требует особых навыков коммуникации. Книга "Лидер и Племя" и групповые тренировки по боевым искусствам очень мне в этом помогли.

# Готовка

Рекомендую книгу "Очаровательный кишечник", она покрывает многие вопросы питания. Доставка - лучшие друзья, я обычно заказываю не фаст-фуд, а обычную, "рустикальную" еду - плов, суп, салат.

Если у вас 3-4 созвона в день, забейте место в календаре под обед.

В СПб и Москве есть Яндекс.Шеф, это бывшая Партия еды, а это 7 пакетов с продуктами и рецептами на неделю. Готовка не должна занимать больше получаса. В качестве быстрого перекуса у меня всегда есть яблоки и бананы и несколько простых рецептов, для которых всегда припасена нужная бакалея:

  • Помидоры, отруби, майонез
  • Паста с песто
  • Быстрорастворимые супы из экомаркета
  • Творог с ягодами

# Отвлекающие факторы

Дети, перфоратор, дела по ремонту, жена - решаются очень легко - берём рабочий ноутбук и без сомнений снимаем квартиру чисто для работы. Это никак больше не решается. В коворкингах, даже в специальных тихих комнатах (читай, все на созвонах) тоже бывает шумно.

# Зависимости

Игры, порно, алкоголь, табак и тд - возникают как компенсация отсутствия желаемого. В изоляции зависимости усиливаются, поскольку нет ограничивающих факторов. Решается обычной психотерапией, но должно быть желание. В целом, лечение любых аддикций сводится к их замене на конструктивные. Мой вариант - трудоголизм и цигун. Кто-то сидит годами на антидепрессантах или анонимных группах. Всё это вполне рабочие варианты.

# Быть всегда на связи

Достаточно держать связь с членами команды, понимать кто что делает в этот день и включить все оповещения в основном инструменте связи. Остальные каналы - скайп, телефон, почта - достаточно проверять два раза в день. Никто не ожидает что вы будете отвечать моментально, потребность постоянно проверять не пришло ли чего-нибудь очень выматывает. Достаточно быть онлайн и отвечать на все сообщения день в день, или на следующий день.

# Непрозрачность

Вас никто не видит и не знает что конкретно вы делаете и в каком настроении в течение дня. Что и какими интонациями вы говорите на созвонах влияет на ваш имидж и отношение к вам. Умение создать раппорт через подстраивание под ценности и репрезентативную систему может помочь быть более понятным и доступным. А открытое выражение своих чувств и эмоций по поводу сказанного - приветствуется.

# Тревожность

Я заметил это у себя в голосе когда пересматривал свой вебинар и у многих других начинающих удалёнщиков. Человек, говорящий из офиса, или привыкший к частым онлайн-переговорам звучит иначе, более уверенно, он в роли. Играть роль, говоря в пустоту бывает сложно. Поэтому важно сначала выслушать других людей, понять цель диалога, с кем вы говорите, и потом вам будет проще наладить уверенное общение.

А главное, никогда не ленитесь заниматься физкультурой, есть, спать и чистить зубы, это влияет на стрессоустойчивость.

# Экзистенциальщина

Под этим понимается спектр эмоций, связанных с бессмысленностью бытия. Чувствуется как некая дыра, пустота, бездна, которая затягивает. Просто не смотрите туда, вы не найдёте там смысла. Зачем искать смысл в бессмыссленности?) Просто отвернитесь от неё. Загрузитесь рутинами.

# Депрессия

Ощущается другими людьми как подавленность, апатичность, вялость. Изнутри не чувствуется, видно только снижение продуктивности. Депрессия возникает от большого расхода ресурсов на сдерживание огромного количества подавленных, вытесненных эмоций. Чаще всего это гнев и злость, как затабуированные социумом выражения агрессии и недовольства. В некоторых социальных средах не принято даже жаловаться. Решение - создать окружение, в котором можно открыто выражать свои чувства, например, психологические группы, где ценна группа сама по себе, но отдельные члены, если вы, конечно, не социофоб, не несут большой значимости и поэтому злость можно выражать открыто.

Не бойтесь кому-нибудь навредить. Если вам кажется, что внутри вас зверь, это не так, вы его настолько подавили, что там мышка. Попробуйте-ка порычать. Открытое выражение гнева чаще всего самый простой способ выхода из депрессии. К тому же, вы же работаете из дома, можете себе позволить накричать на стену. Просто за то, что она такая вот. Под песни Nirvana или The Hustle Standard.

+ + + diff --git a/posts/2020/09/21/empathy/index.html b/posts/2020/09/21/empathy/index.html new file mode 100644 index 0000000..6cac375 --- /dev/null +++ b/posts/2020/09/21/empathy/index.html @@ -0,0 +1,23 @@ + + + + + + Эмпатия | Alterforia + + + + + + + + + + + +

Эмпатия это осознанное сопереживание другому человеку без потери ощущения источника этого переживания.

Если источник переживания не осознаётся, это называется слиянием, отождествлением себя с другим. Моих чувств нет, есть только чувства другого человека.

Эмпатия является важным профессиональным навыком специалистов, работающих с людьми. Развить эмпатию может любой, кроме людей с нарциссическими и психопатическими расстройствами, но им это и не нужно, ибо восприятие другого как субъекта для них просто невозможно.

Человек, способный к эмпатии, воспринимается как человек, смотрящий "прямо в душу", "он меня видит", что иногда воспринимается сначала с опасением неблагоприятной реакции на переживания. Но эмпатичные люди, как правило, понимают и соблюдают границы.

Эмпатическое слушание, или активное слушание позволяет точно понять эмоциональное состояние собеседника, один мой знакомый психотерапевт шутя утверждает, что он зарабатывает исключительно произнося фразы "Ага", "Угу", "Продолжайте", "Так-так", "Ммм", "Хм..." в правильных интонациях, но, увы, это лишь "первая психологическая помощь", вопреки мифам, этого недостаточно чтобы быть профессиональным психологом.

Автор развивает эмпатию слушая музыку. Любая музыка это выражение эмоции, песня богата интонациями, которые можно услышать и в речи. Можно закрыть глаза и представить себе театр, где каждая партия - это персонаж со своей индивидуальностью и отношениями с другими. Мелодия как правило построена по тем же принципам, что и пьеса, и любая другая лирика. Пролог, завязка, развитие действия, кульминация, завязка, эпилог. Кульминаций может быть несколько, каждая со своей завязкой, ведущей к следующему моменту наивысшего напряжения.

Сольфеджио, столь непонятное мне в детстве, в зрелости лет заиграло новыми красками. Все знают что минорный аккорд звучит печально, а мажорный - радостно. Но можно построить последовательность минорных аккордов так, что она зазвучит с надеждой, напряжением, благородством. Кварто-квинтовый круг можно изучать бесконечно.

Сложности возникают с называнием переживаний, это приходит только с опытом и определенным образованием в этой области. Хорошо помогает изучение цветка эмоций Роберта Плутчика и различных списков эмоций (opens new window)

Самое сложное в общении, обычно, слушать и слышать, а не ждать очереди высказаться.

Поделюсь с вами одной историей с хорошим таким панчем в конце. Эндрю Скотт, сыгравший Мориарти в сериале BBC "Шерлок" из отвратительного психованного злодея вдруг стал секс-символом всей Великобритании благодаря роли священника в сериале "Дрянь". Так почему актёр-гей, сыгравший священника-алкоголика с темным прошлым стал "hot priest"?

В передаче Saturday Night Live автор и главная героиня сериала Уоллер-Бридж призналась, что они с Эндрю долго пытались понять, в чем секрет успеха его героя. Но в итоге разгадка оказалась совсем легкой — он просто умеет слушать.

Примерно такой же посыл у британского многосерийного фильма Казанова 2005 года.

Психологи и психотерапевты используют следующие техники активного слушания для поддержания фокуса внимании на клиенте и развития беседы, когда повисла тишина:

  • Пауза (прежде чем что-то ответить, сделайте два-три вдоха и выдоха)
  • Уточнение (если что-то непонятно, не нужно делать вид что вы поняли, переспросите)
  • Парафраз - обобщите сказанное своими словами
  • Развитие мысли - скажите какие ассоциации приходят по поводу сказанного
  • Сообщение о своих чувствах или возможных чувствах собеседника
  • Замечания о контексте беседы, например, "похоже, мы зашли в тупик" или, мой любимый вопрос "как вам кажется, что сейчас происходит?"
+ + + diff --git a/posts/2020/09/24/bulling/index.html b/posts/2020/09/24/bulling/index.html new file mode 100644 index 0000000..d76a652 --- /dev/null +++ b/posts/2020/09/24/bulling/index.html @@ -0,0 +1,23 @@ + + + + + + Моббинг | Alterforia + + + + + + + + + + + +

Травля - это агрессивное преследование одного из членов коллектива. У взрослых, в рабочей среде, это называется моббинг. Как явление обозначено в 80-х годах прошлого века.

Моббинг как правило имеет форму морального давления. Тонкие оскорбления, угрозы, физическая агрессия (доминирующая поза, пристальный взгляд), постоянная негативная оценка жертвы и её деятельности, "газлайтинг" (с тобой что-то не так), отказ в доверии, делегировании полномочий - всё это можно расценивать как проявления травли.

Всех жертв травли объединяет одна черта: чаще всего объектами издевательств становятся дети и подростки, обладающие повышенной чувствительностью, показывающие свою "слабость" (страх, обиду или злость). Их реакция соответствует ожиданиям агрессоров, рождая искомое ощущение превосходства.

Важно помнить что травля не имеет смысла для агрессора если нет молчаливых свидетелей.

Причины моббинга у взрослых:

  • желание подчинить
  • желание возвыситься
  • но чаще всего - зависть к более удачливому и успешному коллеге

Кстати, иногда такое давление в коллективе, особенно новом - временное явление, проба на зуб. Теория формирования команд гласит что есть четыре фазы

  • forming
  • storming
  • norming
  • performing

Но мало кто знает, что фазу пертурбаций можно разделить ещё на две - в первой люди притираются друг с другом, наводят мосты, выясняют кто есть кто, лидер в это время остаётся как бы в тени.

Во второй фазе команда обращает внимание на лидера и начинаются проверки и нападки на него. Это может выглядеть как травля, но при правильном поведении это быстро сходит на нет.

Есть два основных способа предотвращения травли, буллинга, моббинга, включая такие явления как рэкет и шантаж:

  • не показывайте что это как-то на вас влияет, изобразите уверенное спокойствие. Без психологического эффекта мотивация агрессоров падает, а вы становитесь для них обычным свидетелем
  • для смелых и находчивых - дискредитируйте лидера агрессоров, таким образом вы встанете на роль антилидера и, вступив в открытый конфликт, вы сможете выйти из ситуации уже не пассивной жертвой, а может быть даже в сотрудничество.
+ + + diff --git a/posts/2020/09/24/graphql-resolvers/index.html b/posts/2020/09/24/graphql-resolvers/index.html new file mode 100644 index 0000000..79a0650 --- /dev/null +++ b/posts/2020/09/24/graphql-resolvers/index.html @@ -0,0 +1,42 @@ + + + + + + GraphQL резолверы | Alterforia + + + + + + + + + + + +

Да, наконец-то техническая статья 😃

Резолверы это ядро языка запросов, о котором пойдёт речь.

Сначала пара слов о том, что такое GraphQL и зачем он понадобился.

Когда микросервисы вошли в обиход любого мало-мальски серьезного проекта, собирать данные на клиенте - делая несколько запросов - стало большой болью фронтенд-разработчиков. Несмотря на то, что мы уже активно пользуемся null-safe navigation operator (?.) для предотвращения падений из-за отсутствия каких-либо данных, приходящая с сервера модель может отличаться от контрактной, да и собирать запросы в кучу через Promise.all или RxJS тоже требует особого образования и мышления.

Сначала мы ввели понятие BFF (Backend-for-Frontend) и его разновидность Backend-in-the-Frontend. Суть в том, чтобы агрегировать запросы в модели данных, необходимые клиенту, но в случае REST API, запросы все-равно имели место быть неудобными и деревянными. И нужно было пилить собственный json-schema валидатор чтобы быть уверенным что данные соответствуют контракту.

GraphQL решает эту задачу наилучшим образом, позволяя клиенту делать запросы вида:

query Category {
+    category(id:12) {
+        products(limit:3) {
+            name
+            price
+            photoUrl
+        }
+        subCategories {
+            name
+            photoUrl
+        }
+    }
+}
+

Запрос при этом проходит три фазы:

  1. построение абстрактного синтаксического дерева (AST)
  2. валидация AST на соответствие каталогу типов (schema)
  3. исполнение резолверов полей для формирования результата в JSON-формате (автору JSON нравится когда это произносят с французским прононсом)

Резолверы работают следующим образом:

  • запросы на одном уровне дерева исполняются в параллели
  • если запрос асинхронный, его потомки ждут пока он "зарезолвится"
  • поскольку запросы выполняются в параллели, лучше всего если они атомарны, идемпотентны (один и тот же запрос приводит к одинаковым результатам) и без сайд-эффектов (нетоксичными 😃)

Сигнатура метода резолвера проста:

fieldName(parent, args, context, info) { result } 
+

Где,

  • parent — данные родительского резолвера,
  • args — параметры, переданные в query,
  • context — объект, который предоставлен всем резолвером, который можно менять (но не стоит), он чистится между запросами, в нём принято хранить данные аутентификации и авторизации, модели, фетчеры, данные запросов. Не стоит использовать его для кеширования
  • info — редко используемый объект, специфичная информация для поля

Необязательно создавать резолвер на каждое поле, достаточно указать корневой, остальные подставятся сами.

Несмотря на очевидное преимущество перед REST API в удобстве использования, GraphQL имеет несколько недостатков.

GraphQL не даёт делать рекурсивные запросы (надеюсь, не нужно объяснять почему, это скорее фича, а не баг), каждое вложенное поле нужно описывать явно, ограничивая дерево запросов.

В случае когда корень дерева содержит множество элементов, и вы запрашиваете поле внутри каждого из них, которое тоже является отдельным запросом, вы рискуете сделать сотни запросов. Это называется проблемой N+1. Проще говоря, это проблема "batch" запросов.Каждый случай индивидуален, но для решения вполне можно использовать context для кеширования промежуточных данных.

Источник вдохновения: +https://medium.com/paypal-engineering/graphql-resolvers-best-practices-cd36fdbcef55

+ + + diff --git a/posts/2020/09/25/critical-rendering-path/index.html b/posts/2020/09/25/critical-rendering-path/index.html new file mode 100644 index 0000000..4089b36 --- /dev/null +++ b/posts/2020/09/25/critical-rendering-path/index.html @@ -0,0 +1,24 @@ + + + + + + Critical Rendering Path | Alterforia + + + + + + + + + + + +

Critical Rendering Path это последовательность шагов по превращению браузером HTML, CSS и JavaScript в пиксели на экране.

Итак, браузер получает на обработку HTML-файл. Парсер проходит его байт за байтом и вычленяет токены (самые главные - startTag, endTag), потом из набора токенов строятся ноды, а из иерархии нод получается Document Object Model (DOM) на основе информации о последовательности токенов. В DOM содержится весь контент страницы.

Когда парсер находит токены запросов внешних ресурсов (стилей, картинок, скриптов), он их запрашивает, но от 4 до 7 за раз в зависимости от браузера. Некоторые запросы блокируют парсинг, некоторые могут идти в параллели.

Когда парсер видит токен стилей, он начинает строить CSS Object Model (CSSOM). Оно строится очень быстро, поэтому оптимизация CSS-селекторов не даёт большого прироста к производительности, а минификация и отложенный запрос второстепенных стилей - даёт. Когда DOM и CSSOM готовы, начинается создание Render Tree.

Render Tree содержит в себе весь контент и его стилизацию. Кроме явно скрытых (display:none) элементов.

Эти три фазы, как правило,происходят один раз, но возможны ситуации когда свежезагруженный скрипт основательно меняет DOM (размеры элементов, отступы), тогда этот процесс происходит заново.

На основе Render Tree строится Layout - расположение элементов друг относительно друга и размеры блоков на основе их содержимого. Нужно помнить, что изменение размеров окна браузера, поворот смартфона, а и иногда и обычный запрос из скрипта расстояния между элементами может привести к пересчёту всего Layout. Чем больше DOM, тем больше занимает время пересчёт Layout (reflow). В это время страница не может реагировать на действия пользователя. Желательно что бы reflow занимал максимум 10 миллисекунд чтобы добиться 60 кадров в секунду.

Следующий шаг - Paint. Обычно он не доставляет хлопот в оптимизации, он просто растеризует (превращает в пиксели с помощью GPU) то, что насчиталось в Layout. Paint происходит в несколько слоёв в зависимости от позиционирования элементов. Проблемы с ним бывают при работе со сложной анимацией в canvas, они решаются отрисовкой в памяти, "за экраном" с помощью OffScreenCanvas или WebWorker-ов.

Поскольку отрисовка многослойная, мы получаем возможность двигать элементы не вызывая Paint снова. Пока только два стиля - opacity и transition - работают на этом этапе. Указать парсеру что элемент будет двигаться можно заранее с помощью

will-change: transform;
+

но не нужно делать этого повсеместно чтобы не нагружать GPU.

Поскольку браузер - основная платформа веб-разработчиков, непонимание вышеописанного процесса ведёт к созданию неотзывчивых сайтов.

Секунды задержки в интернет-магазинах приводят к миллионам недополученной прибыли. А из-за отсутствия при старте проекта требований к производительности, веб-приложение для гос-служащих с 15Мб скриптов на Камчатке грузится 38 минут.

Источники:

Личный опыт

https://developers.google.com/web/fundamentals/performance/rendering

https://developer.mozilla.org/en-US/docs/Web/Performance/Critical_rendering_path

+ + + diff --git a/posts/2020/09/26/stress-tolerance/index.html b/posts/2020/09/26/stress-tolerance/index.html new file mode 100644 index 0000000..52dc2a0 --- /dev/null +++ b/posts/2020/09/26/stress-tolerance/index.html @@ -0,0 +1,21 @@ + + + + + + Стрессоустойчивость | Alterforia + + + + + + + + + + + +

Это, наверное, тот самый важный навык, которого мне не хватает. На одном из собеседований на стандартный вопрос "А как у вас со стрессоустойчивостью" я на голубом глазу ответил что я не стрессоустойчив, чем вызвал у собеседующего поток нравоучений. Стресс, тем не менее, неотъемлемая часть жизни.

Этой статьёй я попробую немного разобраться в этом вопросе.

За последние три года я объективно пережил столько стресса и отчаяния, сколько не было за всю мою прошедшую жизнь (а я пережил 90-е в Тольятти). Начиная от переездов и пожара, заканчивая ремонтом и проблемами со здоровьем и работой.

Да, я крепкий человек. В английском есть подходящее слово "tenance" - способность ухватиться за что-то и держать это крепко. Выкручиваясь из разных ситуаций, в некоторые из которых я сам себя привёл гиперответственностью, верностью своему слову и решениям, я продолжал упорствовать и жрать кактус.

Но это сложно назвать стрессоустойчивостью. Наблюдая за людьми, я замечаю, что некоторые люди по-другому реагируют на стресс, они чувствуют себя энергичнее под давлением, не устают, не ноют и не агрессируют. В ютюб-шоу "СтопХам" это всё видно очень наглядно, поведение людей в ситуации когда всё идёт не так как им хочется очень разное, кто-то конфликтует, кто-то хитрит, а кто-то просто спокойно разворачивается и едет как нужно. Если бы все были стрессоустойчивые, шоу бы не получилось.

Итак, мы наткнулись на первый важный аспект неустойчивости - убежденность в своей правоте, "всё должно быть так, как я хочу".

Ещё один стрессоген - осознанное принятие жизненных решений - выбрать ту работу или эту, бить или бежать, тот человек или этот. Тревожный мозг в фоновом режиме перебирает все негативные варианты развития событий. Лично я в какой-то момент просто устаю и выбираю не решать, успокаиваюсь, а потом просто думаю о том, что же мне на самом деле нужно.

Я собрал несколько техник по профилактическому развитию стрессоустойчивости из интернета. Их можно выполнять в спокойные периоды для тренировки:

  • Самообразование - вас никто никуда не гонит, можно делать подходы в удобное время и развивать устойчивость при решении проблем.
  • Почаще просите - регулируйте уровень стресса прося в ситуациях когда возможность отказа велика.
  • Выйдите из зоны комфорта - да, когда вы слишком долго в комфорте, ваша стрессоустойчивость страдает - простым языком, найдите среду где вы будете "чувствовать себя мудаком", где все кажутся лучше чем вы в чем-то. Важно также уметь собрать обратную связь.
  • Ведите дневник энергии и эмоционального состояния - со временем вы поймете что влияет на ваш уровень энергии и сможете сами управлять её уровнем, понимая как её правильно восстанавливать и когда вы наиболее наполнены чтобы распределять задачи конструктивно. Рефлексируйте временами, это помогает быть более уверенным в принятии решений.

В острые периоды, когда кажется что конца и края этому нет, важно уметь переключаться на режим "дорога возникает под ногами идущего", "this too shall pass", это помогает разгрузить мозг и не поддаваться панике, сфокусироваться на себе и на том, что на данный момент поддается контролю.

После стрессовой ситуации, даже если вы не ответственны за её создание, важно подумать о том что вы могли бы сделать по-другому и о том, как вы привыкли реагировать в таких ситуациях. Потратьте некоторое время, оно воздастся в будущем.

В целом, стратегия проста:

  • Оценивайте свои поступки
  • Поддерживайте позитивный и конструктивный настрой
  • Получайте обратную связь
  • Передохните чтобы сменить направление
  • Оставьте ситуацию в прошлом

Лично меня в периоды стресса раздражают фразы "если судьба приподнесла вам лимоны, сделайте из них лимонад", "думай позитивно, стакан всегда наполовину полон, всегда", "узбагойся", и тд. Это обесценивание проблемы и пассивный подход. Если проблема есть, значит за ней что-то ценное. В психологии есть поняние "интеграция тени", оно заключается в том, чтобы подсвечивать тёмные стороны своей личности и осваивать их.

+ + + diff --git a/posts/2020/10/05/sdlc/index.html b/posts/2020/10/05/sdlc/index.html new file mode 100644 index 0000000..abd5a02 --- /dev/null +++ b/posts/2020/10/05/sdlc/index.html @@ -0,0 +1,27 @@ + + + + + + Жизненный цикл разработки (SDLC) | Alterforia + + + + + + + + + + + +

Всё, что нужно знать об SDLC и Agile, это то, что это про деньги. Чем чаще релизы, тем чаще можно брать за это деньги.

Документация, ревизия кода, рефакторинг, работа с техдолгом, чеклисты, тесты, митинги, риск-менеджмент, бюрократия - это не то, за что заказчик платит с удовольствием.

Аналогия со строительством дома не подходит к разработке. Ближайшая метафора - конструкторское бюро или исследовательский центр.

# Традиционные подходы

# Waterfall

Без комментариев, все знают что такое waterfall и как долго заказчику приходится ждать первых результатов.

# RUP

Компания Rational Software изобрела унифицированный язык описания объектно-ориентированной модели UML, и описала фазы разработки как:

  • Inception (discovery)
  • Elaboration (architecture)
  • Construction (MVP)
  • Transition (production)

У каждой из фаз может быть несколько итераций, и у каждой из фаз есть свои вехи и дедлайны.

В разработке в той или иной степени (в зависимости от фазы) учавствуют следующие дисциплины:

  • Моделирование бизнеса
  • Требования
  • Анализ и дизайн
  • Разработка
  • Тестирование
  • Публикация (deployment)
  • Управление конфигурациями
  • Проектный менеджмент
  • Среда (environment)

Одного взгляда на список достаточно чтобы понять что это дорого и трудно - управлять всем этим так, чтобы каждая дисциплина успевала вовремя и выдавала продукт в нужном качестве. Для этого нужна зрелость команды и процессов. Также нужен поток проектов чтобы у специалистов всегда была равномерная нагрузка.

# Ранний Agile

# DSDM

Чтобы делать продукты быстрее и дешевле, в 1994-м году энтузиасты создали DSDM (Dynamic System Development Method) консорциум, который в 2014-м году выпустил публичный handbook и переименовался в Agile Business Consorcium.

DSDM состоит всего из трех фаз:

  • Предпроектная подготовка - анализ, оценка реализуемости, бизнес-кейсы
  • Проектный жизненный цикл - итеративная разработка, определение максимального лимита времени, MoSCoW-приоретизация (Must, Should, Could, Won't)
  • Постпроектный этап - ретроспектива

# FDD

Ещё один подход к разработке - очень легковесный и простой - FDD (Feature Driven Development). Фича - это работающая функция, которая приносит бизнес-ценность. Продукт - это просто набор готовых фич. В результате, поставляются только готовые фичи. Описание фичи содержит в себе действие, объект и результат.

Жизненный цикл FDD состоит из пяти этапов:

  • Разработка общей модели (доменная модель)
  • Написание списка фич
  • Планирование фич
  • Дизайн фич
  • Разработка фич (dev, test, deploy)

В процессе реализации мониторится процент готовности фич. Фишка этого подхода - над продуктом может работать несколько команд одновременно. А команда - это состав, который необходим для реализации фичи целиком.

# Crystal Methods

Это семейство методологий, помеченных цветами. Выбор метода зависит от размера команды и критичности фейла продукта. +Критичность оценивается возможными потерями и ранжируется по следующей шкале - комфорт, деньги, большие деньги, жизнь. +Размеры команд - 1-6, 7-20, 21-40, 41-80, 81-200.

Чем больше команда и чем выше риски, тем больше формализованных процессов добавляется к методу.

Основные ценности этого метода - люди, близкие и открытые коммуникации, легкий доступ к экспертам, персональная безопасность, частые поставки и ретроспективы, а также все современные техники, такие как автотесты и CI/CD

# Современные методы разработки

# Scrum

Как методология был описан ещё в 1995-м. В одном предложении это маленька кросс-функциональная команда, которая короткими итерациями работает над созданием работающего продукта. Итерации называются спринтами (от дня до 30 дней).

Процесс на самом деле прост, но чтобы выдавать предсказуемый результат нужны годы практики и я в своей 10-летней практике встречал только одного человека, которого могу назвать Scrum-мастером.

Основные артифакты:

  • Продуктовый бэклог - пополняемый набор задач
  • Бэклог спринта - задачи, готовые к работе
  • Ежедневные планёрки - что сделано, что будешь делать, есть ли проблемы +
    • План действий
  • Продуктовый инкремент - релиз

Роли: владелец продукта (PO), скрам-мастер (SM) и команда разработки (Team).

PO владеет продуктовым бэклогом - задачами, дефектами, пользовательскими историями, требованиями, улучшениями и тд. Он определяет что будет сделано и в каком порядке.

SM это Agile-коуч, это лидер и фанатик оптимизации, он не рулит, он толкает.

Team - самоорганизуемая группа специалистов, необходимых для выполнения задачи.

В начале спринта команда собирается на планнинг спринта и с помощью PO, при фасилитации SM, выбирает задачи на спринт. Каждый день спринта команда собирается на еженедельные планерки, где отчитывается о прогрессе. В конце спринта команда собирается на ревью того, что было сделано и подводит итоги. Опционально проводится ретроспектива, где команда делится соображениями по улучшению процесса. Результат ретроспективы - план действий с ответственными за их выполнение.

# Lean Software Development

Смоделирована по принципам производства Toyota. Фокусируется на минимизации затрат, визуализации продуктивности и находить узкие места.

Один из артифактов - Value Stream Map. Он должен содержать только важные шаги и никаких лишних телодвижений.

Основные принципы этого метода

  • уничтожение всего, что не приносит ценности
  • никаких золотых тарелок
  • избегание ненужных фич и смены контекстов
  • улучшение обучения
  • принятие решений в последний момент - никак не заранее, потому что всё меняется
  • поставки как можно скорее (fail fast)
  • поддержка команды, развитие креативности
  • концептуальная интегрированность команды - все немного знают чем занимаются другие
  • частые коммуникации с заказчиком
  • целостное видение

# Kanban

Это инструмент метода LSD для визуализации процесса работы. Выглядит просто - это вертикальные колонки на доске, отражающие этапы разработки, без лишних шагов, количество унифицированных задач на каждом этапе зависит от количества участникав и обязательно должно быть ограничено числом или сложностью.

Kanban позволяет получить усредненное значение времени, необходимого на работу над задачей путем простого разделения количества задач в колонке на время прихода этих задач.

Kanban позволяет визализировать узкие места и вовремя среагировать на них благодаря ограничению на количество задач. Каждая колонка может быть разделена ещё на две - в процессе и сделано.

Единственная церемония - ежедневные стендапы перед доской. Итерации отсутствуют, происходит непрерывная поставка по мере готовности.

# Экстремальное программирование (XP)

Состоит из коротких недельных итераций, клиенто-ориентированной колаборации и ежеквартального макро-планирования. +На дизайн тратится не более 10 минут, также часто используется парное программирование и TDD.

# Spotify Agile

Фишка в том, что Spotify отказался от использования любых методологий в пользу изучения реальных кейсов и создание культуры взамен какой-либо одной методологии ради гибкости. Подход к релизам у них следующий - небольшие группы людей работают над задачами в параллели и выпускают небольшие частые релизы. Релиз должен быть рутиной, а не драмой. Они также ввели понятия "поезда релизов" и фича-тогглинг (выключание фич по запросу и готовности сторонних систем)

Для постоянных улучшений используется Kata Board - описание проблемы, идеальное решение, реалистичный вариант и как выход - 3 топ действия которые приведут к улучшению.

Также Spotify широко используют понятие гильдий - людей с одинаковыми интересами, объединенные в комьюнити для обмена знаниями.

# CI/CD

Все просто

  • CI требует от разработчиков стабильных инкрементов
  • CD требует от продакшн-сред стабильности и безболезненных релизов

DevOps практики требуют тесной колаборации между разработчиками и тестировщиками и использования автоматизированных инструментов для обеспечения быстрых релизов.

# Несколько дополнительных подходов

# CMMI - Capability Maturity Model Integration

Это модель и гайд для улучшения процессов организации, используется практически во всех сферах.

Модель содержит оценку зрелости от 1 до 5, где:

  1. Непредсказуемость и реактивность - не укладываемся в сроки и бюджеты
  2. Менеджмент на уровне проекта - присутствует планирование, оценки, контроль
  3. Проактивность - менеджмент на уровне организации - стандартизация проектов, програм и портфолио
  4. Количественный менеджмент и контроль - предсказуемые улучшения, основанные на фактах, полученных системами учета
  5. Стабильность и гибкость - организация сфокусированна на постоянных улучшениях, а стабильный фундамент позволяет гибко встречать изменения и возможности

# Six Sigma

Это техника для решения проблем из Моторолы. И тема для отдельного поста ввиду обширности тулсета, от PDCA до DMAIC.

Обзор методологий описаны по мотивам курса Software Development Life Cycle (SDLC) with Shashi Shekhar на LinkenIn Learning.

+ + + diff --git a/posts/2020/10/11/hyperresponsibility/index.html b/posts/2020/10/11/hyperresponsibility/index.html new file mode 100644 index 0000000..5ae6ca6 --- /dev/null +++ b/posts/2020/10/11/hyperresponsibility/index.html @@ -0,0 +1,22 @@ + + + + + + Гиперответственность | Alterforia + + + + + + + + + + + +

Гиперответственность - это хомут, который несут гордо. Со временем (чем больше человек делает для других, но не получает того же) формируется стойкое ощущение "мне все должны" и чувство собственной важности раздувается до уровня синдрома вахтёра.

По сути своей это желание быть хорошим для других. Человек старается изо всех сил, соблюдает правила, показывает другим пример и считает людей, которые так не делают зловредами и недоумками, в тяжёлых случаях, пытается переучить других. Нужно помнить что и Гитлер и Сталин были идеалистами и романтиками.

Упорство, чувство собственной правоты и праведности, попытки прогнуть окружающих, навязать свои ценности, конечно же путь к разочарованию и отчаянию.

Всучить ответственность за себя другим, взвалить все остальное на себя - заповедь созависимого человека +– Альберт Мухаметшин

Здоровая позиция предполагает ответственность только за свои поступки и реакции.

Когда виноват кто-то другой, тут уже ничего не поделать - "они..."

+ + + diff --git a/posts/2020/10/12/principles/index.html b/posts/2020/10/12/principles/index.html new file mode 100644 index 0000000..a0d276f --- /dev/null +++ b/posts/2020/10/12/principles/index.html @@ -0,0 +1,21 @@ + + + + + + Принципиальность | Alterforia + + + + + + + + + + + +

Принципиальный человек - хороший специалист, но хреновый сотрудник. Из-за его принципов страдают все - и коллеги, и заказчик. О принципах не спорят, если ты придерживаешься каких-то других принципов - ты не свой. А это уже попахивает нацизмом потому что появляются некие "мы" и "они". А как следствие - пассивная агрессивность.

Принципиальный человек не может объяснить откуда взялись его принципы. Он просто уверен что так правильно и никаких гвоздей.

Это роль поучающего родителя. Он говорит что надо ходить в штанах, но не может объяснить почему. Как и со внутренним родителем, с внешним можно справиться включив "рацио", задавая открытые вопросы "Почему? Зачем? Как? Когда? Где? Кто?" из позиции взрослого (держа в голове общую выгоду, win-win).

+ + + diff --git a/posts/2020/10/21/eastern-martial-arts/index.html b/posts/2020/10/21/eastern-martial-arts/index.html new file mode 100644 index 0000000..c83413b --- /dev/null +++ b/posts/2020/10/21/eastern-martial-arts/index.html @@ -0,0 +1,21 @@ + + + + + + Восточные боевые искусства | Alterforia + + + + + + + + + + + +

Тренируйтесь дома.

+ + + diff --git a/posts/2021/05/08/paupiauau/index.html b/posts/2021/05/08/paupiauau/index.html new file mode 100644 index 0000000..ae8827f --- /dev/null +++ b/posts/2021/05/08/paupiauau/index.html @@ -0,0 +1,25 @@ + + + + + + Новый сингл | Alterforia + + + + + + + + + + + +

Стоило отписаться от Яндекс Музыки, мой мозг сразу стал генератором собственной. +Свежачок: +

+ + + diff --git a/posts/2021/06/30/crisises/index.html b/posts/2021/06/30/crisises/index.html new file mode 100644 index 0000000..263c3c8 --- /dev/null +++ b/posts/2021/06/30/crisises/index.html @@ -0,0 +1,31 @@ + + + + + + О кризисах | Alterforia + + + + + + + + + + + +

Важно понимать, что кризисы это неотъемлемая часть развития. +О том, какие психологические и биологические кризисы бывают вы можете почитать тут: +https://ru.wikipedia.org/wiki/Нормативные_кризисы_развития

В то же время, в кризис что-то понимать что-то сложно, потому что мозг на начальных этапах не работает.

Вкратце о фазах любого кризиса (нет, не модель Кюблер-Росс):

Любой кризис начинается с нарушения рутин, то, что раньше было опорой начинает раздражать. +Человек чувствует горе, отчаяние, угрозу перспективам, ролевая модель будущего неясна. +Скорость событий увеличивается, горизонт планирования снижается, при этом качественные изменения отрицаются, предпринимаются попытки "приложить подорожник", вернуться к основам - это с миром что-то не так. +Активируются привычные психологические защиты. Часто начинает проявляться инфантилизм, возрастная регрессия.

Фаза дезорганизации - как было не работает, всё рушится, в жизни человека появляется "психолог" - с запросом к нему - верните как было, почините меня, примите меня. Происходит поиск решения. +Фаза поворота - человек приходит к выводу - это непочинимо, надо разрушить и создать новое. +Фаза реорганизации - активный редизайн - принимается множество новых решений на ходу - дорога под ногами идущего. +Фаза восстановления - наблюдается снижение энергии, требуется время чтобы привыкнуть к новой нормальности.

В целом выход из кризиса происходит несколько лет.

+ + + diff --git a/posts/2021/10/29/frustration/index.html b/posts/2021/10/29/frustration/index.html new file mode 100644 index 0000000..c1b75cd --- /dev/null +++ b/posts/2021/10/29/frustration/index.html @@ -0,0 +1,23 @@ + + + + + + О фрустрации и аддикции | Alterforia + + + + + + + + + + + +

Фрустрацию и аддикцию почему-то принято рассматривать отдельно, хотя это просто два разнонаправленных процесса, две стороны одной медали. +Первопричина обеих - ожидание награды, поощрения, обладания желаемым.

Если награда не была обещана, в результате фрустрации возникает обида, если была - злость и гнев.

Аддикция возникает к тому, что гарантированно оправдает ожидания. Но при недоступности объекта аддикции возникает фрустрация.

Выйти из этого механизма довольно просто и сложно одновременно. Решение в отказе от гарантированного будущего в процессе движения к путеводной звезде. "Дорога возникает под ногами идущего." Главное - не терять направление.

+ + + diff --git a/posts/2021/11/24/poject-from-scratch/index.html b/posts/2021/11/24/poject-from-scratch/index.html new file mode 100644 index 0000000..41f2962 --- /dev/null +++ b/posts/2021/11/24/poject-from-scratch/index.html @@ -0,0 +1,29 @@ + + + + + + Проект с нуля | Alterforia + + + + + + + + + + + +

Многих разработчиков привлекает фраза "проект с нуля". +Это как искать девственницу - мало кто ответит на вопрос "что ты будешь с ней делать?" +Гораздо проще улучшать существующий проект, чем создавать с нуля свой. +Проект с нуля это огромный объем работ, который нужно сделать чтобы запуститься.

Для PM это GAP-анализ (чего нет чтобы было), стратегическое планирование, создание плана коммуникаций и выбор методологии управления. +Для аналитика это подготовка и детализация сотни страниц в базе знаний, описывающих функционал гораздо детальнее, чем в ТЗ. +Для разработчиков это выбор технологий с учетом ситуации на рынке труда, собственных компетенций и требований (функциональных и нефункциональных).

Это как спроектировать дом в чистом поле. +Нужно учесть всё: ландшафт, климат, доступность стройматериалов и рабочих, площадь участка и обязательно - пожелания заказчика. Учесть нужно также внезапно возникающие требования в середине строительства. Например, заказчик может захотеть камин, хотя летом он от камина отказывался.

При планировании работ надо помнить о праздниках, отпусках и больничных, особенностях работы с квалифицированными и не очень людьми.

В моей практике было только два проекта с нуля. И вот мои усвоенные уроки:

  1. Прежде чем браться за проект, нужно понимать какой объем работ действительно осуществим в текущих условиях. Это должны быть конкретные рамки (scope of work). Остальное можно оставить на потом если хватит средств. Часто выбор очевиден - ради ускорения сайта с 10 до 1 секунды можно переписывать софт пару лет, чтобы получить современный SPA, или пригласить эксперта чтобы он настроил Webpack за день.
  2. Верхнеуровневую оценку после подписания договора можно сразу выбрасывать и начинать делать детальный план работ от простого к сложному. Половину этого плана тоже придётся выбросить после первой демонстрации успехов. Требования меняются. Коммуникации важнее начального ТЗ. Основная ценность проектирования и разработки в том, что мы, делая итеративные поставки, даём заказчику понимание, что он в итоге хочет.
  3. Хорошая практика - в середине проекта объявить о том, что вы готовы поработать ещё пару месяцев за те же деньги (при условии, что это было учтено в изначальной оценке)
  4. Очень важно (!!!) сразу создать план коммуникации со всеми заинтересованными лицами (регулярность обсуждений план-факта, структурность общения, своевременную и качественную обработку предложений). Иначе бывает сложно обеспечить доступность выгодоприобретателей. На каждой встрече должен быть человек, который будет слушать внимательнее всех и не вмешиваться.
  5. Отлично если удастся убедить заказчика провести мини-исследование осуществимости задуманного. Двухнедельный discovery-проект поможет составить чёткое видение будущего продукта и показать возможности и риски ещё до подписания договора.
+ + + diff --git a/posts/2022/03/06/negotiations/index.html b/posts/2022/03/06/negotiations/index.html new file mode 100644 index 0000000..a29cea9 --- /dev/null +++ b/posts/2022/03/06/negotiations/index.html @@ -0,0 +1,25 @@ + + + + + + О переговорах | Alterforia + + + + + + + + + + + +

Переговоры это самый сложный вид коммуникации.

Чтобы переговоры состоялись, необходимым условием является наличие у сторон общего интереса.

Общепринятая теория психологии переговоров гласит что существует пять стратегий, пять путей выхода из конфликта, пять сильных надёжных позиций в переговорах.

  1. Черепаха.

"Мне нужно время чтобы подумать/собраться с мыслями/обсудить детали с коллегами/выпить стакан воды"

Черепаха никогда не принимает решения.

Эта стратегия применяется когда нужно тянуть время. Когда происходит давление, когда решение ещё не принято и интересы сторон неясны.

  1. Лиса.

"Мы так много для вас сделали, не могли бы вы нам немного помочь".

Эту стратегию лучше всего применять когда позиция чуточку слабее, это путь уступок с нагрузкой. Согласие с условием.

Лиса никогда не бывает прямой. Всегда говорит Мы вместо Я. Лиса не слышит "нет".

  1. Сова.

"Учитывая все нюансы и риски, ради общей пользы я предлагаю обсудить все возможные решения и выбрать наилучшее"

Сова сфокусирована на пользе и сотрудничестве. Применять следует тогда когда ситуация предельно ясна и проработана в деталях. Экспертная позиция, рациональная аргументация.

  1. Плюшевый мишка.

"Вы правы, мне не следовало этого делать, я совершил ошибку и очень сильно раскаиваюсь. Простите меня."

Применяется в наиболее слабой позиции, когда нужно вызвать симпатию, эмпатию, желаение обнять и пожалеть чтобы избежать санкций и неблагоприятной ситуации даже ценой собственных интересов.

  1. Акула.

"Ситуация очень критическая. Это недопустимое поведение и если так будет продолжаться, я буду ходатайствовать о применении соответствующих санкций в отношении всех пречисленных в отчете лиц"

Применяется очень дозированно в ситуации когда позиция явно сильнее, сроки поджимают и ситуация критическая. Акула даёт оценку ситуации и делает это тоном злой учительницы ясно и четко выговаривая каждую фразу.

Несколько важных замечаний:

  • встать и уйти стандартная реакция в ходе сложных переговоров, но это провал
  • эмоции вообще - враг в любых переговорах, как хорошие так и плохие
  • решение задачи не должно являться целью переговоров, цель переговоров - согласие сторон
  • то, что вы делаете в точке перехода хода меняет ход переговоров гораздо круче того что вы выражаете вербально
+ + + diff --git a/posts/2022/06/14/impact/index.html b/posts/2022/06/14/impact/index.html new file mode 100644 index 0000000..dd98e17 --- /dev/null +++ b/posts/2022/06/14/impact/index.html @@ -0,0 +1,26 @@ + + + + + + О влиянии | Alterforia + + + + + + + + + + + +

Основной инструмент лидера команды или формального управленца это другие люди.

Добиться чего-либо от людей можно только через техники влияния.

Разделить техники влияния можно на две категории: варварские и цивилизованные.

Если с цивилизованными всё просто - аргументация и контр-аргументация. С варварскими всё немного сложнее. Их хотелось бы разобрать подробнее.

Варварские методы:

  • угрозы, принуждение, моральное давление
  • манипуляции (лесть, ложь)
  • нападение: +
    • непрошенные советы
    • деструктивная критика
    • деструктивная констатация

Варварские методы действуют на эмоции, разжигают гнев, злобу, вызывают чувство вины и беспомощности.

Наиболее эффективный способ отбить нападение - психологическое айкидо.

Вдох, выдох, - "Да, Игорь, возможно вы правы"

В особо жарких ситуациях хорошо работает испорченная пластинка - повторять одну и ту же фразу пока человек не успокоится.

Также можно уточнить - а как бы человек принял решение в этой ситуации.

Если ваша позиция чуть сильнее - можно объяснить своё поведение личностными качествами.

В любом случае, важно сразу отбить атаку так, чтобы конфликт не дошёл до точки невозврата - неконтролируемых эмоций.

Ни в коем случае не оправдываться, не шутить и не говорить снисходительно - это тоже конфликтогены.

+ + + diff --git a/posts/2022/10/16/frustration/index.html b/posts/2022/10/16/frustration/index.html new file mode 100644 index 0000000..01fb4ce --- /dev/null +++ b/posts/2022/10/16/frustration/index.html @@ -0,0 +1,24 @@ + + + + + + О фрустрации | Alterforia + + + + + + + + + + + +

Если после каждого падения ты находишь в себе силы подняться, то скорее всего ты - синусоида.

Мотивом сменить место жительства, работу, закончить старые и начать новые отношения всегда является ожидание чего-то лучшего, большего и вкусного. Вдоволь нафрустрировавшись очередным несоответствием желаемого и действительного, я выработал в себе привычку адаптироваться.

Адаптация происходит постепенно.

Во-первых, правильные вопросы. Примеры неправильных вопросов - почему все так плохо? За что?! Где этому конец? и так далее. +Примеры правильных вопросов - Что я могу сделать в сложившейся ситуации чтобы стало лучше чем было и по ходу получать удовольствие от процесса? Какое решение мне нужно принять чтобы перестать беспокоиться и начать жить и радоваться каждому мгновению? и так далее.

Хороший вопрос от плохого отличается тем, что меняет фокус восприятия в сторону изменения ситуации, а не заставляет копаться в прошлом и анализировать.

Во-вторых, внутреннее состояние. Каждое мое утро начинается с поиска и воссоединения с собой. Не скажу что это легко, но двигаясь в эту сторону рано или поздно будет результат в виде неописуемого и непередаваемого восторга жизни. Всякий раз это по-разному. Снаружи я могу все так же суетиться или механически куда-то идти, но в процессе вслушивания вглубь себя, рано или поздно я нахожу этот пульт внутреннего управления.

В-третьих, осознание себя в ситуации. К ситуационному мышлению я пришел своим умом, но потом узнал, что это довольно продвинутый способ мышления. У каждой ситуации есть начало и есть конец и они перетекают друг в друга. Осознание себя не только в пространстве, но и в ситуации, делают жизнь более полной и насыщенной ситуациями. Но насыщение происходит изнутри меня ответом на вопрос "Чем я наполняю эту ситуацию?" Таким образом возникает резонанс и причинно-следственный альянс состояние-ситуация.

Адаптация через резонанс видится мне более органичной чем механическое выстраивание отношений с миром и людьми через ярлыки и метафоры.

+ + + diff --git a/posts/2022/10/16/timemanagement/index.html b/posts/2022/10/16/timemanagement/index.html new file mode 100644 index 0000000..74fd037 --- /dev/null +++ b/posts/2022/10/16/timemanagement/index.html @@ -0,0 +1,21 @@ + + + + + + Метафизика тайм-менеджмента | Alterforia + + + + + + + + + + + +

Время - категория относительная, мера движения одних вещей относительно других и можно с уверенностью заявить что как феномена его не существует, поэтому речь по сути идет об управлении вниманием. Умении удерживать внимание на определенном пространстве и переключаться между пространствами. Я умышленно не употребляю слово объект, поскольку это не отражает сути и термин довольно плоский. Пространство, как некий объем (тела, души, сознания), требует навыка распределенного внимания и более жизненно.

Итак, мы определились с основным инструментарием - это управление пространственным вниманием.

Продолжая движение из плоского мира целей, желаний, событий, из, так называемого, "клипового мышления" в мир ситуаций, включенности и непрерывного движения, давайте введем термин "путь". Путь определяется намерением. А намерение это по сути взаимное притяжение того пространства где мы находимся с тем пространством, где наше внимание.

Намерение и пространственное внимание взамен плоских и узких целей и фиксации на объектах порождают мышление в четырех изменениях, где четвертым измерением является "ход вещей", который принято называть временем, а так же здравую оценку ситуации и поведение, которое обеспечит ход вещей согласно главной задаче.

Разумеется, другие люди, социальные модели, правила и законы социума, ядро личности так или иначе будут влиять на ситуации, но если представить это как некую внешнюю сферу, внешний интерфейс, то внутри есть еще одно ядро - субъективная реальность. В противовес социальной реальности оно живет по другим законам и правилам. Это и есть тот, всеми искомый "источник", точка подзарядки, соединение с собой. И из этой субъективной реальности мы можем влиять на свои состояния, мысли, чувства, эмоции. Как око тайфуна, это пространство часто называют "внутренний стержень", на который всегда можно опереться и черпать жизненный потенциал даже (и особенно) в трудных жизненых ситуациях.

Механизм работы с субъективным пространством тот что что и с социальным - через намерение-притяжение.

Огромное количество людей лишено контакта с этим внутренним стержнем и поэтому в целях синергии и общего блага влиять на них можно и нужно с помощью создания единого мнения в каждой субъективной реальности с помощью моделей, правил, законов и пропоганды.

+ + + diff --git a/reflection/index.html b/reflection/index.html new file mode 100644 index 0000000..334b28d --- /dev/null +++ b/reflection/index.html @@ -0,0 +1,28 @@ + + + + + + Рефлексия | Alterforia + + + + + + + + + + + +

Reflect (verb): to prevent passage of and cause to change direction +— Marriam-Webster dictionary (opens new window)

Умение смотреть назад, на самого себя и на содержание и функции своего сознания - наиважнейший навык в карьерном росте. Это называется рефлексией.

Анализируя своё прошлое, можно понять что на самом деле важно и каким образом формируются цели, решения, желания.

Если вам что-то на самом деле важно, вы действуете. Поэтому важно прояснить ценности чтобы принимать важные решения уверенно. Также, осознание своих ценностей даёт вам мощное ощущение собственной идентичности и уникальности.

Ценности познаются в сравнении. Ценность возникает при сравнении с чем-либо. +Я могу сказать что мне важны деньги, но бывают ситуации, когда деньги уже не имеют такой ценности - при проблемах со здоровьем, с близкими. Это ставит деньги в иерархии ценностей чуть ниже чем здоровье и отношения.

Также, потребность в уважении может перевесить ценность отношений или денег.

Ценности требуют жертв. Чем-то приходится жертвовать в пользу того, что важно.

Возьмем за основу деньги. Но что значат деньги? Безопасность? Может быть, статус? Возможность путешествовать? То есть, деньги это важно, но ценность не в них самих, а в возможностях, которые они дают и как вы их используете.

Ценности меняются со временем, поэтому очень важно периодически пересматривать их для понимания куда двигаться дальше.


Давайте проделаем простое упражнение

  1. Нарисуйте горизонтальную линию.
  2. Определите временной промежуток для ревизии. Стартовой точкой может быть выпуск из университета, начало работы как специалиста. Важно чтобы можно было обнаружить повторяющиеся паттерны в принятии решений.
  3. Определите периоды для ревизии. Это могут быть отчетные месяцы, или переходы между проектами или должностями.
  4. Вспомните что вы делали на каждом этапе. Резюме или дневник могут помочь освежить память.
  5. Нарисуйте вертикальную линию в точке старта и начертите кривую своего эмоционального состояния через все периоды.
  6. Назовите эти эмоции и их противоположности, это могут быть: +
    • любопытство-скука
    • благодарность-сожаление
    • радость-печаль
    • принадлежность-изолированность
    • добавьте своих
  7. Подумайте что было важно для вас в то время. Какие потребности были удовлетворены или нет.
  8. Ищите паттерны, ответьте на несколько вопросов: +
    • Были ли эмоции, которые повторялись снова и снова?
    • Были ли реакции, которые сложно объяснить?
    • Были ли ситуации когда вы что-то не хотели замечать, но это сильно сказалось потом?
    • На что вам следует обращать внимание в будущем чтобы ваши потребности были с большей вероятностью удовлетворены?
+ + + diff --git a/stack-1/index.html b/stack-1/index.html new file mode 100644 index 0000000..6317353 --- /dev/null +++ b/stack-1/index.html @@ -0,0 +1,34 @@ + + + + + + Выбор стека технологий (введение и кейсы) | Alterforia + + + + + + + + + + + +

Речь пойдет о выборе и использовании fullstack-инструментария после 10 лет занятия разработкой на проектах, из которых с нуля я начинал только 2.

Стек технологий очень важен, он выбирается один раз на всю жизнь проекта, а некоторые проекты вдруг обнаруживают что заменить mongodb на postgresql когда база данных уже весит несколько гигабайт и активно используется очень дорого, а найти разработчиков со знанием graphql очень сложно.

Поэтому при выборе очень часто принято отталкиваться от рынка. Ведь правда - чем больше хайпа вокруг фреймворка, тем проще на нем разрабатывать и искать исполнителей.

Я люблю Ruby on Rails, но выбрать его для нового проекта я бы не хотел, потому что замена разработчика будет стоить очень дорого.

Как бы мне не был отвратителен React и как бы у меня не болели глаза от миллионов строк кода, которые я увидел, выбирать Vue и Angular тоже довольно рискованно ввиду ригидности этих технологий.

Стек технологий обычно содержит

  • хранилище данных - это база данных и файловое хранилище +
    • базы данных +
      • Postgres
      • MS SQL
      • Elasticsearch
      • MongoDB
      • memcached,
      • Redis
      • etc...
    • хранилища +
      • minio
      • S3
      • RAS
  • бэкенд-фреймворк - его выбор зависит от ландшафта и требований, обычно содержит ORM - синтаксический сахар над SQL-запросами. +
    • Django (Python)
    • Ruby on Rails
    • ExpressJS (Nest, Next, Nuxt, Meteor)
    • Lavarel (PHP)
    • .Net core
    • Spring (Java)
    • Jamstack - Headless CMS (Strapi, Contentful, Gatsby) - пользовательский интерфейс для создания и изменения структур контента
  • фронтенд-фреймворк - его выбор зависит от набора компонентов пользовательского интерфейса и количества и динамичности данных которые будут обрабатываться на фронтенде. +
    • React
    • Angular
    • Vue
    • Ember
    • Svelte
    • Tooling - typescript, eslint, prettier, webpack, turbopack, etc...
    • кроме прочего, нужно выбрать библиотеку компонент и css-framework (tailwind, bootstrap, foundation)
  • системы виртуализации-контейнеризации +
    • Docker (kubernetes)
    • VMWare
  • API (внутренний или внешний программный интерфейс для интеграции), например: +
    • Graphql
    • Kafka
    • Twilio
    • Auth0

Также, в зависимости от требований проекта, необходимо заранее задуматься об инфраструктуре и процессе деплоя приложения

  • CI/CD
  • мониторинг (prometheus, graphana)
  • парсер логов (kibana) +и выписать конкретные показатели которые необходимо отслеживать и ранжировать по критичности.

Итак, для того чтобы выбрать стек, нужно определить проблему. Затем нужно определить ландшафт и данные, которые мы будем хранить и обрабатывать.

Возьмем для примера несколько кейсов из PropTech, EdTech, FinTech и HR-Tech.

# Кейс 1. EdTech

Необходимо создать систему тестирования учащихся (без уточнения - школ, вузов, онлайн-курсов) с возможностью проведения нескольких видов тестов:

  • тест на выбор правильного ответа
  • тест со свободным полем ввода
  • тест-паззл
  • загрузка документа с ответом

И SLA:

  • загрузка страницы должна быть меньше 1 секунды
  • система должна выдерживать одновременную нагрузку 10000 учеников.

# Кейс 2. FinTech

Необходимо создать консоль управления SaaS-инфраструктурой для облачного сервиса и интеграцией с AD заказчика. +Пользователь будет только один - генеральный директор компании, то есть продукт должен быть законченным и не содержать багов.

# Кейс 3. PropTech

Необходимо создать облачное решение для планирования и технического надзора проектного строительства. +Требования:

  • Автономная работа без интернета
  • Умение работать с BIM (стандартизированный формат файлов для описания архитектуры здания)
  • Безопасность данных +Задача - выстроить соответствия между конструкциями здания (водопровод, вентиляция, отделка, перекрытия) и конкретными подрядчиками, выполняющими данный вид работ.

# Кейс 4. HR-Tech

Необходимо создать продукт полного цикла для "стаффинга" - поиск и найм кандидатов, ведение личных дел, ознакомление с регламентами компании, фидбеки, интервью, распределение между проектами компании, API для получение информации из других систем и увольнение.

# Кейс 5. Личный блог разработчика

Полушуточный кейс - необходимо создать бесплатную среду для записи и публикации мыслей в которую будет удобно писать и обслуживание хостинга не должно занимать много времени.


Чтобы не перегружать статью, мой субъективный выбор архитектуры для каждого кейса будет подробно расписан в следующих статьях.

+ + + diff --git a/stack-2/index.html b/stack-2/index.html new file mode 100644 index 0000000..460ec83 --- /dev/null +++ b/stack-2/index.html @@ -0,0 +1,28 @@ + + + + + + Выбор стека технологий (доступность и поддерживаемость) | Alterforia + + + + + + + + + + + +

Это вторая статья в цикле "Выбор стека технологий".

1. Выбор стека технологий (введение и кейсы)

В первой статье мы определили содержание стека технологий. Это:

  • хранилище данных
  • бэкенд-фреймворк
  • фронтенд-фреймворк
  • системы виртуализации/контейнеризации
  • DevOps (IaC, мониторинг, логгирование), например, ELK (Elasticsearch, Logstash, Kibana)

# Доступность (reliability)

Доступность измеряется отношением общества количества запросов к количеству неответов.

Вернемся к кейсам и ранжируем их по требованиям к надежности:

EdTech - SLA 99.999% прописано в контракте (5 минут в год на обслуживание)

HR-Tech - business-critical, SLA 99.99%

PropTech - 2 часа offline в неделю, при том, что это PWA вполне допустимо.

FinTech - консоль SaaS будет использоваться раз в месяц, даже если пролежит неделю - не критично

Blog - мой блог лежал полгода и переезжал с домена на домен, самый менее критичный продукт с требованием к персистентности больше чем к доступности

По стеку что выбрано в результате и на ходу:

EdTech - Postgres, Java 17 Spring Boot, Low-Code, Next.js (SSG+Nginx), Tailwind, отдельный человек-SRE (Docker, minio, Yandex Cloud Kubernetes) - с появлением Java 19, пророчу Java долгую, но сложную жизнь

HR-Tech - Postgres, Java microservices, Angular 1X, Kafka, Shared SRE (0.3 FTE)

PropTech - MongoDB, Redis, Nest.js, React, no devops - MongoDB падает на 200 пользователях, переписать на Postgres - полгода работы пары человек минимум

FinTech - .Net Core (потому что Azure AD), Angular

Blog - GitHub Pages, VuePress, Markdown

По факту, как ни смешно, самым надежным оказался блог на GitHub Pages. Простота = надежность.

На других проектах DevOps-практика подкачала, деплои были большей частью ручные, а релизы - нестабильные.

Вывод - доступность приложения целиком и полностью зависит от Ops и инфраструктуры. Это база, которая закладывается на старте проекта.

Поэтому если доступность одно из требований, уже при инициализации проекта должны быть настроены бэкапы и восстановление, мониторинг, система оповещений об инцидентах, пайплайн поставок, тестовые стенды и простейшие автотесты.

Здесь мой выбор пал на GitLab, Jenkins и AWS. Ввиду отсутствия альтернатив. В случае российских проектов, Yandex Cloud достаточно production-ready с отзывчивой поддержкой.

# Поддерживаемость

По стандарту ISO/IEC 25010 поддерживаемость - набор атрибутов, содержащих необходимые усилия для внесения изменений.

Чтобы что-то изменить, это нужно - проанализировать, изменить, отладить и протестировать.

img.png

Как человек, проведший огромное количество времени за реверс-инженерией legacy-кода, я ставлю этот атрибут вторым параметром в уравнение поиска идеального стека.

Java 19 догнал в развитии Elixir/Erlang спустя 30 лет этой гонки.

Тем не менее, поддерживаемым код паралельных процессов и всего остального на Java назвать сложно.

Недаром в последнем опросе пользовательских предпочтений StackOverflow, Elixir на втором месте.

Если бы проекты можно было писать без оглядки на рынок, я бы взял для бэкенда Elixir. Ибо любой разработчик поймет код который на нем написан. И сможет писать на нем уже через пару недель. А вот с Java не так.

Elixir это не только синтаксис, сколько среда выполнения, обратите внимание на табличку ниже из книги Elixir in Action: +img_1.png

Несмотря на то, что Elixir медленнее компилируемых языков, в плане реализации высокодоступных систем ему нет равных.

Поэтому если бы я выбирал стек технологий снова, он был бы таким:

EdTech - Postgres, Phoenix LiveView, Tailwind

HR-Tech - Postgres, Phoenix LiveView, Kafka

PropTech - просто убрал бы пересчет аналитики в транзакции, JS-стек стартапу подошел хорошо

FinTech - .Net Core (потому что Azure AD), Angular - по-другому никак

Blog - GitHub Pages, VuePress, Markdown - идеально

+ + + diff --git a/stack-3/index.html b/stack-3/index.html new file mode 100644 index 0000000..4f8cbba --- /dev/null +++ b/stack-3/index.html @@ -0,0 +1,26 @@ + + + + + + Выбор стека технологий (переусложнение) | Alterforia + + + + + + + + + + + +

Это третья статья в цикле "Выбор стека технологий".

1. Выбор стека технологий (введение и кейсы) 1. Выбор стека технологий (доступность и поддерживаемость)

В первой статье мы определили содержание стека технологий. Это:

  • хранилище данных
  • бэкенд-фреймворк
  • фронтенд-фреймворк
  • системы виртуализации/контейнеризации
  • API
  • DevOps (IaC, мониторинг, логгирование), например, ELK (Elasticsearch, Logstash, Kibana)

Во второй статье мы рассмотрели вопрос выбора стека с точки зрения атрибутов качества - доступность и поддерживаемость

В этой статье мы посмотрим на вопрос выбора стека ещё шире, глубже и конкретнее.

Critical thinking is the analysis of available facts, evidence, observations, and arguments to form a judgment.

Edward M. Glaser. "Defining Critical Thinking (opens new window)"

Критическое мышление — способность человека ставить под сомнение поступающую информацию, включая собственные убеждения.

Википедия

На что не стоит опираться при выборе стека:

  • Личные предпочтения
  • Хайп
  • Советы коллег из других компаний
  • Звездочки на Github-е
  • Опросы на Stackoverflow

На что стоит делать упор:

  • Личный опыт успешных проектов
  • Доказанный опыт успешных проектов других компаний
  • Простоту и удобство использования
  • Наличие прототипов, реализующих задуманное на конкретной технологии
  • Отношение потенциальной пользы от внедрения к трудопотерям на внедрение

Список вопросов, на которые стоит ответить при выборе любого решения, не только стека:

  • Как долго эта технология будет жива и пользоваться спросом? Flash, Pascal, VHS - популярные в прошлом, но забытые сейчас. Нужно брать технологии, у которых впереди в запасе как минимум 10 лет развития.
  • Легко ли обслуживать эту технологию? "Используя популярный тулсет вы с легкостью найдете специалиста" именно этим руководствовались миллионы проектов которые взяли React в качестве фронтенд-фреймворка. В итоге множество проектов завязли в некачественном коде из-за отсутствия архитектуры. Если вам нужно быстро выйти на рынок, проще всего взять PHP и Vue. Но на долгой дистанции с ними будет много мучений.
  • Какие обременения и накладные расходы у этой технологии? О выгодах мы задумываемся автоматически. Они ослепляют. Каждая новая технология это +1 человек к команде. Typescript - кто-то должен писать типы, UI Material - кто-то должен читать документацию, Docker - отдельный человек для написания helm-charts и тд.
  • Если это миграция - возможен ли откат, какова цена восстановления в случае неудачи?
  • Если это внедрение нового - какова стоимость внедрения и сроки окупаемости?

Помимо всего прочего, важна экспертная оценка реализации проекта. Желательно иметь подробный ресурсный план для каждой технологии, написанный признанным экспертом.

Может оказаться, что реализация на Java и React займет год и 100 миллионов, но на Go и Angular - полгода и 20 миллионов. Выбор будет очевиден.

# Пример переусложнения

В этой выдуманной истории огромное количество скрытой иронии, прошу прощения.

Итак, представьте, у генерального директора Андрея появилась идея на миллиард, и даже предварительные договоренности о продажах. Он подходит к своему зятю-программисту Алексею и говорит - нужно сделать проект, поможешь?

Андрей назначает Алексея CTO (станция техобслуживания) и ждет первых результатов.

Алексей, не будучи дураком, начинает мыслить глобально, как настоящий профессионал.

Он начинает с Frontend-а. Язык - без вариантов - JavaScript. Точнее, его типизированная ипостась - Typescript. Из статей в интернете он узнает что у Angular очень высокий порог вхождения, Vue имеет слабую поддержку одним человеком, а jQuery уже устарел и выбирает React. Ведь на рынке огромная толпа разработчиков на React и астрономическое количество готовых компонентов для него. К тому же React не ограничивает архитектуру, гибкость инструмента способствует быстрой разработке.

Также он узнает что Bootstrap уже не моден и в качестве компонентной библиотеки выбирает Material-UI. А в качестве CSS-фреймворка Tailwind.

Также, для фронтенда ему пригодятся Webpack, icomoon и сотня-другая компонентов для реализации задуманного, включая websocket и canvas.

Ах да, он чуть не забыл про State-manager, коих уже десятки, он выбирает самый популярный Redux, ведь, чем больше boilerplate-кода, тем стабильнее и надежнее приложение.

Итак, на фронтенде - React, Redux, Material-UI, Tailwind, Webpack и много всего остального.

Бэкенд - тут Алексей решил не переусложнять, а оставить один язык для всего приложения и на сервере будет запущено приложение на Node.js. Повыбирав из фреймворков (Next.js, Nuxt.js, etc.js...), он решил взять то, что не имеет строгой привязки к фреймворку - Nest.js.

База данных - конечно MongoDB, ведь в интернете написано что она очень быстрая и гибкая. Но, на всякий случай, будем использовать ее как реляционную, все сущности будут связаны и лежать в отдельных коллекциях. Рядом будет in-memory cache Redis на случай большой нагрузки.

В качестве API Алексей решил сделать прямое соединение через Websocket. Это быстро, модно и просто.

Подумав ещё, Алексей решил сразу создать пайплайны CI/CD, и сразу запускать Docker-контейнеры в облако с помощью helm-чартов - в Kubernetes кластер, чтобы иметь возможность горизонтально масштабировать приложение автоматически.

А чтобы контейнеров было побольше - для пущей модульности - сразу решил разделить приложение на микросервисы и положить в разные репозитории, общение организовать через Kafka, а базу данных - реплицировать на три ноды, так точно будет работать быстрее.

Прошло несколько лет, продукт наконец вышел, рос медленно, но верно и продажи поднялись - продукт получил популярность, даже с такими высокими ценами. Алексей решает набрать команду и нанимает 7 фулл-стэк разработчиков. К этому моменту и в последствии, tailwindcss и material-ui использованы в 10% кода, React-компоненты встречаются и в виде классов, и в функциональном стиле со множеством перегруженных кастомных хуков.

А тем временем приложение начинает падать по три раза в день от наплыва пользователей - база данных съедает всю память на самой большой виртуальной машине в облаке потому что деплой в Kubernetes так и не смогли настроить ни подрядчики ни весь отдел разработки, хотя пытались по очереди все. Kafka тоже не поднялась.

Также возникают проблемы с уведомлениями - письма не доходят - падают в спам, заказчики не получают вовремя отчеты, а работа идет все медленнее и медленнее из-за количества багов ввиду излишней гибкости фронтенда.

Поскольку CTO не разбирался в серверах и у него никогда не было больших проектов, место на диске съели логи, продуктовый сервер был настроен абы как, а доступ к нему был у половины разработчиков в любое время без надзора. Разделения сред тоже не продумали, тестовый сервер оккупировал менеджмент для демонстраций заказчику, ломать его было нельзя, данные мало были похожи на реальные.

Наш CTO понимает что пора - пора осуществить задуманное - переехать с MongoDB на RDBMS, например, PostgreSQL, но количество написанных без ORM агрегаций, которыми так славится MongoDB, выглядело неподъемным. Redis не помогал, а больше мешал. Типы были перегруженными, а конвертация данных - повсеместной. В проекте насчитывались тысячи вызовов map и reduce.

Плюс, заказчики стали настаивать на том, чтобы приложение работало оффлайн (эту функцию откладывали до последнего, как слишком простую, были задачи поинтереснее, с canvas-ом). И тут выясняется, что нужно загрузить несколько гигабайт информации на устройство пользователя. А при каждом обновлении приложения эти данные стирать, потому что схема изменилась, то есть, писать миграции для State manager-а.

Генеральный директор, видя что приложение падает под напором, предлагает самым крупным заказчикам беспрецендентный шаг - ради их же безопасности, компания будет устанавливать приложение на сервера заказчика. Первая установка прошла успешно, вторая тоже, но автоматизировать процесс установки не получается - можно только вручную и особо обученным сотрудником - человеком, разбирающемся в приложении, интеграциях и unix-серверах. Такой стоит недешево.

В общем и целом, оверинжиниринг во всей красе - 12 окружений которые нужно обновлять только вручную и только по выходным, плюс множество технологий, которые сильно усложняют общую картину, хотя, казалось бы, призваны решать проблемы.

Цена упрощения такого проекта - примерно 10 миллионов рублей. Это выделенная команда для миграции из 6 человек на год работы.

Несмотря на то, что проект успел заработать в несколько раз больше - такой огромный технический долг его может потопить.

# Пример упрощения

В целом, стэк был выбран разумно, но к переусложнению привели другие факторы. Время разобраться.

Давайте сначала выпишем ошибки, которые были допущены выше:

  1. Использование MongoDB как реляционной базы данных привело к дорогим проблемам производительности
  2. Чрезмерная преждевременная оптимизация и решение вымышленных проблем масштабирования привело к потере времени на настройку
  3. Назначение CTO малокомпетентного и неопытного человека

Исходя из этого, фундамент проекта стоило заложить так:

  • Использовать MongoDB в качестве хранилища, но как NoSQL - так будет проще работать с данными - агрегации все равно запускаются на JavaScript, также будет проще переходить на реляционную базу - запросы будут проще, да и на несколько баз разделить проще
  • Ввести правило оценивать трудозатраты и потенциальную выгоду от реализации фич, таким образом ни функциональность, ни архитектура решения не будут страдать от жажды скорой наживы
  • Начать с самого простого - с монолита, так как очень редко встречаются настолько огромные проекты чтобы вводить микросервисную архитектуру
  • Поставки приложения - в виде образа виртуальной машины, который достаточно просто развернуть в среде заказчика, руками самого заказчика
  • Описать архитектуру проекта в виде 4D и менять по мере необходимости
  • На ранних стадиях ввести мониторинг систем, установить ELK стэк и настроить режим логгирования, бэкапа, управления инцидентами
  • Следовать принципу "проще - лучше", причем, "так быстрее" - почти всегда плохо и приводит к сложностям
+ + +