#статьи
Эти сокращения каждый программист должен знать так же хорошо, как количество и имена истребителей адмирала Ямамото.
Иллюстрация: Artur Kovalev / Wikimedia Commons / Colowgee для Skillbox Media
Переводчик, специалист по авиационной безопасности, начинающий веб-разработчик. Убеждён, что любой человек может сочетать абсолютно разные интересы и сферы профессиональной деятельности, ведь наши возможности безграничны.
Об авторе
Один из топовых авторов на Medium. Пишет о технологиях, образе жизни, личном опыте и многом другом.
Переводчик
Руслан Гаджиев
За 17 лет работы в индустрии я каких только сокращений не повидал — и серьёзных, и забавных. Да и, если честно, всем разработчикам нравятся аббревиатуры. Одни просто облегчают речь — например, MVP или PoC (ясно же, что, создавая их, никто особо не усердствовал). Другие ещё и звучат забавно: например, SOLID, DRY и KISS.
Вообще, аббревиатур в сленге разработчиков так много, что я подготовил небольшой обзор наиболее (и парочки — менее) распространённых из них — вдруг вы подзабыли, что они означают.
Начнём с элементарного сокращения, которое наверняка попадалось вам много раз. DRY (англ. dry — сухой, сушить) — основополагающий принцип разработки. Он расшифровывается как Don’t repeat yourself — «не повторяйтесь».
Когда пишете код, всегда думайте о том, как можно переиспользовать тот или иной фрагмент, что можно выделить в универсальную функцию или класс, сделать модулем. При этом речь не идёт о создании библиотек под каждую неодноразовую функцию — я имею в виду очень похожую логику, которая встречается в нескольких местах, которую, возможно, есть смысл вынести в функцию. А если в нескольких местах определена одна и та же функция, то её можно вынести в общий модуль. Ну и, наконец, если вы часто используете один и тот же модуль, вероятно, из него можно сделать библиотеку.
Другими словами, don’t repeat yourself, понимаете?
Этот принцип полезен всегда, вне зависимости от платформы или языка. Допустим, вам надо автоматизировать некое поведение. Чтобы не прописывать несколько раз одну и ту же логику и не раздувать код без нужды, попробуйте обобщить её и вынести в отдельный элемент.
Лайфхак: принцип DRY не нужно ограничивать одним репозиторием. Чтобы упростить доступ к модулям или компонентам при работе с разными репозиториями, используйте Bit (вот его страница на GitHub). Он поддерживает Node.js, TypeScript, React, Vue.js, Angular и другие фреймворки.
Пример переиспользования компонентов React с помощью
bit.dev
Скриншот: Bit.dev / Skillbox Media
Эта аббревиатура (англ. kiss — поцелуй, целовать) мне самому всегда нравилась — как по форме, так и по значению: Keep it simple, stupid («Сделай это проще, тупица») или, если кому-то не нравится называться тупицей, есть вариант Keep it stupid simple («Пусть всё будет простым до безобразия»), который ещё лучше передаёт смысл аббревиатуры.
Решая какую-нибудь проблему, можно так увлечься, что сам не заметишь, как уже занялся оверинжинирингом или, как я люблю говорить, вовсю палишь из пушки по воробьям. Задача в итоге, конечно, будет решена — но её можно было бы выполнить куда проще и изящнее.
Не спорю, бывают, конечно, и обратные ситуации. Слишком простой код или простая архитектура могут оказаться неэффективными, и тогда в логику придётся добавлять чуть больше сложности. Но всё равно надо каждый раз себя спрашивать, соблюдается ли принцип KISS.
Проверяйте, достаточно ли понятны ваши логические цепочки. Хватит ли знаний вашим коллегам, чтобы в них разобраться? Простой код и простой дизайн уменьшают риск ошибок, да и читать такой код проще. В общем, не забывайте про KISS!
Это ещё одно общее правило программирования. Расшифровывается оно так:
- Single responsibility principle (принцип единственной ответственности).
- Open-closed principle (принцип открытости/закрытости).
- Liskov substitution principle (принцип подстановки Лисков).
- Interface segregation principle (принцип разделения интерфейса).
- Dependency inversion principle (принцип инверсии зависимостей).
Получается, что это пять разных принципов в одном (англ. solid — твёрдый, плотный, прочный). Рассмотрим каждый по отдельности.
Он говорит о том, что каждая ваша функция должна выполнять только одну задачу.
Если вы знакомы с *NIX-системами, такими как дистрибутивы Linux, macOS и прочие, то наверняка имели дело с их терминалом и командами, например ls или cd. Они строго следуют принципу SRP — выполняют только один тип задачи (скажем, меняют директорию или выводят список её содержимого). Вы не найдёте такой утилиты, которая позволяла бы выполнить сразу несколько задач (в нашем примере — изменить директорию и вывести список её содержимого). Это даже называется UNIX-way.
Чтобы иметь только одну ответственность, функции должны быть простыми. Если же нужно более сложное поведение, придётся объединять вводы и выводы нескольких функций и делать композицию.
И хоть я и говорю сейчас о функциях, принцип SRP применим практически ко всему. Взять, например, архитектуру какой-нибудь платформы. Её гораздо проще обслуживать и развивать, если вместо мегамодуля, ответственного вообще за всё, у вас будет несколько микросервисов, каждый из которых отвечает за свою маленькую задачу. Но — ещё раз — то же касается и функций: более простые и понятные функции легче поддерживать, читать, понимать и даже просто писать.
Например, если вам нужна функция getUserAndRelatedBooks, в которой прописана логика двух задач, подумайте о том, чтобы разбить её на две функции: getUser и getUsersBooks, где вторая будет получать на вход результат выполнения первой. Так вы сможете изящно реализовать getUserAndRelatedBooks, просто указав getUsersBooks (getUser), то есть объединив их в композицию.
Он говорит о том, что ваши модули или библиотеки (в зависимости от того, как экспортируется код) должны быть открыты для расширения (например, расширения поведения), но закрыты для модификации (ибо ни у кого нет желания возиться с чужим модулем).
Если вы заметили, что для добавления в ваш код нового поведения или расширения уже существующего его приходится править, — поздравляю, вы успешно пренебрегли принципом открытости-закрытости! :)
Вот наглядный пример — приведённый код нарушает этот принцип. Потому что, если понадобится добавить ещё один город, придётся открывать сам файл и вносить изменения в массив knownCities.
Скриншот: Skillbox Media
А вот как можно решить эту проблему и соблюсти принцип открытости/закрытости.
Скриншот: Skillbox Media
Как видим, с помощью метода addValidCity можно расширить поведение кода под свои задачи, без необходимости править файл.
Этот принцип, также известный как LSP, максимально приближает нас собственно к теории программирования. Сильно углубляться в неё я не буду — просто опишу суть принципа подстановки.
Функции, которые используют указатели или ссылки на базовые классы, должны иметь возможность использовать подтипы базового типа, ничего не зная об их существовании.
Сразу же бросается в глаза, что мы здесь явно имеем дело с принципом ООП, который помогает правильно применять наследование, когда это необходимо, и использовать альтернативные варианты, когда наследование не нужно.
Рассмотрим это на примере. В геометрии квадрат — это разновидность прямоугольника. По сути, это прямоугольник с одинаковыми шириной и длиной. Если попытаться смоделировать это с помощью кода, можно получить примерно следующее:
Скриншот: Skillbox Media
В абстракции тут нет смысла: методы setWidth и setHeight ничего не меняют, квадрата из прямоугольника не получится — а это не то, что нам нужно. Итак, приведённый выше код нарушает принцип подстановки Лисков.
Другими словами, LSP гарантирует правильное использование наследования в вашем коде. Так что, как бы странно он для вас ни звучал, помнить о нём при создании классов всё-таки стоит.
Он говорит о том, что нельзя заставлять программистов, работающих с вашим кодом, использовать ненужные методы. Ведь интерфейс — это всего лишь взаимодействие классов (набор методов, которые необходимо реализовать). Поэтому при создании интерфейсов (например, в TypeScript) убедитесь, что методы, которые требуется реализовать, действительно нужны вашим пользователям, — и не городите в одном интерфейсе кучу функциональности. Разделяйте и властвуйте.
Скриншот: Skillbox Media
Рассмотрим этот код. Возможно, при работе с MyModule кому-то и захочется реализовать методы close и open, но если не требуется обеспечить совместимость с IE8, то последний из трёх перечисленных в коде методов точно не понадобится.
Иными словами, принцип разделения интерфейсов имеет дело с дизайном. Соблюдая его, отделяйте методы друг от друга — пусть пользователи сами решают, какие из них применять и для каких задач.
Концепцию SOLID замыкает принцип инверсии, или внедрения, зависимостей.
По классике он звучит так:
- Модули верхних уровней не должны импортировать сущности из модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Это очень полезный инструмент для многих сценариев, например для юнит-тестирования. Если вы тестируете код, который зависит от сторонней библиотеки, вы можете внедрить мок этой библиотеки д��я контроля поведения кода. Давайте покажу на примере:
Скриншот: Skillbox Media
Здесь мы видим, что подключение к базе данных объявлено и выполняется внутри одного модуля, а функцию saveUser вы экспортируете. Если теперь попытаться протестировать код, эта функция автоматически постарается выполнить свою первоначальную задачу — подключиться к базе данных и сохранить данные пользователя в ней.
Однако если разрешить внедрение зависимостей и принять соединение с базой данных (которое и является зависимостью) в качестве второго параметра, то можно внедрять мок дальше:
Скриншот: Skillbox Media
Теперь можно даже переключать зависимости — например, использовать другой модуль для подключения к базе данных — на коде это не отразится, он всё так же будет отрабатывать необходимую логику.
Внедрение зависимостей — замечательный инструмент. Он позволяет создавать расширяемый дизайн и очень нужен тем, кому при разработке важна расширяемость. Учитывайте это в своей работе.
Принцип, иначе известный как You ain’t gonna need it («Вам это не понадобится»), пришёл из экстремального программирования. Согласно ему создавать какую-то функциональность следует только тогда, когда она действительно нужна.
Дело в том, что в рамках Agile-методологий нужно фокусироваться только на текущей итерации проекта. Работать на опережение, добавляя в проект больше функциональности, чем требуется в данный момент, — не очень хорошая идея, учитывая, как быстро могут меняться планы.
Что я имею в виду, говоря про смену планов? Итерации в Agile довольно короткие — то есть вы будете получать какой-то фидбэк уже на ранних этапах разработки, и потенциально он может изменить направление всей работы над проектом. Так зачем вам тратить время на функцию, которая в итоге окажется совершенно ненужной?
Однако замечу напоследок, что если вы используете методы каскадной разработки, где вся работа планируется заранее и все стараются чётко придерживаться плана, принцип YAGNI неприменим.
И раз уж мы заговорили о каскадной модели, то нельзя не вспомнить о принципе Big design up front («Масштабное проектирование прежде всего»), который идеально для неё подходит. Он утверждает, что большую часть времени, отведённого на проектирование приложения, вы тратите далеко не на написание кода.
Сама каскадная модель подразумевает, что нужно продумать заранее абсолютно всё — рассчитывая, что благодаря этому не придётся потом тратить время на поиск и устранение недостатков.
Конечно, как и у многих других описанных здесь принципов, у BDUF есть свои противники. Особенно склонны нападать на него сторонники гибких методологий — они полагают, что в мире победившего Agile он просто бесполезен.
Separation оf concerns (принцип разделения ответственности) — один из моих любимых. Я использую его при проектировании платформ или при создании внутренней архитектуры проекта.
Не путайте его с уже упоминавшимся Single responsibility principle (принципом единственной ответственности). SoC помогает объединять функции или модули в отдельные сервисы. Суть в том, что при проектировании многофункциональной системы — а так обычно и бывает — можно группировать функции в модули в зависимости от задач, которые каждая из них выполняет.
Пример: блог-площадка, где пользователи могут публиковать посты. Одна система на такой платформе вполне может отвечать за всё (управление пользователями, посты в блоге, аналитика и так далее) — и даже справится со своими функциями. Но если следовать принципу SoC, можно прийти к более интересному решению:
Инфографика: Майя Мальгина для Skillbox Media
Это, конечно, очень грубый пример, но суть такой архитектуры в том, что вы делите ответственность по модулям. В результате:
-
Вы получаете масштабирование каждого блока функций. Теперь при необходимости вы сможете легко масштабировать тот же модуль управления пользователями (User management) — например, потому, что он тянет на себе слишком много трафика, а остальная часть платформы остаётся незагруженной.
-
Вносить изменения становится легче: связь элементов кода ослаблена, и вы, например, сможете чуть ли не полностью переписать модуль управления постами, не затрагивая другие разделы.
-
Платформа становится более стабильной. Если один из модулей сломается, то система потенциально сможет сохранять работоспособность. С меньшей функциональностью, конечно, но тем не менее это возможно.
SoC также может применяться при создании API, архитектур библиотек и тому подобного. Его суть в том, чтобы группировать функции по своему усмотрению и с пользой для тех, кто будет их применять.
Если отойти от программирования, можно вспомнить и другие аббревиатуры, которые часто используются в нашей отрасли. MVP означает Minimum viable product (минимально жизнеспособный продукт) и предполагает создание минимально необходимой функциональности, которая помогает понять, как продукт работает в реальных условиях и нравится ли он пользователям.
Этим приёмом пользуются сплошь и рядом — чтобы выяснить, стоит ли вообще тратить время на продукт и доводить его до ума. Благодаря MVP целевая аудитория уже может опробовать продукт и дать обратную связь.
В отличие от MVP, который требует серьёзного планирования и больших затрат на разработку, Proof of concept (доказательство концепции) обычно представляет собой его урезанную версию. Он используется на этапе до MVP и предназначен только для того, чтобы подтвердить или опровергнуть необходимость дополнительной функциональности.
По сути, PoC — своего рода расходный материал, временный код. Его пишут не для реализации, а для демонстрации проекта. Включать PoC в реальный продукт, в принципе, можно, но имейте в виду, что для доказательства одной концепции, бывает, приходится создавать несколько PoC. Корпеть над ними всеми, чтобы получить в итоге один актуальный продукт, — так себе идея. Так что его намеренно говнокодят, чтобы потом было не жалко выбрасывать.
Лично мне очень нравится концепция PoC — но именно как расходного материала. Это как Железный Человек и его броня Mark I: она показала, на что он способен, даже если имеет под рукой только дуговой реактор; а Mark II была уже на несколько порядков лучше.
Все аббревиатуры, упомянутые в этой статье, вы наверняка встречали в инструкциях и мануалах или слышали от коллег. Теперь вы знаете, что они означают и в каком контексте их употреблять.
Научитесь: Профессия Java-разработчик + ИИ
Узнать больше
<!DOCTYPE html>
<html class="l-html" lang="ru">
<head>
<script>
mindbox = window.mindbox || function() { mindbox.queue.push(arguments); };
mindbox.queue = mindbox.queue || [];
mindbox('create', {
endpointId: 'skillbox.skillboxMediaWebsite'
});
</script>
<script src="https://api.s.mindbox.ru/scripts/v1/tracker.js" async></script>
<script>window.yaContextCb = window.yaContextCb || []</script>
<script src="https://yandex.ru/ads/system/context.js" async></script>
<!-- Google Tag Manager -->
<script async data-skip-moving="true" type="text/javascript">
/** Google Tagmanager */
;(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start':
new Date().getTime(), event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-NLCGQ25');
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'GTM-NLCGQ25');
</script>
<!-- End Google Tag Manager -->
<!-- Retail Rocket -->
<script type="text/javascript">
var rrPartnerId = "6048a0d097a52514f050731f";
var rrApi = {};
var rrApiOnReady = rrApiOnReady || [];
rrApi.addToBasket = rrApi.order = rrApi.categoryView = rrApi.view =
rrApi.recomMouseDown = rrApi.recomAddToCart = function() {};
(function(d) {
var ref = d.getElementsByTagName('script')[0];
var apiJs, apiJsId = 'rrApi-jssdk';
if (d.getElementById(apiJsId)) return;
apiJs = d.createElement('script');
apiJs.id = apiJsId;
apiJs.async = true;
apiJs.src = "//cdn.retailrocket.ru/content/javascript/tracking.js";
ref.parentNode.insertBefore(apiJs, ref);
}(document));
</script>
<!-- End Retail Rocket -->
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<meta name="google-site-verification" content="UA-kf725UpqwkHenFmDQ05SW115fL9UdD9uXiFy-ibQ"/>
<meta name="robots" content="index, follow"/>
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="canonical" href="https://skillbox.ru/media/code/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya/">
<link rel="preload" href="https://marketplace.canva.com/EAD2962NKnQ/2/0/1600w/canva-rainbow-gradient-pink-and-purple-zoom-virtual-background-_Tcjok-d9b4.jpg" as="image" />
<link rel="preload" href="https://via.placeholder.com/1170x250/92c952" as="image" />
<link rel="preload" href="https://via.placeholder.com/768x250/40E0D0" as="image" />
<link rel="preload" href="https://via.placeholder.com/375x250/ffbcee" as="image" />
<title>IT-термины, которые используют в сообществе программистов / Skillbox Media</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="it термины, сокращения программирование, сообщество программистов, программист" />
<meta name="description" content="Эти сокращения должен знать каждый программист, чтобы понимать, о чём разговаривают его коллеги." />
<link href="/bitrix/cache/css/s1/media/kernel_main/kernel_main_v1.css?177096852510536" type="text/css" rel="stylesheet" />
<link href="/bitrix/js/ui/fonts/opensans/ui.font.opensans.css?16341171742599" type="text/css" rel="stylesheet" />
<link href="/bitrix/js/main/popup/dist/main.popup.bundle.css?163411696226345" type="text/css" rel="stylesheet" />
<link href="//cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/css/swiper.min.css" type="text/css" rel="stylesheet" />
<link href="/bitrix/cache/css/s1/media/page_a1ad23d5ae1fea4c6ac7c690c80a4763/page_a1ad23d5ae1fea4c6ac7c690c80a4763_v1.css?1771490810746236" type="text/css" rel="stylesheet" />
<link href="/bitrix/cache/css/s1/media/template_176a7c2453ad8025fa7d27f65ba6a4b1/template_176a7c2453ad8025fa7d27f65ba6a4b1_v1.css?1771490810442835" type="text/css" data-template-style="true" rel="stylesheet" />
<script type="text/javascript">if(!window.BX)window.BX={};if(!window.BX.message)window.BX.message=function(mess){if(typeof mess==='object'){for(let i in mess) {BX.message[i]=mess[i];} return true;}};</script>
<script type="text/javascript">(window.BX||top.BX).message({'JS_CORE_LOADING':'Загрузка...','JS_CORE_NO_DATA':'- Нет данных -','JS_CORE_WINDOW_CLOSE':'Закрыть','JS_CORE_WINDOW_EXPAND':'Развернуть','JS_CORE_WINDOW_NARROW':'Свернуть в окно','JS_CORE_WINDOW_SAVE':'Сохранить','JS_CORE_WINDOW_CANCEL':'Отменить','JS_CORE_WINDOW_CONTINUE':'Продолжить','JS_CORE_H':'ч','JS_CORE_M':'м','JS_CORE_S':'с','JSADM_AI_HIDE_EXTRA':'Скрыть лишние','JSADM_AI_ALL_NOTIF':'Показать все','JSADM_AUTH_REQ':'Требуется авторизация!','JS_CORE_WINDOW_AUTH':'Войти','JS_CORE_IMAGE_FULL':'Полный размер'});</script>
<script type="text/javascript" src="/bitrix/js/main/core/core.js?1634117028565340"></script>
<script>BX.setJSList(['/bitrix/js/main/core/core_ajax.js','/bitrix/js/main/core/core_promise.js','/bitrix/js/main/polyfill/promise/js/promise.js','/bitrix/js/main/loadext/loadext.js','/bitrix/js/main/loadext/extension.js','/bitrix/js/main/polyfill/promise/js/promise.js','/bitrix/js/main/polyfill/find/js/find.js','/bitrix/js/main/polyfill/includes/js/includes.js','/bitrix/js/main/polyfill/matches/js/matches.js','/bitrix/js/ui/polyfill/closest/js/closest.js','/bitrix/js/main/polyfill/fill/main.polyfill.fill.js','/bitrix/js/main/polyfill/find/js/find.js','/bitrix/js/main/polyfill/matches/js/matches.js','/bitrix/js/main/polyfill/core/dist/polyfill.bundle.js','/bitrix/js/main/core/core.js','/bitrix/js/main/polyfill/intersectionobserver/js/intersectionobserver.js','/bitrix/js/main/lazyload/dist/lazyload.bundle.js','/bitrix/js/main/polyfill/core/dist/polyfill.bundle.js','/bitrix/js/main/parambag/dist/parambag.bundle.js']);
BX.setCSSList(['/bitrix/js/main/lazyload/dist/lazyload.bundle.css','/bitrix/js/main/parambag/dist/parambag.bundle.css']);</script>
<script type="text/javascript">(window.BX||top.BX).message({'AMPM_MODE':false});(window.BX||top.BX).message({'MONTH_1':'Январь','MONTH_2':'Февраль','MONTH_3':'Март','MONTH_4':'Апрель','MONTH_5':'Май','MONTH_6':'Июнь','MONTH_7':'Июль','MONTH_8':'Август','MONTH_9':'Сентябрь','MONTH_10':'Октябрь','MONTH_11':'Ноябрь','MONTH_12':'Декабрь','MONTH_1_S':'января','MONTH_2_S':'февраля','MONTH_3_S':'марта','MONTH_4_S':'апреля','MONTH_5_S':'мая','MONTH_6_S':'июня','MONTH_7_S':'июля','MONTH_8_S':'августа','MONTH_9_S':'сентября','MONTH_10_S':'октября','MONTH_11_S':'ноября','MONTH_12_S':'декабря','MON_1':'янв','MON_2':'фев','MON_3':'мар','MON_4':'апр','MON_5':'май','MON_6':'июн','MON_7':'июл','MON_8':'авг','MON_9':'сен','MON_10':'окт','MON_11':'ноя','MON_12':'дек','DAY_OF_WEEK_0':'Воскресенье','DAY_OF_WEEK_1':'Понедельник','DAY_OF_WEEK_2':'Вторник','DAY_OF_WEEK_3':'Среда','DAY_OF_WEEK_4':'Четверг','DAY_OF_WEEK_5':'Пятница','DAY_OF_WEEK_6':'Суббота','DOW_0':'Вс','DOW_1':'Пн','DOW_2':'Вт','DOW_3':'Ср','DOW_4':'Чт','DOW_5':'Пт','DOW_6':'Сб','FD_SECOND_AGO_0':'#VALUE# секунд назад','FD_SECOND_AGO_1':'#VALUE# секунду назад','FD_SECOND_AGO_10_20':'#VALUE# секунд назад','FD_SECOND_AGO_MOD_1':'#VALUE# секунду назад','FD_SECOND_AGO_MOD_2_4':'#VALUE# секунды назад','FD_SECOND_AGO_MOD_OTHER':'#VALUE# секунд назад','FD_SECOND_DIFF_0':'#VALUE# секунд','FD_SECOND_DIFF_1':'#VALUE# секунда','FD_SECOND_DIFF_10_20':'#VALUE# секунд','FD_SECOND_DIFF_MOD_1':'#VALUE# секунда','FD_SECOND_DIFF_MOD_2_4':'#VALUE# секунды','FD_SECOND_DIFF_MOD_OTHER':'#VALUE# секунд','FD_SECOND_SHORT':'#VALUE#с','FD_MINUTE_AGO_0':'#VALUE# минут назад','FD_MINUTE_AGO_1':'#VALUE# минуту назад','FD_MINUTE_AGO_10_20':'#VALUE# минут назад','FD_MINUTE_AGO_MOD_1':'#VALUE# минуту назад','FD_MINUTE_AGO_MOD_2_4':'#VALUE# минуты назад','FD_MINUTE_AGO_MOD_OTHER':'#VALUE# минут назад','FD_MINUTE_DIFF_0':'#VALUE# минут','FD_MINUTE_DIFF_1':'#VALUE# минута','FD_MINUTE_DIFF_10_20':'#VALUE# минут','FD_MINUTE_DIFF_MOD_1':'#VALUE# минута','FD_MINUTE_DIFF_MOD_2_4':'#VALUE# минуты','FD_MINUTE_DIFF_MOD_OTHER':'#VALUE# минут','FD_MINUTE_0':'#VALUE# минут','FD_MINUTE_1':'#VALUE# минуту','FD_MINUTE_10_20':'#VALUE# минут','FD_MINUTE_MOD_1':'#VALUE# минуту','FD_MINUTE_MOD_2_4':'#VALUE# минуты','FD_MINUTE_MOD_OTHER':'#VALUE# минут','FD_MINUTE_SHORT':'#VALUE#мин','FD_HOUR_AGO_0':'#VALUE# часов назад','FD_HOUR_AGO_1':'#VALUE# час назад','FD_HOUR_AGO_10_20':'#VALUE# часов назад','FD_HOUR_AGO_MOD_1':'#VALUE# час назад','FD_HOUR_AGO_MOD_2_4':'#VALUE# часа назад','FD_HOUR_AGO_MOD_OTHER':'#VALUE# часов назад','FD_HOUR_DIFF_0':'#VALUE# часов','FD_HOUR_DIFF_1':'#VALUE# час','FD_HOUR_DIFF_10_20':'#VALUE# часов','FD_HOUR_DIFF_MOD_1':'#VALUE# час','FD_HOUR_DIFF_MOD_2_4':'#VALUE# часа','FD_HOUR_DIFF_MOD_OTHER':'#VALUE# часов','FD_HOUR_SHORT':'#VALUE#ч','FD_YESTERDAY':'вчера','FD_TODAY':'сегодня','FD_TOMORROW':'завтра','FD_DAY_AGO_0':'#VALUE# дней назад','FD_DAY_AGO_1':'#VALUE# день назад','FD_DAY_AGO_10_20':'#VALUE# дней назад','FD_DAY_AGO_MOD_1':'#VALUE# день назад','FD_DAY_AGO_MOD_2_4':'#VALUE# дня назад','FD_DAY_AGO_MOD_OTHER':'#VALUE# дней назад','FD_DAY_DIFF_0':'#VALUE# дней','FD_DAY_DIFF_1':'#VALUE# день','FD_DAY_DIFF_10_20':'#VALUE# дней','FD_DAY_DIFF_MOD_1':'#VALUE# день','FD_DAY_DIFF_MOD_2_4':'#VALUE# дня','FD_DAY_DIFF_MOD_OTHER':'#VALUE# дней','FD_DAY_AT_TIME':'#DAY# в #TIME#','FD_DAY_SHORT':'#VALUE#д','FD_MONTH_AGO_0':'#VALUE# месяцев назад','FD_MONTH_AGO_1':'#VALUE# месяц назад','FD_MONTH_AGO_10_20':'#VALUE# месяцев назад','FD_MONTH_AGO_MOD_1':'#VALUE# месяц назад','FD_MONTH_AGO_MOD_2_4':'#VALUE# месяца назад','FD_MONTH_AGO_MOD_OTHER':'#VALUE# месяцев назад','FD_MONTH_DIFF_0':'#VALUE# месяцев','FD_MONTH_DIFF_1':'#VALUE# месяц','FD_MONTH_DIFF_10_20':'#VALUE# месяцев','FD_MONTH_DIFF_MOD_1':'#VALUE# месяц','FD_MONTH_DIFF_MOD_2_4':'#VALUE# месяца','FD_MONTH_DIFF_MOD_OTHER':'#VALUE# месяцев','FD_MONTH_SHORT':'#VALUE#мес','FD_YEARS_AGO_0':'#VALUE# лет назад','FD_YEARS_AGO_1':'#VALUE# год назад','FD_YEARS_AGO_10_20':'#VALUE# лет назад','FD_YEARS_AGO_MOD_1':'#VALUE# год назад','FD_YEARS_AGO_MOD_2_4':'#VALUE# года назад','FD_YEARS_AGO_MOD_OTHER':'#VALUE# лет назад','FD_YEARS_DIFF_0':'#VALUE# лет','FD_YEARS_DIFF_1':'#VALUE# год','FD_YEARS_DIFF_10_20':'#VALUE# лет','FD_YEARS_DIFF_MOD_1':'#VALUE# год','FD_YEARS_DIFF_MOD_2_4':'#VALUE# года','FD_YEARS_DIFF_MOD_OTHER':'#VALUE# лет','FD_YEARS_SHORT_0':'#VALUE#л','FD_YEARS_SHORT_1':'#VALUE#г','FD_YEARS_SHORT_10_20':'#VALUE#л','FD_YEARS_SHORT_MOD_1':'#VALUE#г','FD_YEARS_SHORT_MOD_2_4':'#VALUE#г','FD_YEARS_SHORT_MOD_OTHER':'#VALUE#л','CAL_BUTTON':'Выбрать','CAL_TIME_SET':'Установить время','CAL_TIME':'Время','FD_LAST_SEEN_TOMORROW':'завтра в #TIME#','FD_LAST_SEEN_NOW':'только что','FD_LAST_SEEN_TODAY':'сегодня в #TIME#','FD_LAST_SEEN_YESTERDAY':'вчера в #TIME#','FD_LAST_SEEN_MORE_YEAR':'более года назад'});</script>
<script type="text/javascript">(window.BX||top.BX).message({'WEEK_START':'1'});</script>
<script type="text/javascript">(window.BX||top.BX).message({'LANGUAGE_ID':'ru','FORMAT_DATE':'DD.MM.YYYY','FORMAT_DATETIME':'DD.MM.YYYY HH:MI:SS','COOKIE_PREFIX':'BITRIX_SM','SERVER_TZ_OFFSET':'10800','UTF_MODE':'Y','SITE_ID':'s1','SITE_DIR':'/','USER_ID':'','SERVER_TIME':'1771717714','USER_TZ_OFFSET':'0','USER_TZ_AUTO':'Y','bitrix_sessid':'696854acddf1fab52bba4daa2cd19fcd'});</script>
<script type="text/javascript" src="/bitrix/js/main/date/main.date.js?159955296434530"></script>
<script type="text/javascript" src="/bitrix/js/main/popup/dist/main.popup.bundle.js?1634116962109107"></script>
<script type="text/javascript" src="/bitrix/js/main/core/core_date.js?163411653136080"></script>
<script type="text/javascript" src="/bitrix/js/ui/vue/vue2/prod/dist/vue.bundle.js?1635848017173206"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/js/swiper.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/fingerprintjs2/2.1.0/fingerprint2.min.js"></script>
<script type="text/javascript">BX.setCSSList(['/bitrix/js/main/core/css/core_date.css','/setka/css/setka_skillbox.css','/local/templates/.default/components/bitrix/news.detail/article/style.css','/static/css/newarticle.css','/local/templates/media/libs/jquery.formstyler.css','/local/templates/media/fonts/graphik-font/stylesheet.css','/static/css/main.css','/local/templates/media/template_styles.css']);</script>
<script src="https://cdn.skillbox.pro/frontend-libs/promo-banner/5.10.1/banner-plugin.min.js"></script>
<script type="text/javascript" async src="https://relap.io/api/v6/head.js?token=sI73Ph6a5BnkqK2o"></script>
<meta property="og:title" content="Это классика, это знать надо: DRY, KISS, SOLID, YAGNI и другие полезные сокращения" />
<meta property="og:description" content="Эти сокращения каждый программист должен знать так же хорошо, как количество и имена истребителей адмирала Ямамото." />
<meta property="og:url" content="https://skillbox.ru/media/code/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya/" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="skillbox.ru" />
<meta property="og:locale" content="ru_RU" />
<meta property="og:image" content="https://248006.selcdn.ru/main/iblock/31d/31da2f1c8258dbd211e0365be52f8ff1/fea3a4b01f303bb6571e77158ed2f7e9.jpg" />
<meta name="relap-image" content="https://248006.selcdn.ru/main/iblock/31d/31da2f1c8258dbd211e0365be52f8ff1/fea3a4b01f303bb6571e77158ed2f7e9.jpg" />
<meta property="og:image:width" content="600" />
<meta property="og:image:height" content="315" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:image" content="https://248006.selcdn.ru/main/iblock/31d/31da2f1c8258dbd211e0365be52f8ff1/fea3a4b01f303bb6571e77158ed2f7e9.jpg" />
<meta property="vk:image" content="https://248006.selcdn.ru/main/iblock/b14/b14812ab9b1c51ecfb03b5e3e7c30a9b/e8dbf44d7421de8039b7a1f4366fb2cd.jpg" />
<meta property="article:author" content="Руслан Гаджиев" />
<meta property="article:tag" content="статьи" />
<meta property="article:section" content="Код" />
<script type="text/javascript" src="/static/js/vendor.js?1771489421543641"></script>
<script type="text/javascript" src="/local/assets/js/common.js?177148933727419"></script>
<script type="text/javascript" src="/static/js/main.js?1771489421125222"></script>
<script type="text/javascript" src="/local/templates/media/js/main.js?17714893372418"></script>
<script type="text/javascript" src="/local/components/prmedia/popup.subscribe/templates/.default/script.js?17714893376820"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news.detail/article/infinity.js?177148933713735"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news/articles/script.js?1771489337246"></script>
<script type="text/javascript" src="/setka/js/setka_skillbox.js?1771489337106775"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news.detail/article/script.js?17714893377503"></script>
<script type="text/javascript">var _ba = _ba || []; _ba.push(["aid", "84a6082a990bbac8858fb733b97bed30"]); _ba.push(["host", "skillbox.ru"]); (function() {var ba = document.createElement("script"); ba.type = "text/javascript"; ba.async = true;ba.src = (document.location.protocol == "https:" ? "https://" : "http://") + "bitrix.info/ba.js";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ba, s);})();</script>
</head>
<body>
<div class="js-sticky-delimiter"></div>
<div class="bx-panel"></div>
<!-- Google Tag Manager (noscript) -->
<noscript>
<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NLCGQ25" height="0" width="0"
style="display:none;visibility:hidden"></iframe>
</noscript>
<!-- End Google Tag Manager (noscript) -->
<svg class="app-svg-visually-hidden" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="def-arrow-down-a" d="M223 20813l4 5 4-5z"/>
<path id="def-arrow-a" d="M1044.6 803.2a.81.81 0 01-.5.18.8.8 0 01-.8-.8v-3.24c-2.97.1-5.17.88-6.52 2.3a4.86 4.86 0 00-1.39 3.29.8.8 0 01-.75.83h-.04a.79.79 0 01-.79-.74c-.22-3.78.69-6.76 2.69-8.84a10.76 10.76 0 016.81-3.07v-3.3a.8.8 0 011.29-.63l7.91 6.39a.8.8 0 010 1.25zm.3-11.73v2.42a.5.5 0 01-.03.1.8.8 0 01-.05.21.78.78 0 01-.47.42.67.67 0 01-.25.05h-.01c-.06 0-3.93-.04-6.46 2.62-.8.85-1.4 1.87-1.74 2.99 1.79-1.7 4.55-2.57 8.21-2.57.44 0 .8.36.8.8v2.4l5.85-4.72z"/>
<path id="def-be-a" d="M55.6 29.58h6.12v-1.59H55.6zm.64 5.74s.26-2.23 2.58-2.23c2.32 0 2.26 2.23 2.26 2.23zm-3.23 1.27S52.56 42 58.72 42c0 0 5.26.37 5.26-3.81H61.4s-.09 1.59-2.58 1.59c0 0-2.58.17-2.58-2.55l7.74-.01c-.08-.32.9-6.42-5.16-6.36-5.77.05-5.81 5.73-5.81 5.73zm-10.34 2.8v-4.24H47s1.7.16 1.7 2.24c0 1.76-1.06 1.99-1.7 2zM47 29.61s1.16.06 1.16 1.62-.76 1.64-1.49 1.64h-4v-3.26zm4.33 1.3c0-2.68-1.81-3.91-4.26-3.91H39v15.01h8.07s4.92.15 4.92-4.43c0 0 .22-3.73-2.9-3.73 0 0 2.24-.25 2.24-2.94z"/>
<path id="def-briefcase-a" d="M855 13538c0-1.7 1.3-3 3-3s3 1.3 3 3v7c0 1.7-1.3 3-3 3s-3-1.3-3-3v-7z"/>
<path id="def-comments-a" d="M752 8958l-4 4v-12a1 1 0 011-1h11a1 1 0 011 1v7a1 1 0 01-1 1zm12-6v13l-3.2-4H751l2-2h9v-8h1c1 0 1 .45 1 1z"/>
<path id="def-eaye-a" d="M630 8956.22c0 1.04-3.58 5.21-8 5.21s-8-4.26-8-5.21c0-1.05 3.58-5.22 8-5.22s8 4.17 8 5.22zm-5 0h-3v-3.13a3.13 3.13 0 100 6.26 3.07 3.07 0 003-3.13z"/>
<path id="def-file-a" d="M493 9457a2 2 0 01-1.98-2v-16a2 2 0 011.98-2h19.82c1.13 0 2.07.87 2.15 2v16a2.15 2.15 0 01-2.15 2zm0-18v8.83l5.3-4.59a.98.98 0 011.35.05l5.34 5.39 3.27-2.48a.98.98 0 011.36.16l3.35 4.07V9439zm19.97 14.55l-4.27-5.18-3.21 2.43c-.4.3-.95.26-1.3-.09l-5.3-5.35-5.9 5.1v4.54h19.98zm-6.1-10.55a1.98 1.98 0 113.97.04 1.98 1.98 0 01-3.97-.04z"/>
<path id="def-gplus-a" d="M466 10169a4 4 0 013.87-3.99 4.14 4.14 0 012.93.99c-.33.36-.67.71-1.03 1.04-.72-.42-1.58-.75-2.41-.46a2.52 2.52 0 00-1.67 3.23c.41 1.35 2.09 2.1 3.4 1.52a2.22 2.22 0 001.33-1.51c-.78-.01-1.56 0-2.34-.03v-1.36h3.9a4.45 4.45 0 01-.83 3.2c-1 1.28-2.88 1.66-4.4 1.16a4 4 0 01-2.75-3.79z"/><path id="def-gplus-b" d="M476.34 10166h1.32l.01 1.33H479v1.33l-1.33.01v1.33h-1.33l-.01-1.33H475v-1.33l1.33-.01.01-1.33z"/>
<path id="def-inst-a" d="M1480.93 332c-3.5 0-3.95.02-5.32.07-1.37.07-2.3.28-3.14.6-.84.34-1.57.77-2.28 1.5a6.36 6.36 0 00-1.5 2.28 9.84 9.84 0 00-.6 3.14c-.07 1.37-.07 1.82-.07 5.32s.02 3.96.07 5.32c.07 1.37.28 2.31.6 3.14.34.85.77 1.58 1.5 2.29a6.51 6.51 0 002.28 1.5c.82.3 1.77.53 3.14.6 1.37.07 1.82.07 5.32.07s3.96-.02 5.32-.07a9.48 9.48 0 003.14-.6 6.14 6.14 0 002.29-1.5 6.36 6.36 0 001.5-2.29c.3-.81.53-1.77.6-3.14.07-1.36.07-1.82.07-5.32s-.02-3.95-.07-5.32a9.48 9.48 0 00-.6-3.14 6.14 6.14 0 00-1.5-2.28 6.36 6.36 0 00-2.29-1.5 9.84 9.84 0 00-3.14-.6c-1.38-.05-1.82-.07-5.32-.07zm0 2.32c3.45 0 3.85.02 5.22.07 1.27.05 1.94.26 2.4.45.6.25 1.03.52 1.48.97.45.45.73.89.97 1.5.18.44.39 1.14.45 2.39.07 1.37.07 1.76.07 5.21s-.01 3.85-.07 5.22a6.55 6.55 0 01-.45 2.4c-.24.6-.52 1.03-.97 1.48-.45.45-.88.73-1.49.97-.45.18-1.14.39-2.39.45-1.37.07-1.77.07-5.22.07-3.45 0-3.84-.01-5.21-.07a6.55 6.55 0 01-2.4-.45 4.11 4.11 0 01-1.49-.97 4.11 4.11 0 01-.97-1.49 7.52 7.52 0 01-.45-2.39c-.07-1.37-.07-1.77-.07-5.22 0-3.45.02-3.84.07-5.21.05-1.27.26-1.95.45-2.4.25-.6.52-1.04.97-1.49.45-.45.89-.72 1.5-.97a7.52 7.52 0 012.39-.45c1.35-.05 1.76-.07 5.21-.07z"/><path id="def-inst-b" d="M1480.93 349.2a4.3 4.3 0 110-8.59 4.3 4.3 0 010 8.6zm0-10.93a6.62 6.62 0 100 13.24 6.62 6.62 0 000-13.24z"/><path id="def-inst-c" d="M1486.27 338.01a1.54 1.54 0 113.09 0 1.54 1.54 0 01-3.09 0z"/>
<path id="def-like-down-a" d="M1004.33 543.66c-1.1 0-2.45-.86-2.61-3.31-.05-1.41.11-2.82.48-4.19h-2.96c-2.15 0-3.42-1.35-3.42-2.67 0-.39.05-.77.17-1.13a2.4 2.4 0 01-.99-2.03 2.35 2.35 0 011.02-2.05c-.12-.34-.18-.7-.17-1.06.86-.6 1.2-1.7.86-2.7 0-2.52 3.45-2.52 4.57-2.52h2.85c1.3.06 2.56.4 3.71 1 .67.36 1.41.6 2.18.67h3.23c.25 0 .5.11.65.31.12.14 1.1 1.47 1.1 4.69.03 1.8-.28 3.6-.9 5.31a.83.83 0 01-.67.5c-.03 0-3.27.4-4.85 1.98a10.32 10.32 0 00-2.8 5.94 1.4 1.4 0 01-1.45 1.26zm-6.84-10.17c0 .34.52 1 1.75 1h4.06a.83.83 0 01.8 1.1c-.5 1.5-.73 3.07-.72 4.65.08 1.1.44 1.6.79 1.72a11.94 11.94 0 013.23-6.67c1.57-1.58 4.2-2.18 5.32-2.38.41-1.37.62-2.8.61-4.24a8.18 8.18 0 00-.56-3.34h-2.75c-1-.07-1.97-.35-2.85-.81a7.53 7.53 0 00-3.04-.85h-2.85c-1.32 0-2.9.15-2.9.85-.02.11.02.22.09.3a.73.73 0 01.75.77.92.92 0 01-.85.87.85.85 0 00-.85.77c-.05.22.01.44.17.6.42.07.71.45.67.88a.87.87 0 01-.86.77.77.77 0 00-.83.85.8.8 0 00.87.85c.46.01.82.4.81.85 0 .43-.33.78-.76.8-.09.21-.12.44-.1.66z"/>
<path id="def-like-up-a" d="M944.67 520c1.1 0 2.45.87 2.61 3.32.05 1.4-.11 2.82-.48 4.18h2.96c2.15 0 3.42 1.36 3.42 2.67 0 .39-.05.77-.17 1.14a2.4 2.4 0 01.99 2.02c.04.81-.35 1.59-1.02 2.05.12.34.18.7.17 1.07-.86.6-1.2 1.7-.86 2.69 0 2.52-3.45 2.52-4.57 2.52h-2.85a8.94 8.94 0 01-3.71-.99 5.67 5.67 0 00-2.18-.67h-3.23a.83.83 0 01-.65-.32c-.12-.14-1.1-1.47-1.1-4.68-.03-1.81.28-3.62.9-5.32a.83.83 0 01.67-.5c.03 0 3.27-.4 4.85-1.98a10.32 10.32 0 002.8-5.93 1.4 1.4 0 011.45-1.27zm6.84 10.17c0-.34-.52-1-1.75-1h-4.06a.83.83 0 01-.8-1.1c.5-1.5.73-3.07.72-4.65-.08-1.1-.44-1.6-.79-1.72a11.94 11.94 0 01-3.23 6.67c-1.57 1.58-4.2 2.19-5.32 2.38a14.38 14.38 0 00-.61 4.25 8.18 8.18 0 00.56 3.33h2.75c1 .07 1.97.35 2.85.82.94.49 1.98.78 3.04.85h2.85c1.32 0 2.9-.15 2.9-.86a.35.35 0 00-.09-.3.73.73 0 01-.75-.77.92.92 0 01.85-.87c.44 0 .81-.33.85-.77a.65.65 0 00-.17-.6.81.81 0 01-.67-.87.87.87 0 01.86-.78.77.77 0 00.83-.85.8.8 0 00-.87-.85.83.83 0 01-.81-.85c0-.43.33-.78.76-.8.09-.21.12-.43.1-.66z"/>
<path id="def-like-a" d="M701.32 8960.32a.95.95 0 01-.95.95h-5.72c-.96 0-1.92-.95-2.87-.95h-.95v-6.68c.04-.6.4-1.12.95-1.36a4.78 4.78 0 002.87-4.37v-.96a.95.95 0 01.95-.95h.95c.53 0 .95.43.95.95v5.73h3.82a.9.9 0 01.96.96zm-14.31.95v-9.54h1.9a.96.96 0 01.97.95v7.64a.96.96 0 01-.96.95zm.99-8.3a.48.48 0 10.88.38.48.48 0 00-.88-.38z"/>
<path id="def-link-a" d="M626.02 1163.93l-.02 15.99 13.02.01v-4a.86.86 0 01.24-.68.9.9 0 01.66-.28 1 1 0 011 1v4.95a1 1 0 01-.29.7 1 1 0 01-.71.29H625a1 1 0 01-.71-.29 1 1 0 01-.29-.7V1163a1 1 0 011-1h3.95a1 1 0 011 1 .89.89 0 01-.93.93z"/><path id="def-link-b" d="M641.95 1171a1 1 0 01-1-1v-5.59l-9.25 9.3a.99.99 0 01-1.41-.01.99.99 0 01.01-1.41l9.24-9.29h-5.56a1 1 0 01-1-1 1 1 0 011-1h7.97a1 1 0 011 1v8a1 1 0 01-1 1z"/>
<path id="def-mail-a" d="M1058 261c0-.6-.4-1-1-1h-14c-.6 0-1 .4-1 1l8 6.5z"/><path id="def-mail-b" d="M1042 262.5v8.5c0 .6.4 1 1 1h14c.6 0 1-.4 1-1v-8.5l-8 6.5z"/>
<path id="def-outside-a" d="M1204.24 9231.16h-10.05c-.92 0-1.67-.75-1.67-1.68v-4.2c0-.46.38-.84.84-.84a.81.81 0 01.8.84v4.2h10.08v-16.8h-10.08v4.2a.81.81 0 01-.8.84.84.84 0 01-.84-.84v-4.2c0-.93.75-1.68 1.67-1.68h10.05c.92 0 1.67.75 1.67 1.68v16.8c0 .93-.75 1.68-1.67 1.68zm-15.56-10.92h11.37a.84.84 0 110 1.68h-11.36l1.91 1.92a.84.84 0 11-1.18 1.2l-3.35-3.36a.86.86 0 01-.24-.6v-.02a.83.83 0 01.24-.58l3.35-3.36a.83.83 0 011.18 0c.33.33.33.87 0 1.2z"/>
<path id="def-pencil-a" d="M1190.84 9818.68a.64.64 0 01-.19.13l-.07.06-4.42 1.82c-.1.05-.21.07-.32.07a.83.83 0 01-.77-1.15l1.84-4.4v-.02a.38.38 0 01.09-.13l.08-.13v-.01l10.82-10.82-.44-.44-3.56 3.57a.83.83 0 01-1.18-1.18l4.16-4.15a.81.81 0 011.17 0l1.03 1.03 1.86-1.86a.84.84 0 011.17 0l2.58 2.58c.33.32.33.85 0 1.18zm-2.88-1.7l-.58 1.41 1.41-.58zm.88-1.47l1.41 1.4 10.24-10.23-1.4-1.4zm12.69-12.68l-1.27 1.27 1.4 1.4 1.28-1.27z"/>
<path id="def-phone-a" d="M732.62 41c-2.25 0-6.37-2.73-10.24-6.78a33.08 33.08 0 01-5.22-6.96c-1.33-2.53-1.52-4.32-.56-5.31l2.91-2.72c.17-.16.4-.24.63-.23.24.02.46.13.61.32l3.79 4.58c.23.28.28.68.12 1.01l-1.47 3.08 5.24 5.48 2.93-1.54a.83.83 0 01.96.12l4.38 3.96c.17.16.28.38.3.63a.97.97 0 01-.22.67l-2.53 3.02c-.33.34-.81.67-1.63.67zm-14.76-17.78c-.15.21-.25 1.09.83 3.15 1.06 2 2.8 4.32 4.93 6.55 3.87 4.06 7.53 6.25 9 6.25.2 0 .3-.04.33-.08l1.94-2.3-3.27-2.95-2.98 1.56a.84.84 0 01-1.01-.17l-6.12-6.42a.92.92 0 01-.16-1.05l1.48-3.12-2.82-3.42z"/>
<path id="def-plus-a" d="M1223.33 4172.67h-6.66v6.66a.67.67 0 01-1.34 0v-6.66h-6.66a.67.67 0 010-1.34h6.66v-6.66a.67.67 0 011.34 0v6.66h6.66a.67.67 0 010 1.34z"/>
<path id="def-search-a" d="M1092.53 24.87a6.7 6.7 0 10-.05 13.4 6.7 6.7 0 00.05-13.4zm12.1 18.85a.95.95 0 01-1.35 0l-5.4-5.43a8.62 8.62 0 111.35-1.35l5.4 5.43c.37.37.37.98 0 1.35z"/>
<path id="def-shape-a" d="M879 13323h-4a1 1 0 01-1-1v-4a1 1 0 011-1h.85c-1.29-8.14-8.38-15.22-16.85-16.81v.81a1 1 0 01-1 1h-4a1 1 0 01-1-1v-.81c-8.47 1.6-15.56 8.67-16.85 16.81h.85a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4a1 1 0 011-1h1.13c1.03-7.24 6.24-13.76 13.07-17h-6.48a1.98 1.98 0 01-1.72 1.01c-.97 0-1.8-.69-1.98-1.65a2 2 0 011.28-2.23 2 2 0 012.42.87H853v-1a1 1 0 011-1h4a1 1 0 011 1v1h12.27a2.01 2.01 0 110 2h-6.47c6.83 3.24 12.04 9.76 13.07 17H879a1 1 0 011 1v4a1 1 0 01-1 1zm-43-4h-2v2h2zm21-21h-2v2h2zm21 21h-2v2h2zm-22.93-12.51a.52.52 0 01.1-.18l.01-.03.03-.03a1 1 0 01.2-.21l.06-.04c.06-.04.12-.08.19-.1l.04-.02.09-.01.05-.01.16-.03.15.03h.04l.11.01.04.02.19.1.02.02.02.01a.92.92 0 01.24.25l.02.03c.04.05.08.12.1.18l.03.05c.02.07 2.33 7.26 8.51 10.59.26.14.45.39.51.68a.97.97 0 01-.2.82 23.7 23.7 0 00-3.99 8.81 8.02 8.02 0 012.21 5.57 1 1 0 01-1 1h-14a1 1 0 01-1-1 8.02 8.02 0 012.21-5.57 23.66 23.66 0 00-3.99-8.8 1 1 0 01.31-1.51c6.21-3.34 8.49-10.52 8.51-10.59l.03-.04zm.93 20.49a6 6 0 00-5.92 5.02h11.84a6 6 0 00-5.92-5.02zm-4.06-.9a8.17 8.17 0 018.12 0 25.8 25.8 0 013.47-7.78 20.33 20.33 0 01-6.53-6.96v6.93a2 2 0 01-.97 3.73 2.03 2.03 0 01-2.03-2 2 2 0 011-1.7v-6.96a20.33 20.33 0 01-6.53 6.96 25.8 25.8 0 013.47 7.78z"/>
<path id="def-strawberry-a" d="M873.26 13427.96a7.49 7.49 0 01-4.13-1.21 20.45 20.45 0 012.02 8.92c0 10.41-17.26 18.25-28.46 18.25-3.71 0-6.53-.86-8.17-2.48l-.1-.1c-3.9-4.01-2.65-13.97.62-21.78 3.77-9.01 9.53-14.39 15.41-14.39 3.1 0 6.17.68 8.97 1.99a8.12 8.12 0 01-.65-1.24c-1.09-2.7-.53-5.87 1.68-9.44a1 1 0 011.11-.45c.21.06 5.12 1.38 6.8 5.49.8 2.19.7 4.61-.29 6.72 1.25-.51 2.58-.79 3.92-.83 5.12 0 7.74 4.75 8.4 7.26a.97.97 0 01-.45 1.1 12.95 12.95 0 01-6.68 2.19zm-36.36 2.36c-3.42 8.19-3.85 16.84-.97 19.69l.08.09c1.26 1.18 3.62 1.82 6.68 1.82a38.27 38.27 0 0017.26-4.82c3.43-1.92 9.18-5.96 9.18-11.43a18.4 18.4 0 00-18.68-18.5c-5.93 0-10.89 6.79-13.55 13.15zm29.59-18.05c-.97-2.38-3.49-3.6-4.73-4.07-1.52 2.71-1.89 5.05-1.12 6.96.96 2.37 3.48 3.6 4.73 4.08 1.52-2.71 1.89-5.05 1.12-6.97zm5.5 7.13c-1.75.08-3.45.6-4.95 1.51.59 1.54 2.36 5.06 6.22 5.06 1.75-.08 3.45-.6 4.94-1.5-.59-1.55-2.36-5.07-6.21-5.07zm-13.43 13.54h3v3h-3zm-4-5h3v3h-3zm2 13h-3v-3h3zm-7-8h3v3h-3zm0-9h3v3h-3zm2 22h-3v-3h3zm-7-8h3v3h-3zm0-9h3v3h-3zm-5 14h3v3h-3zm0-9h3v3h-3z"/>
<path id="def-telegram-a" d="M823.8 272.93l-4.09 20.05c-.3 1.42-1.16 1.76-2.36 1.1l-6.52-4.77-3.13 3c-.55.47-.75.66-1.27.65-.5 0-.74-.3-1.03-1.1l-2.4-7.29-6.26-1.94c-1.01-.32-1.06-1.66.31-2.05l25.01-9.39c1.14-.52 2.18 0 1.74 1.74zm-17.39 18.55l.6-5.26 11.83-10.54c.31-.36.09-.88-.61-.42l-14.24 8.87z"/>
<path id="def-tm-a" d="M1406.46 346.34l13.28-8.34c.65-.44.86.05.57.39l-11.02 9.91-.57 4.96zm16.84-12.16l-23.32 8.83c-1.27.37-1.24 1.62-.3 1.93l5.84 1.82 2.24 6.86c.28.75.5 1.04.96 1.04.49 0 .67-.18 1.19-.62.58-.55 1.5-1.43 2.92-2.83l6.08 4.49c1.12.62 1.92.3 2.21-1.04l3.8-18.85c.41-1.63-.55-2.12-1.62-1.63z"/>
<path id="def-trash-a" d="M1175 9805h-1.09l-1.8 13.12a2.15 2.15 0 01-2.11 1.88h-8a2.14 2.14 0 01-2.1-1.88l-1.78-13.12H1157a1 1 0 010-2h5v-1a3 3 0 013-3h2a3 3 0 013 3v1h5a1 1 0 010 2zm-7-3a1 1 0 00-1-1h-2a1 1 0 00-1 1v1h4zm-7.87 3l1.75 12.9c.02.05.07.09.12.1h8c.06-.01.1-.05.12-.11l1.78-12.89zm6.87 3h2v6h-2zm-4 0h2v6h-2z"/>
<path id="def-triangle-a" d="M1238 6883l7.22 7.22 7.22-7.22z"/>
<path id="def-user-circle-a" d="M1265.24 30.18a10 10 0 01-2.18 10.9 6.94 6.94 0 00-4.7-4.69 5 5 0 10-4.66.01c-2.24.72-4 2.47-4.72 4.71a10 10 0 1116.26-10.93zm-6.22 1.82a3 3 0 11-6-.01 3 3 0 016 .01zm-8.3 10.48c.4-2.6 2.65-4.5 5.28-4.48 2.73 0 5.1 1.96 5.27 4.37l.03.09a9.9 9.9 0 01-10.57.02zM1256 46a12.01 12.01 0 000-24 12 12 0 100 24z"/>
<path id="def-vb-a" d="M955.45 276.38c.68 3.25.79 6.51-.02 9.76-.14.57-.36 1.11-.58 1.65-.84 2.05-2.5 3.13-4.57 3.73-1.63.48-3.31.69-5 .82-.89.07-2.29.03-3.18.02-.76-.01-.55-.04-1.04.45-.96.97-1.84 1.82-2.76 2.84a28 28 0 01-1.35 1.35v-4.93c0-.25-.07-.4-.3-.5-.26-.1-.5-.24-.75-.34a6.95 6.95 0 01-4.35-4.98 19.93 19.93 0 01-.51-6.16c.07-1.4.26-2.79.64-4.15a6.8 6.8 0 013.48-4.25 13.83 13.83 0 014.79-1.47 25.9 25.9 0 019.8.59 8.9 8.9 0 013.5 1.69 6.59 6.59 0 012.2 3.88zm-12.05-1.52c.54.04 1.07.15 1.6.28 1.98.5 3.52 1.53 4.32 3.43.42.99.63 2.02.7 3.08.02.27.15.42.43.42.27-.01.38-.19.39-.43.02-.21.01-.42.01-.64a7.41 7.41 0 00-1.39-4.12c-1.49-1.96-3.43-2.7-6-2.82-.31-.02-.49.1-.51.42-.01.31.21.36.45.38zm4.39 4.61c.11.4.21.81.26 1.22.03.27-.03.64.42.65.32.01.4-.13.43-.67a4.58 4.58 0 00-.68-2.46c-.96-1.52-2.37-2.16-4.16-2.32-.28-.03-.48.08-.52.37-.05.3.14.44.41.48.55.08 1.08.22 1.6.4a3.32 3.32 0 012.24 2.33zm-2.22-1.46a2.29 2.29 0 00-.89-.22c-.38.03-.58.19-.58.45.01.33.3.33.52.39l.27.06c.72.19 1.13.65 1.27 1.36.03.13.04.27.08.4.06.18.18.31.4.31.21-.01.34-.13.39-.32l.04-.35a2.4 2.4 0 00-1.5-2.08zm4.89 7.94c-.78-.65-1.6-1.25-2.47-1.78-1.02-.62-1.77-.45-2.47.49l-.11.14c-.32.39-.72.54-1.22.4a5.89 5.89 0 01-1.51-.74 6.76 6.76 0 01-2.77-3.19c-.35-.82-.19-1.35.54-1.88l.28-.2c.55-.45.68-.89.37-1.52a9.94 9.94 0 00-2.3-3.05 1.3 1.3 0 00-.97-.36 2.9 2.9 0 00-2.62 2.74c-.01.37.08.78.24 1.17 2.23 5.38 6.16 9.1 11.6 11.36.4.17.82.27 1.25.15a3.75 3.75 0 002.55-2.16c.28-.61.14-1.13-.39-1.57z"/>
<path id="def-ynadex-a" d="M471.93 10326.44h-.59c-.92 0-1.8-.64-1.8-2.24 0-1.67.83-2.35 1.68-2.35h.7v4.59zm.92-5.44h-1.6c-1.55 0-2.87 1.13-2.87 3.33 0 1.32.64 2.3 1.78 2.78l-2.13 3.68c-.07.12 0 .21.1.21h1c.08 0 .14-.03.17-.1l1.93-3.6h.7v3.6c0 .05.04.1.1.1h.86c.08 0 .11-.04.11-.1v-9.77c0-.09-.06-.13-.15-.13z"/>
<path id="def-ytube-a" d="M1343.37 349.72v-9.44l6.27 4.72zm-7.81-14.03a3.54 3.54 0 00-3.56 3.51v11.6a3.54 3.54 0 003.56 3.51h19.88a3.54 3.54 0 003.56-3.5V339.2a3.54 3.54 0 00-3.56-3.51h-19.88z"/>
</defs>
<symbol id="icon-arrow-chevron" viewBox="0 0 9 15"><path d="M7.07.862L0 7.93 7.072 15l1.06-1.06-6.011-6.01L8.13 1.922 7.07.862z"/></symbol>
<symbol id="icon-arrow-down" viewBox="0 0 8 5"><use xlink:href="#def-arrow-down-a" transform="translate(-223 -20813)"/></symbol>
<symbol id="icon-arrow-left" viewBox="0 0 18 12"><path d="M.1 6.3c-.1-.3 0-.6.1-.8l4.3-4.3c.3-.3.7-.3 1 0 .3.3.3.7 0 1l-3 3.1h14.1c.4 0 .7.3.7.7 0 .4-.3.7-.7.7H2.5l3.1 3.1c.3.3.3.8 0 1-.2.2-.3.2-.4.3-.2.1-.5 0-.7-.2L.2 6.6c-.1-.1-.1-.2-.1-.3z"/></symbol>
<symbol id="icon-arrow-menu" viewBox="0 0 10 5"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 0l5 5 5-5H0z"/></symbol>
<symbol id="icon-arrow-right" viewBox="0 0 15 12"><path d="M14.19 5.77c.11.26.05.57-.15.78l-4.32 4.33a.72.72 0 01-1.02 0 .72.72 0 010-1.02l3.09-3.1H.69A.72.72 0 010 6.04c0-.38.31-.7.69-.72h11.1L8.7 2.23a.73.73 0 01.33-1.21c.24-.06.51.01.69.19l4.32 4.32a.6.6 0 01.15.24z"/></symbol>
<symbol id="icon-arrow" viewBox="0 0 20 17"><use xlink:href="#def-arrow-a" transform="translate(-1033 -789)"/></symbol>
<symbol id="icon-be" viewBox="0 0 25 16"><use xlink:href="#def-be-a" transform="translate(-39 -27)"/></symbol>
<symbol id="icon-be2-mob" viewBox="0 0 34 34"><path d="M15.426 16.508s1.507-.112 1.507-1.879S15.7 12 14.138 12H9v9.875h5.138s3.137.099 3.137-2.915c0 0 .137-2.452-1.85-2.452zm-4.162-2.753h2.874s.699 0 .699 1.027c0 1.028-.411 1.177-.877 1.177h-2.696v-2.204zm2.742 6.365h-2.742v-2.64h2.874s1.041-.013 1.041 1.357c0 1.142-.761 1.271-1.173 1.283zM23.408 12.582h-4.074v1.216h4.074v-1.216zM21.458 14.513c-3.797 0-3.794 3.793-3.794 3.793s-.26 3.775 3.794 3.775c0 0 3.38.193 3.38-2.626H23.1s.058 1.062-1.584 1.062c0 0-1.737.116-1.737-1.718h5.116s.56-4.286-3.437-4.286zm1.545 2.968h-3.244s.213-1.522 1.738-1.522 1.506 1.522 1.506 1.522z"/></symbol>
<symbol id="icon-be2" viewBox="0 0 56 56"><path d="M27.475 27.946s1.987-.148 1.987-2.479c0-2.33-1.625-3.467-3.685-3.467H19v13.024h6.777s4.137.13 4.137-3.844c0 0 .18-3.234-2.439-3.234zm-5.489-3.631h3.791s.921 0 .921 1.355-.542 1.551-1.156 1.551h-3.556v-2.906zm3.616 8.394h-3.616v-3.48h3.79s1.374-.018 1.374 1.788c0 1.506-1.004 1.677-1.548 1.692zM38.004 22.767H32.63v1.604h5.373v-1.604zM35.432 25.314c-5.009 0-5.004 5.003-5.004 5.003s-.344 4.98 5.004 4.98c0 0 4.456.254 4.456-3.464h-2.292s.077 1.4-2.088 1.4c0 0-2.291.154-2.291-2.266h6.748s.738-5.653-4.533-5.653zm2.037 3.915H33.19s.28-2.008 2.291-2.008c2.013 0 1.987 2.008 1.987 2.008z"/></symbol>
<symbol id="icon-briefcase" viewBox="834 13519 48 44"><path d="M836.5 13563c-1.4 0-2.5-1.2-2.5-2.6v-19.4c0 .6.4 1 1 1h1v18.4c0 .3.2.6.5.6h42.9c.3 0 .5-.3.5-.6v-18.4h1c.6 0 1-.4 1-1s-.4-1-1-1h-1v-10.4c0-.3-.2-.5-.5-.6h-42.9c-.3 0-.5.3-.5.6v10.4h-1c-.6 0-1 .4-1 1v-11.4c0-1.4 1.1-2.5 2.5-2.6H849v1c0 .6.4 1 1 1s1-.4 1-1v-1h14v1c0 .6.4 1 1 1 .3 0 .5-.1.7-.3.2-.2.3-.4.3-.7v-1h12.5c1.4 0 2.5 1.2 2.5 2.6v30.9c0 1.4-1.1 2.6-2.5 2.6h-43zm18.4-21H836v-2h18.9c.6 0 1 .4 1 1s-.4 1-1 1zm25.1-2v2h-18.9c-.6 0-1-.4-1-1s.4-1 1-1H880zm-13-16.8c0-2.3-1.9-4.2-4.2-4.2h-9.6c-2.3 0-4.2 1.9-4.2 4.2v3.8h2v-3.8c0-1.2 1-2.2 2.2-2.2h9.6c1.2 0 2.2 1 2.2 2.2v3.8h2v-3.8z"/><clipPath id="def-briefcase-b"><use xlink:href="#def-briefcase-a" overflow="visible"/></clipPath><g clip-path="url(#def-briefcase-b)"><path stroke-width="4" stroke-miterlimit="50" d="M855 13538c0-1.7 1.3-3 3-3s3 1.3 3 3v7c0 1.7-1.3 3-3 3s-3-1.3-3-3v-7z"/></g></symbol>
<symbol id="icon-burger" viewBox="0 0 20 14"><g fill-rule="evenodd"><path d="M0 0h20v2H0zM0 6h20v2H0zM0 12h20v2H0z"/></g></symbol>
<symbol id="icon-cancel-circle" viewBox="0 0 24 24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zm0-22a10 10 0 100 20 10 10 0 000-20zm4.71 13.29L13.41 12l3.3-3.29a1 1 0 00-.02-1.4 1 1 0 00-1.4-.02L12 10.59l-3.29-3.3a1 1 0 00-1.4.02 1 1 0 00-.02 1.4l3.3 3.29-3.3 3.29a1 1 0 00.02 1.4 1 1 0 001.4.02l3.29-3.3 3.29 3.3a1 1 0 001.42 0 1 1 0 000-1.42z"/></symbol>
<symbol id="icon-clip" viewBox="0 0 25 22"><path d="M12.1 21.37a1.02 1.02 0 01-.71-1.73L21.74 9.11a4.19 4.19 0 000-5.87 4.04 4.04 0 00-5.78 0l-12 12.21c-.59.49-.94 1.2-.97 1.97.05.49.28.95.63 1.29.31.35.77.53 1.23.48.74-.17 1.4-.57 1.89-1.15l9.42-9.58a.98.98 0 011.41 0c.39.4.39 1.04 0 1.44l-9.42 9.58A5.3 5.3 0 015.1 21.2a3.37 3.37 0 01-2.89-1.05A4.16 4.16 0 011 17.54a4.62 4.62 0 011.55-3.53l12-12.2a6.03 6.03 0 018.6 0 6.24 6.24 0 010 8.74L12.8 21.07a.98.98 0 01-.7.3z"/></symbol>
<symbol id="icon-clock" viewBox="0 0 24 24"><path d="M0 12a12 12 0 1124 0 12 12 0 01-24 0zm2 0a10 10 0 1020 0 10 10 0 00-20 0zm14 5a1 1 0 00.71-1.71L13 11.59V5a1 1 0 00-1-1 1 1 0 00-1 1v7a1 1 0 00.08.38c.05.12.12.24.21.33l4 4c.19.18.45.29.71.29z"/></symbol>
<symbol id="icon-close-menu" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.636 2.303L13.97.636 8.136 6.469 2.303.636.636 2.303 6.47 8.136.636 13.97l1.667 1.667 5.833-5.833 5.833 5.833 1.667-1.666-5.833-5.834 5.833-5.833z"/></symbol>
<symbol id="icon-close" viewBox="0 0 16 15"><g fill-rule="evenodd"><path d="M1.963.045l13.791 12.86-1.364 1.463L.6 1.508z"/><path d="M14.39.045L.6 12.905l1.364 1.463 13.79-12.86z"/></g></symbol>
<symbol id="icon-comments" viewBox="0 0 16 16"><use xlink:href="#def-comments-a" transform="translate(-748 -8949)"/></symbol>
<symbol id="icon-eaye" viewBox="0 0 16 11"><use xlink:href="#def-eaye-a" transform="translate(-614 -8951)"/></symbol>
<symbol id="icon-fb" viewBox="0 0 13 25"><path d="M8.44 25V13.6h3.83l.58-4.45H8.44V6.31c0-1.28.36-2.16 2.2-2.16H13V.18A29.7 29.7 0 009.57 0c-3.4 0-5.73 2.07-5.73 5.87v3.28H0v4.45h3.84V25z"/></symbol>
<symbol id="icon-fb2-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M18.415 24.638v-7.131h2.457l.366-2.784h-2.823v-1.776c0-.8.23-1.351 1.411-1.351h1.514v-2.49A21.931 21.931 0 0019.14 9c-2.182 0-3.677 1.295-3.677 3.672v2.051H13v2.784h2.463v7.13h2.952z"/></symbol>
<symbol id="icon-fb2" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M30.142 38.625V29.22h3.24l.483-3.671H30.14v-2.343c0-1.056.305-1.782 1.862-1.782H34V18.14a28.937 28.937 0 00-2.902-.14c-2.877 0-4.849 1.708-4.849 4.843v2.706H23v3.671h3.25v9.405h3.892z"/></symbol>
<symbol id="icon-file" viewBox="0 0 24 20"><use xlink:href="#def-file-a" transform="translate(-491 -9437)"/></symbol>
<symbol id="icon-github-mob" viewBox="0 0 34 34"><path d="M17.2 10c-3.978 0-7.2 3.307-7.2 7.386 0 3.263 2.063 6.031 4.923 7.007.36.07.492-.16.492-.355 0-.175-.006-.64-.009-1.256-2.003.445-2.425-.99-2.425-.99-.328-.853-.801-1.081-.801-1.081-.652-.458.05-.449.05-.449.723.052 1.103.761 1.103.761.642 1.13 1.685.803 2.097.615.065-.478.25-.803.456-.988-1.599-.185-3.28-.82-3.28-3.65 0-.806.28-1.464.741-1.981-.08-.187-.324-.938.063-1.955 0 0 .603-.198 1.98.757a6.754 6.754 0 011.8-.25 6.754 6.754 0 011.8.25c1.368-.955 1.971-.757 1.971-.757.387 1.017.144 1.768.072 1.955.46.517.738 1.175.738 1.981 0 2.838-1.683 3.462-3.285 3.644.252.222.486.674.486 1.366 0 .989-.009 1.783-.009 2.023 0 .193.126.424.495.35 2.881-.969 4.942-3.739 4.942-6.997 0-4.079-3.224-7.386-7.2-7.386z"/></symbol>
<symbol id="icon-github" viewBox="0 0 56 56"><path d="M27.913 19C22.436 19 18 23.362 18 28.741c0 4.305 2.84 7.955 6.778 9.242.496.092.677-.21.677-.468 0-.232-.008-.844-.012-1.657-2.758.588-3.34-1.306-3.34-1.306-.45-1.125-1.102-1.425-1.102-1.425-.898-.604.07-.592.07-.592.995.068 1.518 1.004 1.518 1.004.884 1.49 2.32 1.059 2.887.81.09-.63.344-1.059.628-1.302-2.202-.244-4.515-1.082-4.515-4.814 0-1.063.384-1.932 1.02-2.614-.112-.246-.446-1.236.086-2.578 0 0 .83-.26 2.727.999a9.676 9.676 0 012.478-.329 9.676 9.676 0 012.478.329c1.883-1.26 2.714-.999 2.714-.999.532 1.342.198 2.332.099 2.578a3.737 3.737 0 011.016 2.614c0 3.742-2.317 4.566-4.523 4.805.347.293.67.89.67 1.803 0 1.303-.013 2.35-.013 2.667 0 .255.173.56.681.463 3.966-1.279 6.804-4.932 6.804-9.23 0-5.38-4.439-9.741-9.913-9.741z"/></symbol>
<symbol id="icon-gplus" viewBox="0 0 13 8"><use xlink:href="#def-gplus-a" transform="translate(-466 -10165)"/><use xlink:href="#def-gplus-b" transform="translate(-466 -10165)"/></symbol>
<symbol id="icon-head" viewBox="0 0 54 45"><g transform="translate(2 2)" fill-rule="evenodd"><path d="M9.23 19.458v17.61s14.232 8.328 28.462 0V19.231" fill-rule="nonzero"/><path stroke-width="3" fill-rule="nonzero" stroke-linecap="round" stroke-linejoin="round" d="M46.923 13.25L22.99 0 0 14.007l23.179 13.44L46.923 13.25V30"/><path d="M9.23 19.458v17.61s14.232 8.328 28.462 0V19.231" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><circle stroke-width="3" fill-rule="nonzero" stroke-linecap="round" stroke-linejoin="round" cx="47.308" cy="32.692" r="2.692"/><path d="M32.733 18.745c.53.295 1.074.575 1.604.87 1.302.7 2.468-1.164 1.181-1.865-3.694-1.99-7.403-3.98-11.097-5.957-.53-.294-1.075-.575-1.604-.869-1.302-.7-2.468 1.163-1.181 1.864 3.694 1.99 7.403 3.981 11.097 5.957zM36.733 15.745c.53.295 1.074.575 1.604.87 1.302.7 2.468-1.164 1.181-1.865a4281.61 4281.61 0 00-11.097-5.957c-.53-.294-1.075-.575-1.604-.869-1.302-.7-2.468 1.163-1.181 1.864 3.694 1.99 7.403 3.981 11.097 5.957z" fill-rule="nonzero"/></g></symbol>
<symbol id="icon-inst" viewBox="0 0 26 26"><use xlink:href="#def-inst-a" transform="translate(-1468 -332)"/><use xlink:href="#def-inst-b" transform="translate(-1468 -332)"/><use xlink:href="#def-inst-c" transform="translate(-1468 -332)"/></symbol>
<symbol id="icon-instagram-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M24.027 20.23a3.801 3.801 0 01-3.797 3.797h-6.433A3.801 3.801 0 0110 20.23v-6.433A3.801 3.801 0 0113.797 10h6.433a3.801 3.801 0 013.797 3.797v6.433zm-7.014-7.052a3.84 3.84 0 00-3.835 3.835 3.84 3.84 0 003.835 3.836 3.84 3.84 0 003.836-3.836 3.84 3.84 0 00-3.836-3.835zm0 6.848A3.016 3.016 0 0114 17.013 3.016 3.016 0 0117.013 14a3.016 3.016 0 013.013 3.013 3.016 3.016 0 01-3.013 3.013zm2.794-7.077c0-.625.509-1.133 1.133-1.133.625 0 1.134.508 1.134 1.133s-.509 1.134-1.134 1.134a1.135 1.135 0 01-1.133-1.134z"/></symbol>
<symbol id="icon-instagram" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M37.5 32.492a5.014 5.014 0 01-5.008 5.008h-8.484A5.014 5.014 0 0119 32.492v-8.484A5.014 5.014 0 0124.008 19h8.484a5.014 5.014 0 015.008 5.008v8.484zm-9.25-9.3a5.064 5.064 0 00-5.058 5.058c0 2.79 2.269 5.059 5.058 5.059 2.79 0 5.059-2.27 5.059-5.059 0-2.79-2.27-5.058-5.059-5.058zm0 9.032a3.978 3.978 0 01-3.974-3.974 3.978 3.978 0 013.974-3.974 3.978 3.978 0 013.974 3.974 3.978 3.978 0 01-3.974 3.974zm3.685-9.334c0-.825.67-1.495 1.494-1.495.825 0 1.495.67 1.495 1.495 0 .824-.67 1.495-1.495 1.495-.824 0-1.494-.67-1.494-1.495z"/></symbol>
<symbol id="icon-like-down" viewBox="0 0 20 22"><use xlink:href="#def-like-down-a" transform="translate(-995 -522)"/></symbol>
<symbol id="icon-like-up" viewBox="0 0 20 22"><use xlink:href="#def-like-up-a" transform="translate(-934 -520)"/></symbol>
<symbol id="icon-like" viewBox="0 0 16 16"><use xlink:href="#def-like-a" transform="translate(-687 -8946)"/></symbol>
<symbol id="icon-link" viewBox="0 0 19 21"><use xlink:href="#def-link-a" transform="translate(-624 -1161)"/><use xlink:href="#def-link-b" transform="translate(-624 -1161)"/></symbol>
<symbol id="icon-mail" viewBox="0 0 16 12"><use xlink:href="#def-mail-a" transform="translate(-1042 -260)"/><use xlink:href="#def-mail-b" transform="translate(-1042 -260)"/></symbol>
<symbol id="icon-minus-zoom" viewBox="0 0 26 2"><path stroke-linecap="square" stroke-miterlimit="50" stroke-width="2" d="M1.5 1h23.19"/></symbol>
<symbol id="icon-outside" viewBox="0 0 21 21"><use xlink:href="#def-outside-a" transform="translate(-1185 -9211)"/></symbol>
<symbol id="icon-pencil" viewBox="0 0 20 21"><use xlink:href="#def-pencil-a" transform="translate(-1185 -9800)"/></symbol>
<symbol id="icon-phone" viewBox="0 0 21 22"><use xlink:href="#def-phone-a" transform="translate(-716 -19)"/></symbol>
<symbol id="icon-play-circle" viewBox="0 0 24 24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zM2 12a10 10 0 1020 0 10 10 0 00-20 0z"/><path d="M11.01 14.52c-.05.28.1.55.35.67.25.13.55.07.74-.14l2.85-2.94c.26-.27.27-.7.02-.98l-2.83-2.94a.69.69 0 00-.75-.13.67.67 0 00-.38.65z"/></symbol>
<symbol id="icon-play-reviews" viewBox="0 0 9 9"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.074 4.507c0 .41-.745.741-.745.741l-5.854 2.91a.619.619 0 01-.563-.054.649.649 0 01-.294-.494V1.392A.586.586 0 01.895.853a.557.557 0 01.595.01l5.839 2.903s.745.331.745.741z"/></symbol>
<symbol id="icon-play" viewBox="0 0 17 17"><path d="M17 9.02c0 .88-1.6 1.59-1.6 1.59L2.84 16.86c-.4.16-.84.12-1.21-.12A1.4 1.4 0 011 15.68V2.33c-.03-.47.2-.92.6-1.16.39-.24.89-.23 1.27.02L15.4 7.43s1.6.71 1.6 1.59z"/></symbol>
<symbol id="icon-plus-zoom" viewBox="0 0 24 24"><path d="M23 13H13v10a1 1 0 01-1 1 1 1 0 01-1-1V13H1a1 1 0 01-1-1 1 1 0 011-1h10V1a1 1 0 011-1 1 1 0 011 1v10h10a1 1 0 011 1 1 1 0 01-1 1z"/></symbol>
<symbol id="icon-plus" viewBox="0 0 16 16"><use xlink:href="#def-plus-a" transform="translate(-1208 -4164)"/></symbol>
<symbol id="icon-search" viewBox="0 0 22 22"><use xlink:href="#def-search-a" transform="translate(-1083 -22)"/></symbol>
<symbol id="icon-shape" viewBox="0 0 48 38"><use xlink:href="#def-shape-a" transform="translate(-832 -13296)"/></symbol>
<symbol id="icon-share" viewBox="0 0 26 24"><path d="M21.03 8a3.95 3.95 0 01-3.02-1.41l-9.08 4.54c.12.55.13 1.11.02 1.66l9.06 4.61a3.98 3.98 0 11-.9 1.79l-9.05-4.61a4 4 0 11-.05-5.22l9.1-4.55A4 4 0 1121.03 8zm0 14a2 2 0 002-2 2 2 0 10-2 2zm-18-10a2 2 0 104 0 2 2 0 00-4 0zm16-8a2 2 0 104 0 2 2 0 00-4 0z"/></symbol>
<symbol id="icon-smile" viewBox="0 0 23 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 23.278c-6.351 0-11.5-5.148-11.5-11.5C0 5.427 5.149.278 11.5.278S23 5.427 23 11.778c-.005 6.35-5.15 11.495-11.5 11.5zm0-21.083a9.583 9.583 0 00-9.583 9.583 9.584 9.584 0 1019.167 0A9.599 9.599 0 0011.5 2.195zm-6.613 12.87a7.38 7.38 0 006.613 4.38 7.333 7.333 0 006.613-4.38.957.957 0 00-.93-1.427.96.96 0 00-.796.603 5.277 5.277 0 01-9.774 0 .959.959 0 00-1.726.824zm10.447-3.287a1.917 1.917 0 110-3.833 1.917 1.917 0 010 3.833zM5.75 9.862a1.917 1.917 0 103.833 0 1.917 1.917 0 00-3.833 0z"/></symbol>
<symbol id="icon-socials" viewBox="0 0 40 40"><g fill-rule="evenodd"><circle cx="20" cy="20" r="20"/><path d="M20.021 31h-.485C13.717 31 9 26.08 9 20.009c0-6.07 4.717-10.991 10.536-10.991.309-.024.619-.024.928 0 5.819 0 10.536 4.92 10.536 10.99C31 26.08 26.283 31 20.464 31h-.443zm0-2.198h.316c4.655 0 8.43-3.937 8.43-8.793s-3.775-8.793-8.43-8.793h-.632c-4.655 0-8.43 3.937-8.43 8.793s3.775 8.793 8.43 8.793h.316z"/><path d="M19.382 31C13.648 31 9 26.08 9 20.009c0-6.07 4.648-10.991 10.382-10.991.305-.024.61-.024.914 0 .252.02.488.138.665.33 5.385 5.95 5.385 15.338 0 21.29a.998.998 0 01-1.142.252.992.992 0 01-.437.11zm.322-19.784h-.238c-4.588 0-8.306 3.937-8.306 8.793s3.718 8.793 8.306 8.793a.981.981 0 01.26 0c4.23-5.007 4.23-12.58 0-17.586h-.022z" clip-rule="evenodd"/><path d="M19.91 30.967a1.101 1.101 0 01-.419-.077 1.101 1.101 0 01-1.21-.253c-5.708-5.95-5.708-15.337 0-21.288a1.1 1.1 0 01.704-.33 6.664 6.664 0 011.012 0C26.074 9.02 31 13.94 31 20.01S26.074 31 19.997 31l-.088-.033zm-.353-19.783a13.177 13.177 0 000 17.585c.091-.012.184-.012.275 0 4.861 0 8.802-3.936 8.802-8.792s-3.94-8.793-8.802-8.793h-.275z" clip-rule="evenodd"/><path d="M27.944 17H11.056C10.473 17 10 16.552 10 16s.473-1 1.056-1h16.888c.583 0 1.056.448 1.056 1s-.473 1-1.056 1zM27.944 25H11.056C10.473 25 10 24.552 10 24s.473-1 1.056-1h16.888c.583 0 1.056.448 1.056 1s-.473 1-1.056 1z"/></g></symbol>
<symbol id="icon-strawberry" viewBox="0 0 49 48"><use xlink:href="#def-strawberry-a" transform="translate(-832 -13406)"/></symbol>
<symbol id="icon-telegram" viewBox="0 0 29 24"><use xlink:href="#def-telegram-a" transform="translate(-795 -271)"/></symbol>
<symbol id="icon-telegram2-mob" viewBox="0 0 34 34"><path d="M14.95 19.329l-.25 3.528c.358 0 .514-.154.7-.34l1.683-1.607 3.486 2.553c.64.356 1.09.168 1.263-.588L24.12 12.15c.204-.946-.341-1.316-.964-1.084l-13.452 5.15c-.918.357-.904.869-.156 1.1l3.44 1.07 7.988-4.998c.375-.25.717-.112.436.137L14.95 19.33z"/></symbol>
<symbol id="icon-telegram2" viewBox="0 0 56 56"><path d="M25.848 30.985l-.331 4.653c.473 0 .678-.203.924-.447l2.22-2.121 4.598 3.367c.843.47 1.437.223 1.665-.776l3.018-14.143.001-.001c.268-1.247-.45-1.734-1.272-1.428L18.929 26.88c-1.211.47-1.193 1.145-.206 1.451l4.536 1.411 10.536-6.593c.495-.328.946-.146.575.182l-8.522 7.653z"/></symbol>
<symbol id="icon-tm" viewBox="0 0 26 22"><use xlink:href="#def-tm-a" transform="translate(-1399 -334)"/></symbol>
<symbol id="icon-trash" viewBox="0 0 20 21"><use xlink:href="#def-trash-a" transform="translate(-1156 -9799)"/></symbol>
<symbol id="icon-triangle" viewBox="0 0 16 8"><use xlink:href="#def-triangle-a" transform="translate(-1237 -6883)"/></symbol>
<symbol id="icon-tw" viewBox="0 0 18 15"><path d="M18 1.75c-.66.3-1.37.5-2.12.59A3.7 3.7 0 0017.5.27c-.71.43-1.5.74-2.34.91a3.68 3.68 0 00-6.39 2.56c0 .3.03.58.09.85A10.45 10.45 0 011.25.69 3.75 3.75 0 002.4 5.68a3.67 3.67 0 01-1.68-.47v.05a3.75 3.75 0 002.97 3.67 3.51 3.51 0 01-1.67.06 3.7 3.7 0 003.45 2.6A7.33 7.33 0 010 13.14a10.37 10.37 0 005.66 1.68c6.79 0 10.51-5.7 10.51-10.64l-.01-.49A7.35 7.35 0 0018 1.76z"/></symbol>
<symbol id="icon-twitter-mob" viewBox="0 0 34 34"><path d="M24.406 12.386a6.16 6.16 0 01-1.702.466 2.937 2.937 0 001.3-1.632c-.572.34-1.202.58-1.873.715a2.952 2.952 0 00-5.109 2.02c0 .233.02.458.068.672a8.36 8.36 0 01-6.087-3.089 2.957 2.957 0 00.908 3.947 2.917 2.917 0 01-1.335-.363v.032a2.967 2.967 0 002.366 2.902c-.24.066-.502.097-.774.097-.189 0-.38-.01-.56-.05a2.981 2.981 0 002.76 2.057 5.934 5.934 0 01-3.661 1.26c-.242 0-.475-.011-.707-.04a8.314 8.314 0 004.53 1.325c5.435 0 8.406-4.502 8.406-8.404 0-.13-.004-.257-.01-.382a5.89 5.89 0 001.48-1.533z"/></symbol>
<symbol id="icon-twitter" viewBox="0 0 56 56"><path d="M38 21.828c-.707.31-1.46.515-2.244.615a3.874 3.874 0 001.713-2.153 7.783 7.783 0 01-2.47.943 3.894 3.894 0 00-6.738 2.664c0 .308.026.605.09.887a11.025 11.025 0 01-8.028-4.074 3.922 3.922 0 00-.533 1.969 3.9 3.9 0 001.73 3.237 3.847 3.847 0 01-1.76-.48v.043a3.913 3.913 0 003.12 3.827 3.887 3.887 0 01-1.02.129c-.25 0-.502-.015-.738-.067.505 1.543 1.937 2.677 3.64 2.714a7.827 7.827 0 01-4.83 1.66c-.32 0-.626-.013-.932-.052a10.966 10.966 0 005.976 1.748c7.167 0 11.086-5.938 11.086-11.085a9.95 9.95 0 00-.014-.503A7.77 7.77 0 0038 21.828z"/></symbol>
<symbol id="icon-user-circle" viewBox="0 0 24 24"><use xlink:href="#def-user-circle-a" transform="translate(-1244 -22)"/></symbol>
<symbol id="icon-vb" viewBox="0 0 25 27"><use xlink:href="#def-vb-a" transform="translate(-931 -270)"/></symbol>
<symbol id="icon-view-list" viewBox="0 0 15 15"><path d="M0 6V0h15v6zm0 9V9h15v6z"/></symbol>
<symbol id="icon-view-tile" viewBox="0 0 15 15"><path d="M0 6V0h6v6zm9 0V0h6v6zm0 9V9h6v6zm-9 0V9h6v6z"/></symbol>
<symbol id="icon-vk" viewBox="0 0 22 14"><path d="M10.61 13.8h1.3s.39-.04.59-.27c.19-.2.18-.59.18-.59s-.02-1.8.78-2.07c.8-.26 1.82 1.75 2.91 2.52.81.58 1.44.46 1.44.46l2.89-.05s1.52-.09.8-1.33c-.06-.1-.42-.92-2.15-2.59-1.82-1.75-1.58-1.47.61-4.5 1.33-1.84 1.87-2.97 1.7-3.45-.16-.46-1.14-.34-1.14-.34l-3.26.02s-.24-.03-.42.08-.29.36-.29.36-.52 1.43-1.2 2.64c-1.46 2.57-2.04 2.7-2.27 2.54-.56-.37-.42-1.49-.42-2.28 0-2.49.36-3.52-.71-3.79A5.26 5.26 0 0010.43 1c-1.16-.01-2.15.01-2.7.29-.38.19-.66.61-.49.63.22.03.71.14.97.51.33.47.32 1.53.32 1.53s.19 2.92-.45 3.29c-.44.25-1.04-.26-2.34-2.59-.66-1.19-1.16-2.5-1.16-2.5s-.1-.25-.27-.38c-.21-.16-.5-.21-.5-.21l-3.1.02s-.47.01-.64.22c-.15.19-.01.58-.01.58s2.43 5.89 5.17 8.87c2.52 2.72 5.38 2.54 5.38 2.54z"/></symbol>
<symbol id="icon-vk2-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.79 21.913h.947a.77.77 0 00.436-.201.795.795 0 00.13-.459s-.016-1.399.573-1.608c.588-.209 1.336 1.351 2.13 1.954.297.259.68.383 1.063.346l2.123-.032s1.116-.073.589-1.03a7.642 7.642 0 00-1.582-2.002c-1.337-1.35-1.153-1.134.451-3.473.978-1.424 1.367-2.3 1.245-2.67a.866.866 0 00-.832-.257l-2.4.016a.463.463 0 00-.305.056.702.702 0 00-.214.282 15.134 15.134 0 01-.886 2.042c-1.062 1.978-1.49 2.082-1.665 1.962-.405-.29-.306-1.15-.306-1.77 0-1.913.268-2.717-.511-2.926a4.053 4.053 0 00-1.123-.12 4.804 4.804 0 00-1.987.225c-.275.144-.48.466-.351.49.273.03.524.167.703.386.165.37.246.774.237 1.182 0 0 .145 2.26-.329 2.54-.32.194-.764-.2-1.719-1.993a17.581 17.581 0 01-.848-1.938.803.803 0 00-.198-.29.84.84 0 00-.367-.16l-2.276.016a.723.723 0 00-.466.169.581.581 0 00-.016.442s1.788 4.559 3.805 6.859c.99 1.217 2.427 1.931 3.95 1.962z"/></symbol>
<symbol id="icon-vk2" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M28.274 34.074h1.25c.213-.024.413-.117.574-.265.117-.177.177-.39.172-.605 0 0-.02-1.845.755-2.12.776-.276 1.763 1.78 2.811 2.576.391.342.895.506 1.4.456l2.802-.042s1.47-.096.775-1.358a10.079 10.079 0 00-2.085-2.64c-1.763-1.782-1.522-1.495.594-4.582 1.29-1.877 1.804-3.033 1.642-3.52a1.143 1.143 0 00-1.098-.34l-3.163.021a.61.61 0 00-.403.075.925.925 0 00-.282.37 19.972 19.972 0 01-1.17 2.694c-1.4 2.61-1.964 2.747-2.196 2.588-.534-.382-.403-1.516-.403-2.333 0-2.524.353-3.584-.675-3.86a5.345 5.345 0 00-1.48-.16 6.336 6.336 0 00-2.62.298c-.363.19-.635.615-.464.646.36.039.691.221.927.51.218.487.325 1.02.312 1.558 0 0 .192 2.98-.433 3.352-.423.254-1.007-.265-2.267-2.63a23.184 23.184 0 01-1.118-2.556 1.06 1.06 0 00-.262-.382 1.109 1.109 0 00-.484-.212l-3.002.021a.953.953 0 00-.615.223.767.767 0 00-.02.583s2.358 6.013 5.018 9.046c1.305 1.606 3.2 2.548 5.209 2.588z"/></symbol>
<symbol id="icon-yandex" viewBox="0 0 5 11"><path d="M4.847 0H3.259C1.7 0 .376 1.169.376 3.438c0 1.36.64 2.364 1.783 2.86L.028 10.092c-.07.123 0 .22.111.22h.99c.083 0 .139-.028.166-.097L3.231 6.49h.697v3.726c0 .041.041.097.097.097h.864c.083 0 .111-.042.111-.11V.138C5 .04 4.944 0 4.847 0zm-.92 5.61h-.584c-.92 0-1.81-.66-1.81-2.31 0-1.719.835-2.42 1.684-2.42h.71v4.73z" fill-rule="nonzero"/></symbol>
<symbol id="icon-ynadex" viewBox="0 0 5 10"><use xlink:href="#def-ynadex-a" transform="translate(-468 -10321)"/></symbol>
<symbol id="icon-ytube" viewBox="0 0 27 20"><use xlink:href="#def-ytube-a" transform="translate(-1332 -335)"/></symbol>
</svg>
<div class="header-banner topBanner" data-type="header" style="display: block; position: sticky; top: 0; z-index: 999;">
<a data-source="212098" data-banner="226288" class="universal-notice js-universal-notice-notice universal-notice--webp universal-notice--bitrix universal-notice--active" href="https://skillbox.ru/sale/main/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_banners_header_all_all_skillbox" target="_blank" style="--banner-bg: #5927E9;--banner-color: #fff;--button-font-color: #000000;--button-bg-color: #FFFFFF;--banner-img-left: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_left/602754/f9ac17dd-a1d4-46c6-aa14-4f7b949defd1.png);--banner-img-left-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_left/602754/f9ac17dd-a1d4-46c6-aa14-4f7b949defd1.webp);--banner-img-center: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.png);--banner-img-center-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.webp);--banner-img-center-mobile: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.png);--banner-img-center-mobile-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.webp);--banner-img-right: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_right/602755/ad7a7fe5-b8d3-47a3-885b-51a7971c12a9.png);--banner-img-right-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_right/602755/ad7a7fe5-b8d3-47a3-885b-51a7971c12a9.webp);">
<span class="universal-notice__wrapper">
<b class="universal-notice__title">
Скидка до 55% и 3 курса в подарок
</b>
<span class="universal-timer js-universal-notice-timer js-universal-notice-active">
<span class="universal-timer__days js-universal-notice-days">2 дня</span>
<span class="js-universal-notice-hours">13</span>
:<span class="js-universal-notice-minutes">30</span>
:<span class="js-universal-notice-seconds">09</span>
</span>
<span class="universal-notice__button">Выбрать курс</span>
</span>
</a><script>
document.addEventListener('DOMContentLoaded', () => {
// Установите конечную дату
const deadline = new Date();
deadline.setDate(5);
deadline.setHours(0, 0, 0);
// Найдите элементы DOM
var timer = document.querySelector('.universal-timer');
const elDays = timer.querySelector('.js-universal-notice-days');
const elHours = timer.querySelector('.js-universal-notice-hours');
const elMinutes = timer.querySelector('.js-universal-notice-minutes');
const elSeconds = timer.querySelector('.js-universal-notice-seconds');
// Функция обновления таймера
const updateTimer = () => {
const now = new Date();
let diff = Math.max(0, deadline - now);
if (diff === 0) {
let lastDayOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
let lastDay = lastDayOfMonth.getDate();
if (lastDay - now.getDate() < 4) {
deadline.setMonth(deadline.getMonth() + 1, 1);
} else {
deadline.setDate(deadline.getDate() + 4);
}
diff = Math.max(0, deadline - now);
}
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(diff / (1000 * 60 * 60 * 24));
var hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)).toString();
var minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)).toString();
var seconds = Math.floor((diff % (1000 * 60)) / 1000).toString();
if (timer) {
let dayTitles = ['день', 'дня', 'дней'];
let daySuffix = dayTitles[(days % 100 > 4 && days % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][days % 10 < 5 ? days % 10 : 5]]
elDays.innerHTML = days + ' ' + daySuffix;
elHours.innerHTML = hours.padStart(2, '0');
elMinutes.innerHTML = minutes.padStart(2, '0');
elSeconds.innerHTML = seconds.padStart(2, '0');
}
};
updateTimer();
const timerId = setInterval(updateTimer, 1000);
});
</script>
<style>@font-face{font-display:swap;font-family:Graphik;font-weight:500;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Medium.woff2) format("woff2")}@font-face{font-display:swap;font-family:Graphik;font-weight:700;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Bold.woff2) format("woff2")}.universal-notice{position:sticky;z-index:5;top:0;box-sizing:border-box;text-decoration:none;display:none;justify-content:space-between;overflow:hidden;color:var(--banner-color);background-color:var(--banner-bg);font-family:Graphik,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:opacity .25s ease-in-out}.universal-notice--active{display:flex}.universal-notice--bitrix{z-index:1000}.universal-notice *,.universal-notice ::after,.universal-notice ::before{box-sizing:inherit}.universal-notice::after,.universal-notice::before{display:none;width:194px;height:56px;content:"";background-size:194px 56px;background-repeat:no-repeat}.universal-notice--no-webp::before{background-image:var(--banner-img-left)}.universal-notice--no-webp::after{background-image:var(--banner-img-right)}.universal-notice--webp::before{background-image:var(--banner-img-left-webp)}.universal-notice--webp::after{background-image:var(--banner-img-right-webp)}.universal-notice--new-design{position:static;margin:4px;border-radius:16px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:166px;height:48px;background-size:166px 48px}.universal-notice__wrapper{display:grid;grid-template-columns:1fr auto;align-items:center;grid-gap:12px;padding:12px;width:100%}.universal-notice--new-design .universal-notice__wrapper::after{height:48px}.universal-notice__title{font-weight:500;font-size:15px;line-height:16px}.universal-notice--new-design .universal-notice__title{font-size:14px;line-height:15px}.universal-timer{display:none;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;font-weight:500;font-size:24px;line-height:26px}.universal-notice--new-design .universal-timer{font-size:22px;line-height:24px}.universal-timer__days{margin-right:8px}.universal-notice__button{grid-column:2/3;padding:6px 16px;border-radius:6px;color:var(--button-font-color);background-color:var(--button-bg-color);font-weight:500;font-size:14px;line-height:20px}.universal-notice-sticky{position:fixed;z-index:5;top:0;left:0;width:100%;padding:11px 8px;color:var(--banner-color);background-color:var(--banner-bg);text-align:center;transition:transform .3s ease-in-out;will-change:transform;transform:translateY(-200%)}.universal-notice-sticky--show{transform:translateY(0)}@media (min-width:360px) and (max-width:0px){.universal-notice__wrapper{padding:0 12px;grid-template-columns:1fr 56px auto}.universal-notice__wrapper::after{grid-column:2/3;grid-row:1/2;width:100%;height:56px;background-size:cover;background-repeat:no-repeat;content:""}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 48px auto}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile-webp)}.universal-notice__button{grid-column:3/4}}@media (min-width:360px){.universal-notice__wrapper{padding:0 12px;grid-template-columns:1fr 56px auto}.universal-notice__wrapper::after{grid-column:2/3;grid-row:1/2;width:100%;height:56px;background-size:cover;background-repeat:no-repeat;content:""}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 48px auto}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile-webp)}.universal-notice__button{grid-column:3/4}}@media (min-width:768px){.universal-notice::before{background-position:right center;flex-shrink:0;display:block}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-webp)}}@media (min-width:768px) and (max-width:0px){.universal-notice::before{background-position:right center;flex-shrink:0;display:block}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-webp)}}@media (min-width:1024px){.universal-notice::after,.universal-notice::before{width:250px;height:72px;background-size:250px 72px}.universal-notice--new-design{height:64px;border-radius:32px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:226px;height:64px;background-size:226px 64px}.universal-notice__wrapper{grid-template-columns:1fr 72px auto;grid-gap:24px;padding-right:16px;padding-left:24px}.universal-notice__wrapper::after{height:72px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px auto}.universal-notice--new-design .universal-notice__wrapper::after{height:64px}.universal-notice__title{font-size:24px;line-height:26px}.universal-notice--new-design .universal-notice__title{font-size:22px;line-height:24px}.universal-notice__button{padding:10px 24px;border-radius:8px}.universal-notice-sticky{padding:14px 24px}}@media (min-width:1024px) and (max-width:0px){.universal-notice::after,.universal-notice::before{width:250px;height:72px;background-size:250px 72px}.universal-notice--new-design{height:64px;border-radius:32px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:226px;height:64px;background-size:226px 64px}.universal-notice__wrapper{grid-template-columns:1fr 72px auto;grid-gap:24px;padding-right:16px;padding-left:24px}.universal-notice__wrapper::after{height:72px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px auto}.universal-notice--new-design .universal-notice__wrapper::after{height:64px}.universal-notice__title{font-size:24px;line-height:26px}.universal-notice--new-design .universal-notice__title{font-size:22px;line-height:24px}.universal-notice__button{padding:10px 24px;border-radius:8px}.universal-notice-sticky{padding:14px 24px}}@media (min-width:1280px){.universal-notice::before{flex-shrink:1}.universal-notice::after{background-position:left center;display:block}.universal-notice__wrapper{grid-template-columns:1fr 72px minmax(202px,auto) auto;min-width:940px;max-width:1020px;padding-right:24px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px minmax(202px,auto) auto}.universal-timer.js-universal-notice-active{display:flex}.universal-notice__timer-nuxt{display:flex}.universal-notice__button{grid-column:4/5}}@media (min-width:1280px) and (max-width:0px){.universal-notice::before{flex-shrink:1}.universal-notice::after{background-position:left center;display:block}.universal-notice__wrapper{grid-template-columns:1fr 72px minmax(202px,auto) auto;min-width:940px;max-width:1020px;padding-right:24px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px minmax(202px,auto) auto}.universal-timer.js-universal-notice-active{display:flex}.universal-notice__timer-nuxt{display:flex}.universal-notice__button{grid-column:4/5}}@media (min-width:1400px) and (max-width:0px){.universal-notice::before{flex-shrink:0}.universal-notice::after{flex-shrink:0}}@media (min-width:1400px){.universal-notice::before{flex-shrink:0}.universal-notice::after{flex-shrink:0}}</style> </div>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
window.TopBanner = true;
});
$(document).ready(function () {
$.ajax({
url: '/local/ajax/advert.php',
type: 'POST',
data: {
'type': 'top-banner-show',
'id': 226288,
'section_id': 0,
},
success: function (result) {
}
});
});
$(document).on('click', '.header-banner', function () {
$.ajax({
url: '/local/ajax/advert.php',
type: 'POST',
data: {
'type': 'top-banner-click',
'id': 226288,
'section_id': 0,
},
success: function (result) {
}
});
var page = window.location;
var $article = $('section[data-article-text]');
var pageId = $article.data('articleid');
if(pageId === undefined)
{
pageId = 0;
}
window.dataLayer.push({
'event': 'go_to_course',
'courseID': 226288,
'page': page,
'pageID': pageId
});
});
</script>
<header class="header">
<div id="menu" class="header__wrapper container">
<div class="header__logo link-active">
<a href="/media/" class="header__media-main-link">
<img src="/local/templates/media/images/logo/skillbox-media.svg" alt="Skillbox"/>
</a>
<a href="/media/code/" class="header__media-category-link">
<span class="header__media-category js-category ">Код</span>
</a>
</div>
<a href="/media/about-media/" v-if="!isMobile" rel="nofollow" class="menu-nav__link menu-nav__link--about" target="_blank" style="display: none">
Про медиа
</a>
<button v-if="!isMobile" v-show="!isMobile" rel="nofollow" class="toggle-menu header__toggle toggle-menu--course"
@click="openCourseMenu()"
:class="{ 'toggle-menu--active': isOpenCourseMenu }"
style="display: none">
Онлайн-курсы
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg"
:class="{
'animated-chevron--default': isOpenCourseMenu,
'animated-chevron--active animated-chevron--default': ! isOpenCourseMenu
}"
class="animated-chevron toggle-menu__arrow select-arrow select-arrow--small">
<line x1="6.48415" y1="5.92242" x2="11.4909" y2="10.9291" stroke="currentColor" stroke-width="1.78"
class=" animated-chevron__line animated-chevron__line1 animated-chevron__line1--default"></line>
<line x1="6.3701" y1="5.9224" x2="11.3768" y2="0.915678" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line"></line>
<line x1="1.36337" y1="10.9291" x2="6.3701" y2="5.9224" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line animated-chevron__line2 animated-chevron__line2--default"></line>
<line x1="1.47743" y1="0.915681" x2="6.48415" y2="5.9224" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line"></line>
</svg>
</button>
<a href="https://skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=button_main_skillbox&utm_term=mainskillbox" v-if="!isMobile" v-show="!isMobile" rel="nofollow" class="menu-nav__link menu-nav__link-ml0 menu-nav__link--main" target="_blank" style="display: none">
Главная Skillbox
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.9375 10.0618L9.9161 4.08203" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.93811 3.93665H10.0631V10.0616" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<div v-if="isOpenCourseMenu && !isMobile" class="menu-block menu-block--desktop" @click="closeCourseMenu($event)" style="display: none">
<div class="menu-block__wrapper menu-block__wrapper--desktop">
<div class="menu-block__content vue-container">
<span class="menu-block__title">
Направления обучения
</span>
<ul class="menu-directions menu-block__direction">
<li class="menu-directions__item">
<a href="https://skillbox.ru/courses/?utm_source=media&utm_medium=button&utm_campaign=button_courses_all&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="All directions">
Все направления
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/code/?utm_source=media&utm_medium=button&utm_campaign=button_courses_code&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Code">
Программирование
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/design/?utm_source=media&utm_medium=button&utm_campaign=button_courses_design&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Design">
Дизайн
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/management?utm_source=media&utm_medium=button&utm_campaign=button_courses_management&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Management">
Управление
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/marketing?utm_source=media&utm_medium=button&utm_campaign=button_courses_marketing&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Marketing">
Маркетинг
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/games?utm_source=media&utm_medium=button&utm_campaign=button_courses_games&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="GameDev">
Игры
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/multimedia?utm_source=media&utm_medium=button&utm_campaign=button_courses_multimedia&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="">
Кино и Музыка
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/psychology?utm_source=media&utm_medium=button&utm_campaign=button_courses_psychology&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Психология
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/health?utm_source=media&utm_medium=button&utm_campaign=button_courses_health&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Здоровье
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/spo/?utm_source=media&utm_medium=button&utm_campaign=button_courses_spo&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Цифровой колледж
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/general-development/?utm_source=media&utm_medium=button&utm_campaign=button_courses_general-development&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Education">
Общее развитие
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/engineering/?utm_source=media&utm_medium=button&utm_campaign=button_courses_engineering&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="engineering">
Инженерия
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/english/?utm_source=media&utm_medium=button&utm_campaign=button_courses_english&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="english">
Английский язык
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/other/?utm_source=media&utm_medium=button&utm_campaign=button_courses_other&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Other">
Другое
</a>
</li>
</ul>
</div>
</div>
</div>
<div v-show="isOpenMenu" class="menu-block" @click="closeMenu($event)" style="display: none">
<div class="menu-block__wrapper">
<div class="menu-block__content vue-container">
<h2 class="menu-block__header">Редакции</h2>
<div class="tab-nav" data-tab-parent="" data-action="index">
<div class="tab-nav__item">
<a class="" data-tab-name="media_nav" data-section-id="0" data-code="All directions" href="/media/">
<img src="/local/templates/media/images/common/menu-icon-mobile-1.png" alt=""/>
Все
</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="/media/topic/history/">
<img src="/local/templates/media/images/common/menu-icon-mobile-19.png"
alt=""/>
Истории</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="8"
data-code="Design"
href="/media/design/">
<img src="/local/templates/media/images/common/menu-icon-mobile-2.png" alt=""/>
Дизайн</a>
</div>
<div class="tab-nav__item">
<a class="tab-active"
data-tab-name="media_nav"
data-section-id="10"
data-code="Code"
href="/media/code/">
<img src="/local/templates/media/images/common/menu-icon-mobile-3.png" alt=""/>
Код</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="18"
data-code="GameDev"
href="/media/gamedev/">
<img src="/local/templates/media/images/common/menu-icon-mobile-4.png" alt=""/>
Геймдев</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="21"
data-code="Business"
href="/media/business/">
<img src="/local/templates/media/images/common/menu-icon-mobile-9.png" alt=""/>
Бизнес</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="9"
data-code="Marketing"
href="/media/marketing/">
<img src="/local/templates/media/images/common/menu-icon-mobile-5.png" alt=""/>
Маркетинг</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="11"
data-code=""
href="/media/management/">
<img src="/local/templates/media/images/common/menu-icon-mobile-6.png" alt=""/>
Управление</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="29"
data-code=""
href="/media/cinemusic/">
<img src="/local/templates/media/images/common/menu-icon-mobile-22.png" alt=""/>
Кино</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="36"
data-code=""
href="/media/music/">
<img src="/local/templates/media/images/common/menu-icon-mobile-23.png" alt=""/>
Музыка</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="34"
data-code=""
href="/media/photo/">
<img src="/local/templates/media/images/common/menu-icon-mobile-20.png" alt=""/>
Проектная фотография</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="17"
data-code="Development"
href="/media/growth/">
<img src="/local/templates/media/images/common/menu-icon-mobile-7.png" alt=""/>
Развитие</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="33"
data-code=""
href="/media/health/">
<img src="/local/templates/media/images/common/menu-icon-mobile-16.png" alt=""/>
Здоровье</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="32"
data-code=""
href="/media/money/">
<img src="/local/templates/media/images/common/menu-icon-mobile-17.png" alt=""/>
Деньги</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="22"
data-code="Education"
href="/media/education/">
<img src="/local/templates/media/images/common/menu-icon-mobile-8.png" alt=""/>
Образование</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="31"
data-code=""
href="/media/edtech/">
<img src="/local/templates/media/images/common/menu-icon-mobile-11.png" alt=""/>
EdTech</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="30"
data-code=""
href="/media/corptrain/">
<img src="/local/templates/media/images/common/menu-icon-mobile-10.png" alt=""/>
Корп. обучение</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="35"
data-code=""
href="/media/skillbox-blog/">
<img src="/local/templates/media/images/common/menu-icon-mobile-21.png" alt=""/>
Блог Skillbox</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="https://skillbox.ru/media/glossary/">
<img src="/local/templates/media/images/common/menu-icon-mobile-18.png"
alt=""/>
Глоссарий</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="/media/topic/specials/">
<img src="/local/templates/media/images/common/menu-icon-mobile-13.png"
alt=""/>
Спецпроекты</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="https://skillbox.ru/course/career-guide-free/">
<img src="/local/templates/media/images/common/menu-icon-mobile-15.png"
alt=""/>
Профориентация</a>
</div>
</div>
<h2 class="menu-block__header">Онлайн-курсы</h2>
<ul class="menu-directions menu-block__direction">
<li class="menu-directions__item">
<a href="https://skillbox.ru/courses/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="All directions">
Все направления
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/code/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Code">
Программирование
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/design/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Design">
Дизайн
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/marketing/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Marketing">
Маркетинг
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/management/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Management">
Управление
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/games/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="GameDev">
Игры
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/multimedia/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="">
Мультимедиа
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/psychology/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Психология
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/general-development/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Education">
Общее развитие
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/engineering/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="engineering">
Инженерия
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/english/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="english">
Английский язык
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/other/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Other">
Другое
</a>
</li>
</ul>
<a href="/media/about-media/" rel="nofollow" class="menu-nav__link">
Про медиа
</a>
<a href="https://skillbox.ru/" rel="nofollow" class="menu-nav__link">
Главная Skillbox
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.9375 10.0618L9.9161 4.08203" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.93811 3.93665H10.0631V10.0616" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</div>
</div>
</div>
<button v-if="isMobile" class="menu-toggle"
@click="openMenu()"
:class="{ 'menu-toggle--opened': isOpenMenu }" style="opacity: 0">
<span v-if="isOpenMenu" class="menu-toggle__line"></span>
<svg v-if="!isOpenMenu" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 5.5H0V4H24V5.5ZM24 11.5H0V13H24V11.5ZM24 19H0V20.5H24V19Z" fill="black"/>
</svg>
</button>
</div>
<script>
BX.Vue.create({
el: '#menu',
data: {
isOpenMenu: false,
isOpenCourseMenu: false,
isMobile: false,
isSubOpen: false,
display: 'none'
},
computed: {
isMobile() {
const w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
return w < 1024;
}
},
methods: {
openMenu() {
this.isOpenMenu = !this.isOpenMenu;
document.getElementsByTagName('body')[0].classList.toggle('scroll-locked');
window.addEventListener('keyup', this.closeMenu);
},
closeMenu(event) {
if (event.target.classList.contains('menu-block') || event.keyCode === 27) {
this.isOpenMenu = false;
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeMenu);
}
},
openCourseMenu() {
this.isOpenCourseMenu = !this.isOpenCourseMenu;
if (this.isOpenCourseMenu) {
document.getElementsByTagName('body')[0].classList.add('scroll-locked');
window.addEventListener('keyup', this.closeCourseMenu);
} else {
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeCourseMenu);
}
},
closeCourseMenu(event) {
if (event.target.classList.contains('menu-block') || event.keyCode === 27) {
this.isOpenCourseMenu = false;
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeCourseMenu);
}
},
openSub() {
this.isSubOpen = !this.isSubOpen;
},
isMobileFn() {
const w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
this.isMobile = (w < 1024);
}
},
created() {
window.addEventListener("resize", this.isMobileFn);
document.querySelector('.menu-block').style.display = '';
document.querySelector('.menu-toggle').style.opacity = '1';
document.querySelector('.menu-nav__link').style.display = '';
this.display = 'block';
this.isMobileFn();
},
destroyed() {
window.removeEventListener("resize", this.isMobileFn);
}
});
</script>
</header>
<main class="content">
<div class="page style-update">
<div class="page-wrap">
<style>
.article-inner .rr-widget__title {
padding-top: 0 !important;
}
.article-inner div[data-retailrocket-markup-block] {
margin-top: -32px;
display: none;
}
.article-inner {
font-family: 'Graphik';
}
</style>
<div class="under_header_banner" data-type="under_header"><!-- Yandex.RTB R-A-13443663-10 -->
<div id="yandex_rtb_R-A-13443663-10"></div>
<script>
window.yaContextCb.push(() => {
Ya.Context.AdvManager.render({
"blockId": "R-A-13443663-10",
"renderTo": "yandex_rtb_R-A-13443663-10"
})
})
</script>
</div> <div data-area="article" data-title="IT-термины, которые используют в сообществе программистов / Skillbox Media" class=" noFullClass">
<div class="article-inner">
<section class="top-section-detail-page ">
<div class="container">
<div class="article-preview-info">
<div class="article-preview-info__tags ">
<div class="tag article-preview-info__tag">
<a href="/media/code/"
class="tag-item programming">
Код </a>
</div>
</div>
<a class="info-hashtag article-preview-info__hashtag" href="/media/topic/articles/">
#статьи </a>
<ul class="info article-preview__info-box">
<li class="info-item"> <time class="info-text" datatime="#">6 июн 2022</time></li>
<li class="info-item hidden">
<span class="info-icon"><img src="/local/templates/media/images/icons/like.svg" alt=""></span>
<span class="info__text js-article-like-value">0</span>
</li>
</ul>
</div>
<div class="row">
<div class="top-section-detail-page__title-block col-xl-9 col-lg-10">
<div class="article-preview">
<h1 class="article-preview__title">Это классика, это знать надо: DRY, KISS, SOLID, YAGNI и другие полезные сокращения</h1>
<p class="article-preview__description">Эти сокращения каждый программист должен знать так же хорошо, как количество и имена истребителей адмирала Ямамото.</p>
</div>
</div>
</div>
</div>
</section>
<section data-article-text
data-articleId="212098"
data-courseId="3869"
>
<div class="container">
<noindex>
<div class="share" data-nosnippet>
<button class="share__handler-btn ">
<span class="share__handler-icon">
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 4.99902L6 0V2.99805C2.688 2.99805 0 5.68505 0 8.99805V11.498H0.0980225C0.765022 8.91205 3.107 6.99805 5.901 6.99805H6.00098V9.99805L11 4.99902Z" fill="currentColor"/>
</svg>
</span>
<span class="share__handler-text">Поделиться</span>
</button>
<div class="share__list">
<a href="#" class="share__item" data-code="vk">
<span class="share__item-icon share__item-icon--vk">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.04776 4.98054H4.53996C4.62377 4.97136 4.70279 4.9361 4.76621 4.87951C4.81226 4.81209 4.83594 4.73139 4.83369 4.64925C4.83369 4.64925 4.82574 3.94629 5.1314 3.84125C5.43701 3.73621 5.826 4.51998 6.23879 4.82297C6.39281 4.95308 6.59128 5.01558 6.79053 4.99669L7.89399 4.98054C7.89399 4.98054 8.47355 4.94415 8.19965 4.46339C7.98372 4.08315 7.70589 3.743 7.37799 3.45744C6.68338 2.77872 6.77865 2.8878 7.61219 1.71216C8.12024 0.997077 8.32269 0.556717 8.25918 0.370875C8.14651 0.254767 7.98299 0.205914 7.82655 0.241594L6.58018 0.249674C6.52565 0.241067 6.46984 0.251007 6.42141 0.277954C6.37298 0.314507 6.33466 0.363228 6.31025 0.419356C6.18259 0.772814 6.0287 1.11586 5.8498 1.44552C5.29807 2.43936 5.07579 2.49188 4.98451 2.43128C4.77416 2.28584 4.82574 1.85356 4.82574 1.54248C4.82574 0.580957 4.96468 0.176954 4.55979 0.0719133C4.36879 0.0254376 4.17259 0.00505841 3.97631 0.0113129C3.62834 -0.0214164 3.27745 0.017045 2.94429 0.124433C2.8014 0.197154 2.69423 0.358753 2.76171 0.370875C2.90334 0.385518 3.03406 0.454932 3.12688 0.564795C3.21268 0.750336 3.25481 0.953675 3.24993 1.15868C3.24993 1.15868 3.32535 2.29392 3.07925 2.43532C2.91254 2.53228 2.68232 2.33432 2.18616 1.4334C2.01958 1.11848 1.87243 0.793298 1.74557 0.459754C1.72231 0.404013 1.68704 0.354309 1.64236 0.314316C1.58589 0.272672 1.52066 0.245006 1.45184 0.233514L0.268986 0.241594C0.181167 0.241154 0.0958013 0.271066 0.0268587 0.326434C-0.00595087 0.396174 -0.00882613 0.476652 0.0189202 0.548633C0.0189202 0.548633 0.947737 2.83932 1.99563 3.99477C2.51 4.60651 3.2568 4.96526 4.04776 4.98054Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Vkontakte</span>
</a>
<a href="#" class="share__item" data-code="tw">
<span class="share__item-icon share__item-icon--tw">
<svg width="9" height="7" viewBox="0 0 9 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.52788 0.00144284V0H5.9158L6.05754 0.027414C6.15204 0.0452114 6.23783 0.068535 6.31491 0.0973918C6.39201 0.126249 6.46661 0.159917 6.53872 0.198391C6.61083 0.236864 6.67623 0.276066 6.73492 0.315982C6.79311 0.355422 6.84533 0.397265 6.89158 0.441509C6.93733 0.486237 7.0087 0.49778 7.10568 0.476138C7.20266 0.454495 7.3071 0.424433 7.419 0.38596C7.5309 0.347487 7.64156 0.304201 7.75097 0.256104C7.86039 0.208007 7.92703 0.177469 7.95091 0.164484C7.97428 0.151022 7.98671 0.143808 7.98821 0.142841L7.98969 0.140677L7.99715 0.13707L8.00461 0.133463L8.01207 0.129856L8.01953 0.126249L8.02102 0.124084L8.02326 0.122642L8.02551 0.121199L8.02699 0.119034L8.03445 0.11687L8.04191 0.115427L8.04043 0.126249L8.03818 0.13707L8.03445 0.147891L8.03072 0.158713L8.02699 0.165927L8.02326 0.173141L8.01953 0.183962C8.01705 0.191176 8.01456 0.200793 8.01207 0.212819C8.00959 0.224845 7.98596 0.272935 7.9412 0.357103C7.89644 0.441271 7.84049 0.526637 7.77335 0.613208C7.70621 0.699778 7.64604 0.765182 7.59283 0.809434C7.53911 0.854162 7.50355 0.885421 7.48614 0.903219C7.46874 0.921492 7.4476 0.938323 7.42273 0.953718L7.38543 0.977525L7.37797 0.981132L7.37051 0.984739L7.36902 0.986903L7.36678 0.988346L7.36454 0.989789L7.36305 0.991953L7.35559 0.99556L7.34813 0.999168L7.34664 1.00133L7.3444 1.00277L7.34216 1.00422L7.34067 1.00638L7.33918 1.00855L7.33694 1.00999L7.3347 1.01143L7.33321 1.0136H7.37051L7.57939 0.970311C7.71865 0.941454 7.85168 0.906588 7.9785 0.865705L8.17992 0.800777L8.2023 0.793563L8.21349 0.789956L8.22095 0.786348L8.22841 0.782741L8.23587 0.779134L8.24333 0.775527L8.25825 0.773363L8.27317 0.77192V0.786348L8.26944 0.787791L8.26571 0.789956L8.26423 0.79212L8.26198 0.793563L8.25974 0.795006L8.25825 0.79717L8.25677 0.799334L8.25452 0.800777L8.25228 0.80222L8.25079 0.804384L8.24931 0.806548L8.24706 0.807991L8.24333 0.815205L8.2396 0.82242L8.23736 0.823862C8.23637 0.825305 8.20479 0.866181 8.14262 0.946504C8.08046 1.0273 8.04689 1.06818 8.04191 1.06915C8.03694 1.07059 8.02997 1.0778 8.02102 1.09079C8.01257 1.10425 7.95985 1.15788 7.86287 1.25166C7.76589 1.34545 7.67091 1.42889 7.57791 1.502C7.48441 1.57558 7.43716 1.666 7.43616 1.77325C7.43467 1.88002 7.42895 2.00074 7.419 2.13541C7.40905 2.27007 7.3904 2.41555 7.36305 2.57186C7.3357 2.72817 7.29342 2.90492 7.23623 3.10211C7.17904 3.29929 7.10941 3.49168 7.02735 3.67925C6.94529 3.86681 6.8595 4.03514 6.76998 4.18424C6.68046 4.33334 6.5984 4.45958 6.5238 4.56299C6.4492 4.66639 6.37336 4.76378 6.29626 4.85516C6.21918 4.94654 6.12171 5.04947 6.00384 5.16393C5.88547 5.27791 5.82082 5.34044 5.80988 5.3515C5.79844 5.36208 5.74971 5.40152 5.66365 5.46981C5.57812 5.53858 5.48611 5.60736 5.38763 5.67614C5.28966 5.74443 5.19964 5.80143 5.11758 5.84711C5.03552 5.8928 4.93655 5.94498 4.82067 6.00366C4.70529 6.06282 4.58046 6.11765 4.44618 6.16815C4.3119 6.21865 4.17016 6.26554 4.02096 6.30882C3.87176 6.35211 3.72753 6.38578 3.58827 6.40982C3.44903 6.43387 3.29112 6.45431 3.11456 6.47114L2.84973 6.49639V6.5H2.36483V6.49639L2.30142 6.49279C2.25915 6.49038 2.22433 6.48797 2.19698 6.48557C2.16963 6.48317 2.06643 6.46994 1.88739 6.44589C1.70835 6.42185 1.56785 6.3978 1.4659 6.37375C1.36395 6.34971 1.21225 6.30401 1.01083 6.23668C0.809413 6.16935 0.637087 6.10129 0.493854 6.03252C0.351121 5.96422 0.261601 5.92094 0.225293 5.90266C0.189485 5.88487 0.149201 5.86275 0.10444 5.83629L0.0373001 5.79661L0.0358156 5.79445L0.0335701 5.79301L0.0313321 5.79156L0.0298401 5.7894L0.0223801 5.78579L0.0149201 5.78219L0.0134355 5.78002L0.01119 5.77858L0.00895204 5.77714L0.00746003 5.77497L0.00597548 5.77281L0.00373001 5.77137H0V5.75694L0.00746003 5.75838L0.0149201 5.76054L0.0484902 5.76415C0.0708703 5.76655 0.131796 5.77016 0.231261 5.77497C0.330733 5.77978 0.436412 5.77978 0.548312 5.77497C0.660213 5.77016 0.774605 5.75934 0.891474 5.74251C1.00835 5.72568 1.14636 5.69682 1.30551 5.65594C1.46466 5.61505 1.61087 5.56648 1.74416 5.51021C1.87695 5.45346 1.97144 5.41114 2.02764 5.38324C2.08334 5.35583 2.16838 5.30484 2.28277 5.2303L2.45435 5.11848L2.45584 5.11632L2.45808 5.11487L2.46033 5.11343L2.46181 5.11127L2.4633 5.1091L2.46554 5.10766L2.46779 5.10622L2.46927 5.10405L2.47673 5.10189L2.48419 5.10044L2.48568 5.09323L2.48792 5.08602L2.49017 5.08457L2.49165 5.08241L2.43197 5.0788C2.39219 5.0764 2.35364 5.07399 2.31634 5.07159C2.27904 5.06918 2.2206 5.05836 2.14103 5.03912C2.06146 5.01988 1.97567 4.99103 1.88366 4.95255C1.79165 4.91408 1.70213 4.86838 1.6151 4.81548C1.52807 4.76258 1.46515 4.71857 1.42636 4.68346C1.38807 4.64883 1.33833 4.59978 1.27716 4.53629C1.21648 4.47233 1.16376 4.40668 1.119 4.33934C1.07424 4.27202 1.03148 4.19433 0.990699 4.10633L0.928774 3.97503L0.925044 3.96421L0.921314 3.95339L0.919076 3.94617L0.917584 3.93896L0.928774 3.9404L0.939964 3.94256L1.02202 3.95339C1.07674 3.9606 1.16253 3.963 1.27939 3.9606C1.39627 3.9582 1.47709 3.95339 1.52185 3.94617C1.56661 3.93896 1.59396 3.93414 1.60391 3.93174L1.61883 3.92814L1.63748 3.92453L1.65613 3.92092L1.65762 3.91876L1.65986 3.91731L1.6621 3.91587L1.66359 3.91371L1.64867 3.9101L1.63375 3.90649L1.61883 3.90289L1.60391 3.89928L1.58899 3.89567C1.57904 3.89327 1.56164 3.88846 1.53677 3.88124C1.5119 3.87403 1.44476 3.84757 1.33535 3.80189C1.22594 3.7562 1.1389 3.71171 1.07424 3.66842C1.00943 3.62501 0.947626 3.57754 0.889235 3.5263C0.831047 3.47436 0.767145 3.40751 0.697513 3.32575C0.627888 3.24399 0.565724 3.149 0.511012 3.04079C0.456308 2.93257 0.415277 2.82917 0.387922 2.73058C0.360676 2.63256 0.3427 2.53235 0.334217 2.43119L0.320781 2.27969L0.328241 2.28113L0.335701 2.2833L0.343161 2.2869L0.350621 2.29051L0.358081 2.29412L0.365541 2.29772L0.481172 2.34822C0.558264 2.38189 0.653998 2.41075 0.768383 2.43479C0.882775 2.45884 0.951154 2.47207 0.973534 2.47447L1.0071 2.47808H1.07424L1.07276 2.47592L1.07051 2.47447L1.06828 2.47303L1.06678 2.47087L1.0653 2.4687L1.06305 2.46726L1.06082 2.46582L1.05932 2.46365L1.05186 2.46004L1.0444 2.45644L1.04292 2.45427L1.04067 2.45283L1.03844 2.45139L1.03694 2.44922L1.02948 2.44562L1.02202 2.44201L1.02054 2.43984C1.01905 2.43888 0.99766 2.42349 0.956376 2.39367C0.915592 2.36337 0.872823 2.32418 0.828063 2.27608C0.783303 2.22798 0.738543 2.17749 0.693783 2.12458C0.64894 2.07156 0.609 2.01483 0.574422 1.95505C0.539614 1.89493 0.502806 1.81846 0.464014 1.72564C0.425721 1.6333 0.396627 1.54023 0.376731 1.44645C0.356843 1.35266 0.345653 1.26008 0.343161 1.1687C0.340677 1.07732 0.343161 0.999168 0.350621 0.93424C0.358081 0.869312 0.373001 0.795965 0.395382 0.714206C0.417762 0.632448 0.450093 0.545877 0.492362 0.454495L0.555772 0.317425L0.559502 0.306604L0.563232 0.295782L0.565478 0.29434L0.566962 0.292175L0.568454 0.290011L0.570692 0.288568L0.572938 0.290011L0.574422 0.292175L0.575914 0.29434L0.578152 0.295782L0.580398 0.297225L0.581882 0.29939L0.583374 0.301554L0.585612 0.302997L0.589342 0.310211L0.593072 0.317425L0.595318 0.318868L0.596802 0.321032L0.697513 0.429245C0.764653 0.501387 0.844229 0.581948 0.936234 0.670921C1.02825 0.759894 1.07922 0.806065 1.08916 0.809434C1.09912 0.813279 1.11154 0.824338 1.12646 0.842619C1.14138 0.860417 1.19112 0.902981 1.27567 0.970311C1.36022 1.03764 1.47087 1.1158 1.60764 1.20477C1.74441 1.29375 1.89609 1.38152 2.0627 1.46809C2.22931 1.55466 2.40835 1.63281 2.59982 1.70255C2.7913 1.77229 2.92558 1.81798 3.00266 1.83962C3.07975 1.86127 3.21154 1.88892 3.39804 1.92259C3.58454 1.95625 3.72505 1.9779 3.81954 1.98751C3.91403 1.99713 3.97869 2.00266 4.0135 2.00411L4.06572 2.00555L4.06423 1.99473L4.06199 1.98391L4.04707 1.89373C4.03712 1.83361 4.03215 1.74944 4.03215 1.64123C4.03215 1.53302 4.04085 1.43322 4.05826 1.34184C4.07567 1.25046 4.10178 1.15788 4.13659 1.0641C4.1714 0.970311 4.20547 0.895038 4.23879 0.838291C4.27261 0.78202 4.31687 0.717814 4.37158 0.645671C4.42629 0.573529 4.49716 0.498985 4.58419 0.422031C4.67122 0.345077 4.77069 0.276542 4.88259 0.216426C4.99449 0.15631 5.09769 0.110615 5.19218 0.0793563C5.28668 0.0480971 5.36625 0.0276521 5.4309 0.0180355C5.49556 0.00841898 5.52788 0.00288568 5.52788 0.00144284Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Twitter</span>
</a>
<a href="#" class="share__item" data-code="tg">
<span class="share__item-icon share__item-icon--tg">
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.39589 3.04852C1.39589 3.04852 5.05491 1.51189 6.32392 0.9708C6.8104 0.754384 8.46012 0.0617918 8.46012 0.0617918C8.46012 0.0617918 9.22155 -0.241191 9.15809 0.494655C9.13692 0.797667 8.96773 1.85815 8.79854 3.00523C8.54472 4.62846 8.26976 6.40316 8.26976 6.40316C8.26976 6.40316 8.22746 6.90097 7.86791 6.98753C7.50836 7.0741 6.91613 6.68455 6.8104 6.59795C6.72577 6.53304 5.22411 5.5591 4.6742 5.08295C4.52614 4.9531 4.35695 4.6934 4.69533 4.39039C5.45676 3.67617 6.36622 2.78882 6.91613 2.2261C7.16995 1.96638 7.42374 1.36038 6.36622 2.09622C4.86456 3.15674 3.38403 4.15231 3.38403 4.15231C3.38403 4.15231 3.04561 4.36873 2.41111 4.17394C1.77657 3.97918 1.03631 3.71945 1.03631 3.71945C1.03631 3.71945 0.528726 3.39481 1.39589 3.04852Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Telegram</span>
</a>
<a href="#" class="share__item js-share-item-copy">
<span class="share__item-icon share__item-icon--copy">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.19922 5.40327C4.37217 5.63449 4.59283 5.8258 4.84622 5.96425C5.09962 6.10269 5.37982 6.18501 5.66783 6.20564C5.95584 6.22627 6.24492 6.18471 6.51546 6.08379C6.78599 5.98287 7.03166 5.82495 7.2358 5.62074L8.44399 4.41255C8.81079 4.03277 9.01375 3.52412 9.00917 2.99615C9.00458 2.46818 8.79281 1.96313 8.41946 1.58978C8.04611 1.21644 7.54106 1.00466 7.01309 1.00008C6.48512 0.995488 5.97647 1.19845 5.59669 1.56525L4.904 2.25392" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.81002 4.59658C5.63707 4.36536 5.41641 4.17404 5.16302 4.0356C4.90962 3.89716 4.62942 3.81483 4.34141 3.79421C4.0534 3.77358 3.76432 3.81514 3.49379 3.91605C3.22325 4.01697 2.97758 4.17489 2.77344 4.3791L1.56525 5.58729C1.19845 5.96707 0.995488 6.47572 1.00008 7.0037C1.00466 7.53167 1.21644 8.03672 1.58978 8.41006C1.96313 8.78341 2.46818 8.99518 2.99615 8.99977C3.52412 9.00436 4.03277 8.80139 4.41255 8.43459L5.10122 7.74592" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="share__item-text">Скопировать ссылку</span>
</a>
</div>
</div> <!-- //share -->
</noindex>
<div class="row">
<div class="col-xl-9 col-lg-8 col-poster">
<div class="article-poster">
<picture >
<img src="https://248006.selcdn.ru/main/iblock/f89/f89ed1c2bb3e65c80d3ea0d9150cd880/ff609d19081017de9a6f094cc5474ecf.png" itemprop='image' class='hidden-xs' />
</picture> <picture >
<img src="https://248006.selcdn.ru/main/iblock/f89/f89ed1c2bb3e65c80d3ea0d9150cd880/ff609d19081017de9a6f094cc5474ecf.png" itemprop='image' class='visible-xs' />
</picture> </div>
<noindex>
<p class="article-poster-text" data-nosnippet>
Иллюстрация: Artur Kovalev / Wikimedia Commons / Colowgee для Skillbox Media </p>
</noindex>
</div>
<div class="col-xl-3 col-lg-4 col-author">
<div class="article-author">
<div class="article-author__image">
<a href="/media/authors/ruslan-gadsjiev/">
<img src="https://248006.selcdn.ru/main/iblock/052/0526a58dcc960827ec6c76de626da2fb/2742df09bd0e210535de3a78196379a9.png" alt="Руслан Гаджиев">
</a>
</div>
<div class="article-author__info">
<div class="article-author__name">
Руслан Гаджиев </div>
<div class="article-author__description">
Переводчик, специалист по авиационной безопасности, начинающий веб-разработчик. Убеждён, что любой человек может сочетать абсолютно разные интересы и сферы профессиональной деятельности, ведь наши возможности безграничны. </div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row flex-row-rev">
<div class="col-xl-3 col-lg-4 col-author">
<div class="js-article-banner" data-article-banner-mobile data-type="side_mounted" data-article-banner-sticky-start>
<!--AdFox START-->
<!--yandex_skillbox.media-->
<!--Площадка: Skillbox / Сквозной для застройщика Легенда / Боковой баннер сквозной для застройщика Легенда-->
<!--Категория: <не задана>-->
<!--Тип баннера: Media banner-->
<div id="adfox_176131540100027244"></div>
<script>
window.yaContextCb.push(()=>{
Ya.adfoxCode.create({
ownerId: 11649869,
containerId: 'adfox_176131540100027244',
params: {
p1: 'dkugb',
p2: 'p'
}
})
})
</script> </div>
<div class="js-article-banner" data-article-banner-mobile data-type="vertical" data-article-banner-sticky-end></div>
</div>
<div class="col-xl-9 col-lg-8 col-poster">
<div class="container container--setka">
<div class="js-article-banner" data-type="top"></div>
<div class="article-detail-text__setka" data-detail-text>
<div class="stk-post stk-layout_12col_18068 stk-theme_26309" data-ui-id="post" data-reset-type="class" data-editor-version="3.2.4-rc6" data-stk="{"images":[{"id":34704,"alt":"","caption":""},{"id":34703,"alt":"","caption":""},{"id":34702,"alt":"","caption":""},{"id":34701,"alt":"","caption":""},{"id":34700,"alt":"","caption":""},{"id":34699,"alt":"","caption":""},{"id":34698,"alt":"","caption":""},{"id":34697,"alt":"","caption":""},{"id":34696,"alt":"","caption":""},{"id":34694,"alt":"","caption":""}]}" data-ce-tag="post" data-layout-type="auto">
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<div class="stk-grid valign-bottom stk-theme_26309__mb_05" data-ce-tag="grid">
<div data-col-width="4" class="stk-grid-col valign-top" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m="">
<figure class="stk-reset sklbx-profile__portrait stk-image-figure stk-theme_26309__mb_0" data-ce-tag="image-figure">
<div data-ce-tag="mask" class="stk-mask">
<img src="/upload/setka_images/08504703062022_c9cf75e25dca4b39b44fe6256118d7c4f3b90516.jpg" class="stk-image stk-reset" data-image-id="34696" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure>
</div>
<div data-col-width="8" class="stk-grid-col valign-top stk-grid-col_last" data-ce-tag="grid-col">
<h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Фернандо Дольо <br>
(Fernando Doglio)</h3>
<hr class="stk-theme_26309__separator_basic_divider stk-theme_26309__mb_05 stk-reset">
<div class="stk-grid stk-theme_26309__mb_0" data-ce-tag="grid">
<div data-col-width="2" class="stk-grid-col valign-top" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m="">
<p class="stk-theme_26309__style_small_text stk-reset" data-ce-tag="paragraph">
<strong class="stk-reset">Об авторе</strong>
</p>
</div>
<div data-col-width="6" class="stk-grid-col valign-top stk-grid-col_last" data-ce-tag="grid-col">
<p class="stk-reset" data-ce-tag="paragraph">
Один из топовых авторов на Medium. Пишет о технологиях, образе жизни, личном опыте и многом другом.
</p>
</div>
</div>
<hr class="stk-reset stk-theme_26309__separator_divider-1498128612642 stk-theme_26309__mb_0">
<div class="stk-grid stk-theme_26309__mb_0" data-ce-tag="grid">
<div data-col-width="2" class="stk-grid-col valign-top" data-stk-css="" data-stk-css-m="" data-ce-tag="grid-col">
<p class="stk-theme_26309__style_small_text stk-reset" data-ce-tag="paragraph">
<strong class="stk-reset">Источник</strong>
</p>
</div>
<div data-col-width="6" class="stk-grid-col valign-top stk-grid-col_last" data-ce-tag="grid-col">
<p class="stk-reset" data-ce-tag="paragraph">
<a class="stk-reset" href="https://blog.bitsrc.io/kiss-solid-yagni-and-other-fun-acronyms-b5d207530335" target="_blank">KISS, SOLID, YAGNI And Other Fun Acronyms</a>
</p>
</div>
</div>
<hr class="stk-theme_26309__mb_0 stk-theme_26309__separator_divider-1498128612642 stk-reset">
<div class="stk-grid" data-ce-tag="grid">
<div data-col-width="2" class="stk-grid-col" data-stk-css="" data-stk-css-m="" data-ce-tag="grid-col">
<p class="stk-theme_26309__style_small_text stk-reset" data-ce-tag="paragraph">
<strong class="stk-reset">Переводчик</strong>
</p>
</div>
<div data-col-width="6" class="stk-grid-col valign-top stk-grid-col_last" data-ce-tag="grid-col">
<p class="stk-reset" data-ce-tag="paragraph">
Руслан Гаджиев
</p>
</div>
</div>
</div>
</div>
<hr class="stk-reset stk-theme_26309__separator_divider-1551375397566 stk-theme_26309__mb_15">
<p class="stk-reset" data-ce-tag="paragraph">
За 17 лет работы в индустрии я каких только сокращений не повидал — и серьёзных, и забавных. Да и, если честно, всем разработчикам нравятся аббревиатуры. Одни просто облегчают речь — например, MVP или PoC (ясно же, что, создавая их, никто особо не усердствовал). Другие ещё и звучат забавно: например, SOLID, DRY и KISS.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Вообще, аббревиатур в сленге разработчиков так много, что я подготовил небольшой обзор наиболее (и парочки — менее) распространённых из них — вдруг вы подзабыли, что они означают.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">DRY</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
Начнём с элементарного сокращения, которое наверняка попадалось вам много раз. DRY (англ. dry — сухой, сушить) — основополагающий принцип разработки. Он расшифровывается как<strong class="stk-reset"> Don’t repeat yourself</strong> — «не повторяйтесь».
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Когда пишете код, всегда думайте о том, как можно переиспользовать тот или иной фрагмент, что можно выделить в универсальную функцию или класс, сделать модулем. При этом речь не идёт о создании библиотек под каждую неодноразовую функцию — я имею в виду очень похожую логику, которая встречается в нескольких местах, которую, возможно, есть смысл вынести в функцию. А если в нескольких местах определена одна и та же функция, то её можно вынести в общий модуль. Ну и, наконец, если вы часто используете один и тот же модуль, вероятно, из него можно сделать библиотеку.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Другими словами, don’t repeat yourself, понимаете?
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Этот принцип полезен всегда, вне зависимости от платформы или языка. Допустим, вам надо автоматизировать некое поведение. Чтобы не прописывать несколько раз одну и ту же логику и не раздувать код без нужды, попробуйте обобщить её и вынести в отдельный элемент.
</p>
<div class="stk-grid" data-ce-tag="grid" data-stk-css="stkPLXxX">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<p class="stk-reset " data-ce-tag="paragraph">
Лайфхак: принцип DRY не нужно ограничивать одним репозиторием. Чтобы упростить доступ к модулям или компонентам при работе с разными репозиториями, используйте <a href="https://bit.dev/" target="_blank" class="stk-reset">Bit</a> (вот его страница на <a href="https://github.com/teambit/bit" target="_blank" class="stk-reset">GitHub</a>). Он поддерживает Node.js, TypeScript, React, Vue.js, Angular и другие фреймворки.
</p>
</div>
</div>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="800" src="/upload/setka_images/08520003062022_a65125569de35f720090583b01862c2aebc66c97.gif" height="421" data-image-id="34698" data-image-name="07.gif" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description">Пример переиспользования компонентов React с помощью <a class="stk-reset" href="https://bit.dev/" target="_blank">bit.dev</a><br>
<em class="stk-reset">Скриншот: <a class="stk-reset" href="https://bit.dev/" target="_blank">Bit.dev</a> / Skillbox Media</em></figcaption></figure>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">KISS</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
Эта аббревиатура (англ. kiss — поцелуй, целовать) мне самому всегда нравилась — как по форме, так и по значению: <strong class="stk-reset">Keep it simple, stupid («Сделай это проще, тупица»)</strong> или, если кому-то не нравится называться тупицей, есть вариант <strong class="stk-reset">Keep it stupid simple («Пусть всё будет простым до безобразия»)</strong>, который ещё лучше передаёт смысл аббревиатуры.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Решая какую-нибудь проблему, можно так увлечься, что сам не заметишь, как уже занялся оверинжинирингом или, как я люблю говорить, вовсю палишь из пушки по воробьям. Задача в итоге, конечно, будет решена — но её можно было бы выполнить куда проще и изящнее.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Не спорю, бывают, конечно, и обратные ситуации. Слишком простой код или простая архитектура могут оказаться неэффективными, и тогда в логику придётся добавлять чуть больше сложности. Но всё равно надо каждый раз себя спрашивать, соблюдается ли принцип KISS.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Проверяйте, достаточно ли понятны ваши логические цепочки. Хватит ли знаний вашим коллегам, чтобы в них разобраться? Простой код и простой дизайн уменьшают риск ошибок, да и читать такой код проще. В общем, не забывайте про KISS!
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m="">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">SOLID</strong></h2>
<p class=" stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">
Это ещё одно общее правило программирования. Расшифровывается оно так:
</p>
<ul class=" stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list">
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Single responsibility principle (принцип единственной ответственности).</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Open-closed principle (принцип открытости/закрытости).</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Liskov substitution principle (принцип подстановки Лисков).</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Interface segregation principle (принцип разделения интерфейса).</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Dependency inversion principle (принцип инверсии зависимостей).</li>
</ul>
<p class="stk-reset" data-ce-tag="paragraph">
Получается, что это пять разных принципов в одном (англ. solid — твёрдый, плотный, прочный). Рассмотрим каждый по отдельности.
</p>
<h3 class=" stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">1. Single responsibility principle, принцип единственной ответственности</strong></h3>
<p class="stk-reset" data-ce-tag="paragraph">
Он говорит о том, что каждая ваша функция должна выполнять только одну задачу.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Если вы знакомы с *NIX-системами, такими как дистрибутивы Linux, macOS и прочие, то наверняка имели дело с их терминалом и командами, например <u class="stk-reset">ls</u> или <u class="stk-reset">cd</u>. Они строго следуют принципу SRP — выполняют только один тип задачи (скажем, меняют директорию или выводят список её содержимого). Вы не найдёте такой утилиты, которая позволяла бы выполнить сразу несколько задач (в нашем примере — изменить директорию и вывести список её содержимого). Это даже называется UNIX-way.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Чтобы иметь только одну ответственность, функции должны быть простыми. Если же нужно более сложное поведение, придётся объединять вводы и выводы нескольких функций и делать композицию.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
И хоть я и говорю сейчас о функциях, принцип SRP применим практически ко всему. Взять, например, архитектуру какой-нибудь платформы. Её гораздо проще обслуживать и развивать, если вместо мегамодуля, ответственного вообще за всё, у вас будет несколько микросервисов, каждый из которых отвечает за свою маленькую задачу. Но — ещё раз — то же касается и функций: более простые и понятные функции легче поддерживать, читать, понимать и даже просто писать.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Например, если вам нужна функция <u class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">getUserAndRelatedBooks</u>, в которой прописана логика двух задач, подумайте о том, чтобы разбить её на две функции: <u class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">getUser</u> и <u class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">getUsersBooks</u>, где вторая будет получать на вход результат выполнения первой. Так вы сможете изящно реализовать <u class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">getUserAndRelatedBooks</u>, просто указав <u class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">getUsersBooks (getUser)</u>, то есть объединив их в композицию.
</p>
<h3 class=" stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">2. Open-closed principle, принцип открытости/закрытости</strong></h3>
<p class="stk-reset" data-ce-tag="paragraph">
Он говорит о том, что ваши модули или библиотеки (в зависимости от того, как экспортируется код) должны быть открыты для расширения (например, расширения поведения), но закрыты для модификации (ибо ни у кого нет желания возиться с чужим модулем).
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Если вы заметили, что для добавления в ваш код нового поведения или расширения уже существующего его приходится править, — поздравляю, вы успешно пренебрегли принципом открытости-закрытости! :)
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Вот наглядный пример — <a class="stk-reset" href="https://gist.github.com/deleteman/2ca52b9ddeb3a0bc9cdd105c486d6d41#file-non-open-mod-js" target="_blank">приведённый код</a> нарушает этот принцип. Потому что, если понадобится добавить ещё один город, придётся открывать сам файл и вносить изменения в массив <u class="stk-reset">knownCities</u>.
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08514603062022_a99761cae8b7c6700f6f32e64ee18adc249bbcb4.jpg" height="397" data-image-id="34697" data-image-name="01.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure>
<p class="stk-reset" data-ce-tag="paragraph">
А <a class="stk-reset" href="https://gist.github.com/deleteman/902d596a2e63b730bc8a4acbd3148cac#file-open-closed-mod-js" target="_blank">вот как</a> можно решить эту проблему и соблюсти принцип открытости/закрытости.
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08551603062022_b629b7dc02fe6f5723da7d5f3dd63eb28fb5f3e4.jpg" height="515" data-image-id="34699" data-image-name="02.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure>
<p class="stk-reset" data-ce-tag="paragraph">
Как видим, с помощью метода <u class="stk-reset">addValidCity</u> можно расширить поведение кода под свои задачи, без необходимости править файл.
</p>
<h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">3. Liskov substitution principle, принцип подстановки Лисков</strong></h3>
<p class="stk-reset" data-ce-tag="paragraph">
Этот принцип, также известный как LSP, максимально приближает нас собственно к теории программирования. Сильно углубляться в неё я не буду — просто опишу суть принципа подстановки.
</p>
<div class="stk-grid" data-ce-tag="grid" data-stk-css="stki3wcK">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<p class="stk-reset " data-ce-tag="paragraph">
Функции, которые используют указатели или ссылки на базовые классы, должны иметь возможность использовать подтипы базового типа, ничего не зная об их существовании.
</p>
</div>
</div>
<p class="stk-reset" data-ce-tag="paragraph">
Сразу же бросается в глаза, что мы здесь явно имеем дело с принципом ООП, который помогает правильно применять наследование, когда это необходимо, и использовать альтернативные варианты, когда наследование не нужно.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Рассмотрим это на <a class="stk-reset" href="https://gist.github.com/deleteman/5a08bff5b0964e663ea20dd36958bdce#file-lsp-sample1-js" target="_blank">примере</a>. В геометрии квадрат — это разновидность прямоугольника. По сути, это прямоугольник с одинаковыми шириной и длиной. Если попытаться смоделировать это с помощью кода, можно получить примерно следующее:
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08562903062022_181cbb31e4238c1c11b385d01e6dcc075479973d.jpg" height="995" data-image-id="34700" data-image-name="03.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure>
<p class="stk-reset" data-ce-tag="paragraph">
В абстракции тут нет смысла: методы <u class="stk-reset">setWidth</u> и <u class="stk-reset">setHeight</u> ничего не меняют, квадрата из прямоугольника не получится — а это не то, что нам нужно. Итак, приведённый выше код нарушает принцип подстановки Лисков.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Другими словами, LSP гарантирует правильное использование наследования в вашем коде. Так что, как бы странно он для вас ни звучал, помнить о нём при создании классов всё-таки стоит.
</p>
<h3 class=" stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">4. Interface segregation principle, принцип разделения интерфейса</strong></h3>
<p class="stk-reset" data-ce-tag="paragraph">
Он говорит о том, что нельзя заставлять программистов, работающих с вашим кодом, использовать ненужные методы. Ведь интерфейс — это всего лишь взаимодействие классов (набор методов, которые необходимо реализовать). Поэтому при создании интерфейсов (например, в TypeScript) убедитесь, что методы, которые требуется реализовать, действительно нужны вашим пользователям, — и не городите в одном интерфейсе кучу функциональности. Разделяйте и властвуйте.
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08570703062022_aadc6dada1c2b47a57ee8a782537d4bcc1e79599.jpg" height="357" data-image-id="34701" data-image-name="04.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure>
<p class="stk-reset" data-ce-tag="paragraph">
Рассмотрим <a class="stk-reset" href="https://gist.github.com/deleteman/68a7929b476b80750071774b8490e725#file-bad-interface-ts" target="_blank">этот код</a>. Возможно, при работе с <u class="stk-reset">MyModule</u> кому-то и захочется реализовать методы <u class="stk-reset">close</u> и <u class="stk-reset">open</u>, но если не требуется обеспечить совместимость с IE8, то последний из трёх перечисленных в коде методов точно не понадобится.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Иными словами, принцип разделения интерфейсов имеет дело с дизайном. Соблюдая его, отделяйте методы друг от друга — пусть пользователи сами решают, какие из них применять и для каких задач.
</p>
<h3 class=" stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">5. Dependency inversion principle, принцип инверсии зависимостей</strong></h3>
<p class="stk-reset" data-ce-tag="paragraph">
Концепцию SOLID замыкает принцип инверсии, или внедрения, зависимостей.
</p>
<p class=" stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">
По классике он звучит так:
</p>
<ul class=" stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list">
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Модули верхних уровней не должны импортировать сущности из модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item">Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.</li>
</ul>
<p class="stk-reset" data-ce-tag="paragraph">
Это очень полезный инструмент для многих сценариев, например для юнит-тестирования. Если вы тестируете код, который зависит от сторонней библиотеки, вы можете внедрить мок этой библиотеки для контроля поведения кода. Давайте <a class="stk-reset" href="https://gist.github.com/deleteman/40e0372a2b75c1404ad0cc334efd7a05#file-no-dep-injection-js" target="_blank">покажу на примере</a>:
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08574403062022_3a13088d023e9f50b6d7dd9d789d9ee05e51ab28.jpg" height="316" data-image-id="34702" data-image-name="05.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure>
<p class="stk-reset" data-ce-tag="paragraph">
Здесь мы видим, что подключение к базе данных объявлено и выполняется внутри одного модуля, а функцию <u class="stk-reset">saveUser</u> вы экспортируете. Если теперь попытаться протестировать код, эта функция автоматически постарается выполнить свою первоначальную задачу — подключиться к базе данных и сохранить данные пользователя в ней.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Однако если разрешить внедрение зависимостей и принять соединение с базой данных (которое и является зависимостью) в качестве второго параметра, то можно внедрять мок <a class="stk-reset" href="https://gist.github.com/deleteman/b83cd8608df737e42ae0faaecc304576#file-injected-db-js" target="_blank">дальше</a>:
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08580203062022_a21449561049939422c6ccf788bc0c1c90d933e0.jpg" height="240" data-image-id="34703" data-image-name="06.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure>
<p class="stk-reset" data-ce-tag="paragraph">
Теперь можно даже переключать зависимости — например, использовать другой модуль для подключения к базе данных — на коде это не отразится, он всё так же будет отрабатывать необходимую логику.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Внедрение зависимостей — замечательный инструмент. Он позволяет создавать расширяемый дизайн и очень нужен тем, кому при разработке важна расширяемость. Учитывайте это в своей работе.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">YAGNI</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
Принцип, иначе известный как <strong class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">You ain’t gonna need it</strong> («Вам это не понадобится»), пришёл из экстремального программирования. Согласно ему создавать какую-то функциональность следует только тогда, когда она действительно нужна.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Дело в том, что в рамках Agile-методологий нужно фокусироваться только на текущей итерации проекта. Работать на опережение, добавляя в проект больше функциональности, чем требуется в данный момент, — не очень хорошая идея, учитывая, как быстро могут меняться планы.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Что я имею в виду, говоря про смену планов? Итерации в Agile довольно короткие — то есть вы будете получать какой-то фидбэк уже на ранних этапах разработки, и потенциально он может изменить направление всей работы над проектом. Так зачем вам тратить время на функцию, которая в итоге окажется совершенно ненужной?
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Однако замечу напоследок, что если вы используете методы каскадной разработки, где вся работа планируется заранее и все стараются чётко придерживаться плана, принцип YAGNI неприменим.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">BDUF</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
И раз уж мы заговорили о каскадной модели, то нельзя не вспомнить о принципе <strong class="stk-reset">Big design up front</strong> («Масштабное проектирование прежде всего»), который идеально для неё подходит. Он утверждает, что б<strong class="stk-reset">о</strong>льшую часть времени, отведённого на проектирование приложения, вы тратите далеко не на написание кода.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Сама каскадная модель подразумевает, что нужно продумать заранее абсолютно всё — рассчитывая, что благодаря этому не придётся потом тратить время на поиск и устранение недостатков.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Конечно, как и у многих других описанных здесь принципов, у BDUF есть свои противники. Особенно склонны нападать на него сторонники гибких методологий — они полагают, что в мире победившего Agile он просто бесполезен.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">SoC</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
<strong class="stk-reset">Separation оf concerns</strong> (принцип разделения ответственности) — один из моих любимых. Я использую его при проектировании платформ или при создании внутренней архитектуры проекта.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Не путайте его с уже упоминавшимся Single responsibility principle (принципом единственной ответственности). SoC помогает объединять функции или модули в отдельные сервисы. Суть в том, что при проектировании многофункциональной системы — а так обычно и бывает — можно группировать функции в модули в зависимости от задач, которые каждая из них выполняет.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Пример: блог-площадка, где пользователи могут публиковать посты. Одна система на такой платформе вполне может отвечать за всё (управление пользователями, посты в блоге, аналитика и так далее) — и даже справится со своими функциями. Но если следовать принципу SoC, можно прийти к более интересному решению:
</p>
<figure class="stk-reset stk-image-figure" data-ce-tag="image-figure">
<div class="stk-mask" data-ce-tag="mask">
<img width="1540" src="/upload/setka_images/08592003062022_4bee5bc7607f7bd29ea700220550e2abce458536.jpg" height="1086" data-image-id="34704" data-image-name="08.jpg" class="stk-image stk-reset" loading="lazy">
</div>
<figcaption class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Инфографика: Майя Мальгина для Skillbox Media</em></figcaption></figure>
<p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">
Это, конечно, очень грубый пример, но суть такой архитектуры в том, что вы делите ответственность по модулям. В результате:
</p>
<ul class=" stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list">
<li class="stk-list-item stk-reset " data-ce-tag="list-item"><strong class="stk-reset">Вы получаете масштабирование каждого блока функций. </strong>Теперь при необходимости вы сможете легко масштабировать тот же модуль управления пользователями (User management) — например, потому, что он тянет на себе слишком много трафика, а остальная часть платформы остаётся незагруженной.</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item"><strong class="stk-reset">Вносить изменения становится легче</strong>: связь элементов кода ослаблена, и вы, например, сможете чуть ли не полностью переписать модуль управления постами, не затрагивая другие разделы.</li>
<li class="stk-list-item stk-reset " data-ce-tag="list-item"><strong class="stk-reset">Платформа становится более стабильной.</strong> Если один из модулей сломается, то система потенциально сможет сохранять работоспособность. С меньшей функциональностью, конечно, но тем не менее это возможно.</li>
</ul>
<p class="stk-reset" data-ce-tag="paragraph">
SoC также может применяться при создании API, архитектур библиотек и тому подобного. Его суть в том, чтобы группировать функции по своему усмотрению и с пользой для тех, кто будет их применять.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">MVP</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
Если отойти от программирования, можно вспомнить и другие аббревиатуры, которые часто используются в нашей отрасли. MVP означает <strong class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">Minimum viable product</strong> (минимально жизнеспособный продукт) и предполагает создание минимально необходимой функциональности, которая помогает понять, как продукт работает в реальных условиях и нравится ли он пользователям.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Этим приёмом пользуются сплошь и рядом — чтобы выяснить, стоит ли вообще тратить время на продукт и доводить его до ума. Благодаря MVP целевая аудитория уже может опробовать продукт и дать обратную связь.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">PoC</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
В отличие от MVP, который требует серьёзного планирования и больших затрат на разработку, <strong class="stk-reset">Proof of concept</strong> (доказательство концепции) обычно представляет собой его урезанную версию. Он используется на этапе до MVP и предназначен только для того, чтобы подтвердить или опровергнуть необходимость дополнительной функциональности.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
По сути, PoC — своего рода расходный материал, временный код. Его пишут не для реализации, а для демонстрации проекта. Включать PoC в реальный продукт, в принципе, можно, но имейте в виду, что для доказательства одной концепции, бывает, приходится создавать несколько PoC. Корпеть над ними всеми, чтобы получить в итоге один актуальный продукт, — так себе идея. Так что его намеренно говнокодят, чтобы потом было не жалко выбрасывать.
</p>
<p class="stk-reset" data-ce-tag="paragraph">
Лично мне очень нравится концепция PoC — но именно как расходного материала. Это как <a href="https://ironman.fandom.com/wiki/Iron_Man_Mark_I" target="_blank" class="stk-reset" data-gtm-vis-has-fired-10171822_255="1">Железный Человек и его броня Mark I</a>: она показала, на что он способен, даже если имеет под рукой только дуговой реактор; а Mark II была уже на несколько порядков лучше.
</p>
</div>
</div>
<div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col">
<h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph"><strong class="stk-reset">Заключение</strong></h2>
<p class="stk-reset" data-ce-tag="paragraph">
Все аббревиатуры, упомянутые в этой статье, вы наверняка встречали в инструкциях и мануалах или слышали от коллег. Теперь вы знаете, что они означают и в каком контексте их употреблять.
</p>
<div class="stk-grid" data-ce-tag="grid" data-stk-css="stkHZaBy">
<div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m="">
<p class="stk-reset stk-theme_26309__style_small_text stk-theme_26309__mb_05" data-ce-tag="paragraph">
<strong class="stk-reset">Читайте также:</strong>
</p>
<ul class="stk-theme_26309__style_small_text stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list">
<li class="stk-list-item stk-reset stk-theme_26309__style_small_text" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/kak_novichku_iskat_rabotu_v_it_i_digital/" target="_blank" class="stk-reset">Как новичку искать работу в IT и Digital</a></li>
<li class="stk-list-item stk-reset stk-theme_26309__style_small_text" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/chto-takoe-javascript-i-zachem-on-nuzhen/" target="_blank" class="stk-reset">Что такое JavaScript и зачем он нужен</a></li>
<li class="stk-list-item stk-reset stk-theme_26309__style_small_text" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/pravila_organizatsii_otstupov_kak_sdelat_vyerstku_gibkoy_i_ne_dopustit_oshibok/" target="_blank" class="stk-reset">Правила организации отступов: как сделать вёрстку гибкой и не допустить ошибок</a></li>
</ul>
</div>
</div>
</div>
</div>
<style data-stk-css="stkHZaBy" media="all" class="">
[data-stk-css="stkHZaBy"]:not(#stk):not(#stk):not(style) {
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stki3wcK" media="all" class="">
[data-stk-css="stki3wcK"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stkPLXxX" media="all" class="">
[data-stk-css="stkPLXxX"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style>
</div>
<br> </div>
</div>
</div>
</div>
<div class="col-xl-9 col-lg-8 col-poster">
<div class="article-preview-info">
</div>
</div>
<noindex>
<div class="share" data-nosnippet>
<button class="share__handler-btn ">
<span class="share__handler-icon">
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 4.99902L6 0V2.99805C2.688 2.99805 0 5.68505 0 8.99805V11.498H0.0980225C0.765022 8.91205 3.107 6.99805 5.901 6.99805H6.00098V9.99805L11 4.99902Z" fill="currentColor"/>
</svg>
</span>
<span class="share__handler-text">Поделиться</span>
</button>
<div class="share__list">
<a href="#" class="share__item" data-code="vk">
<span class="share__item-icon share__item-icon--vk">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.04776 4.98054H4.53996C4.62377 4.97136 4.70279 4.9361 4.76621 4.87951C4.81226 4.81209 4.83594 4.73139 4.83369 4.64925C4.83369 4.64925 4.82574 3.94629 5.1314 3.84125C5.43701 3.73621 5.826 4.51998 6.23879 4.82297C6.39281 4.95308 6.59128 5.01558 6.79053 4.99669L7.89399 4.98054C7.89399 4.98054 8.47355 4.94415 8.19965 4.46339C7.98372 4.08315 7.70589 3.743 7.37799 3.45744C6.68338 2.77872 6.77865 2.8878 7.61219 1.71216C8.12024 0.997077 8.32269 0.556717 8.25918 0.370875C8.14651 0.254767 7.98299 0.205914 7.82655 0.241594L6.58018 0.249674C6.52565 0.241067 6.46984 0.251007 6.42141 0.277954C6.37298 0.314507 6.33466 0.363228 6.31025 0.419356C6.18259 0.772814 6.0287 1.11586 5.8498 1.44552C5.29807 2.43936 5.07579 2.49188 4.98451 2.43128C4.77416 2.28584 4.82574 1.85356 4.82574 1.54248C4.82574 0.580957 4.96468 0.176954 4.55979 0.0719133C4.36879 0.0254376 4.17259 0.00505841 3.97631 0.0113129C3.62834 -0.0214164 3.27745 0.017045 2.94429 0.124433C2.8014 0.197154 2.69423 0.358753 2.76171 0.370875C2.90334 0.385518 3.03406 0.454932 3.12688 0.564795C3.21268 0.750336 3.25481 0.953675 3.24993 1.15868C3.24993 1.15868 3.32535 2.29392 3.07925 2.43532C2.91254 2.53228 2.68232 2.33432 2.18616 1.4334C2.01958 1.11848 1.87243 0.793298 1.74557 0.459754C1.72231 0.404013 1.68704 0.354309 1.64236 0.314316C1.58589 0.272672 1.52066 0.245006 1.45184 0.233514L0.268986 0.241594C0.181167 0.241154 0.0958013 0.271066 0.0268587 0.326434C-0.00595087 0.396174 -0.00882613 0.476652 0.0189202 0.548633C0.0189202 0.548633 0.947737 2.83932 1.99563 3.99477C2.51 4.60651 3.2568 4.96526 4.04776 4.98054Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Vkontakte</span>
</a>
<a href="#" class="share__item" data-code="tw">
<span class="share__item-icon share__item-icon--tw">
<svg width="9" height="7" viewBox="0 0 9 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.52788 0.00144284V0H5.9158L6.05754 0.027414C6.15204 0.0452114 6.23783 0.068535 6.31491 0.0973918C6.39201 0.126249 6.46661 0.159917 6.53872 0.198391C6.61083 0.236864 6.67623 0.276066 6.73492 0.315982C6.79311 0.355422 6.84533 0.397265 6.89158 0.441509C6.93733 0.486237 7.0087 0.49778 7.10568 0.476138C7.20266 0.454495 7.3071 0.424433 7.419 0.38596C7.5309 0.347487 7.64156 0.304201 7.75097 0.256104C7.86039 0.208007 7.92703 0.177469 7.95091 0.164484C7.97428 0.151022 7.98671 0.143808 7.98821 0.142841L7.98969 0.140677L7.99715 0.13707L8.00461 0.133463L8.01207 0.129856L8.01953 0.126249L8.02102 0.124084L8.02326 0.122642L8.02551 0.121199L8.02699 0.119034L8.03445 0.11687L8.04191 0.115427L8.04043 0.126249L8.03818 0.13707L8.03445 0.147891L8.03072 0.158713L8.02699 0.165927L8.02326 0.173141L8.01953 0.183962C8.01705 0.191176 8.01456 0.200793 8.01207 0.212819C8.00959 0.224845 7.98596 0.272935 7.9412 0.357103C7.89644 0.441271 7.84049 0.526637 7.77335 0.613208C7.70621 0.699778 7.64604 0.765182 7.59283 0.809434C7.53911 0.854162 7.50355 0.885421 7.48614 0.903219C7.46874 0.921492 7.4476 0.938323 7.42273 0.953718L7.38543 0.977525L7.37797 0.981132L7.37051 0.984739L7.36902 0.986903L7.36678 0.988346L7.36454 0.989789L7.36305 0.991953L7.35559 0.99556L7.34813 0.999168L7.34664 1.00133L7.3444 1.00277L7.34216 1.00422L7.34067 1.00638L7.33918 1.00855L7.33694 1.00999L7.3347 1.01143L7.33321 1.0136H7.37051L7.57939 0.970311C7.71865 0.941454 7.85168 0.906588 7.9785 0.865705L8.17992 0.800777L8.2023 0.793563L8.21349 0.789956L8.22095 0.786348L8.22841 0.782741L8.23587 0.779134L8.24333 0.775527L8.25825 0.773363L8.27317 0.77192V0.786348L8.26944 0.787791L8.26571 0.789956L8.26423 0.79212L8.26198 0.793563L8.25974 0.795006L8.25825 0.79717L8.25677 0.799334L8.25452 0.800777L8.25228 0.80222L8.25079 0.804384L8.24931 0.806548L8.24706 0.807991L8.24333 0.815205L8.2396 0.82242L8.23736 0.823862C8.23637 0.825305 8.20479 0.866181 8.14262 0.946504C8.08046 1.0273 8.04689 1.06818 8.04191 1.06915C8.03694 1.07059 8.02997 1.0778 8.02102 1.09079C8.01257 1.10425 7.95985 1.15788 7.86287 1.25166C7.76589 1.34545 7.67091 1.42889 7.57791 1.502C7.48441 1.57558 7.43716 1.666 7.43616 1.77325C7.43467 1.88002 7.42895 2.00074 7.419 2.13541C7.40905 2.27007 7.3904 2.41555 7.36305 2.57186C7.3357 2.72817 7.29342 2.90492 7.23623 3.10211C7.17904 3.29929 7.10941 3.49168 7.02735 3.67925C6.94529 3.86681 6.8595 4.03514 6.76998 4.18424C6.68046 4.33334 6.5984 4.45958 6.5238 4.56299C6.4492 4.66639 6.37336 4.76378 6.29626 4.85516C6.21918 4.94654 6.12171 5.04947 6.00384 5.16393C5.88547 5.27791 5.82082 5.34044 5.80988 5.3515C5.79844 5.36208 5.74971 5.40152 5.66365 5.46981C5.57812 5.53858 5.48611 5.60736 5.38763 5.67614C5.28966 5.74443 5.19964 5.80143 5.11758 5.84711C5.03552 5.8928 4.93655 5.94498 4.82067 6.00366C4.70529 6.06282 4.58046 6.11765 4.44618 6.16815C4.3119 6.21865 4.17016 6.26554 4.02096 6.30882C3.87176 6.35211 3.72753 6.38578 3.58827 6.40982C3.44903 6.43387 3.29112 6.45431 3.11456 6.47114L2.84973 6.49639V6.5H2.36483V6.49639L2.30142 6.49279C2.25915 6.49038 2.22433 6.48797 2.19698 6.48557C2.16963 6.48317 2.06643 6.46994 1.88739 6.44589C1.70835 6.42185 1.56785 6.3978 1.4659 6.37375C1.36395 6.34971 1.21225 6.30401 1.01083 6.23668C0.809413 6.16935 0.637087 6.10129 0.493854 6.03252C0.351121 5.96422 0.261601 5.92094 0.225293 5.90266C0.189485 5.88487 0.149201 5.86275 0.10444 5.83629L0.0373001 5.79661L0.0358156 5.79445L0.0335701 5.79301L0.0313321 5.79156L0.0298401 5.7894L0.0223801 5.78579L0.0149201 5.78219L0.0134355 5.78002L0.01119 5.77858L0.00895204 5.77714L0.00746003 5.77497L0.00597548 5.77281L0.00373001 5.77137H0V5.75694L0.00746003 5.75838L0.0149201 5.76054L0.0484902 5.76415C0.0708703 5.76655 0.131796 5.77016 0.231261 5.77497C0.330733 5.77978 0.436412 5.77978 0.548312 5.77497C0.660213 5.77016 0.774605 5.75934 0.891474 5.74251C1.00835 5.72568 1.14636 5.69682 1.30551 5.65594C1.46466 5.61505 1.61087 5.56648 1.74416 5.51021C1.87695 5.45346 1.97144 5.41114 2.02764 5.38324C2.08334 5.35583 2.16838 5.30484 2.28277 5.2303L2.45435 5.11848L2.45584 5.11632L2.45808 5.11487L2.46033 5.11343L2.46181 5.11127L2.4633 5.1091L2.46554 5.10766L2.46779 5.10622L2.46927 5.10405L2.47673 5.10189L2.48419 5.10044L2.48568 5.09323L2.48792 5.08602L2.49017 5.08457L2.49165 5.08241L2.43197 5.0788C2.39219 5.0764 2.35364 5.07399 2.31634 5.07159C2.27904 5.06918 2.2206 5.05836 2.14103 5.03912C2.06146 5.01988 1.97567 4.99103 1.88366 4.95255C1.79165 4.91408 1.70213 4.86838 1.6151 4.81548C1.52807 4.76258 1.46515 4.71857 1.42636 4.68346C1.38807 4.64883 1.33833 4.59978 1.27716 4.53629C1.21648 4.47233 1.16376 4.40668 1.119 4.33934C1.07424 4.27202 1.03148 4.19433 0.990699 4.10633L0.928774 3.97503L0.925044 3.96421L0.921314 3.95339L0.919076 3.94617L0.917584 3.93896L0.928774 3.9404L0.939964 3.94256L1.02202 3.95339C1.07674 3.9606 1.16253 3.963 1.27939 3.9606C1.39627 3.9582 1.47709 3.95339 1.52185 3.94617C1.56661 3.93896 1.59396 3.93414 1.60391 3.93174L1.61883 3.92814L1.63748 3.92453L1.65613 3.92092L1.65762 3.91876L1.65986 3.91731L1.6621 3.91587L1.66359 3.91371L1.64867 3.9101L1.63375 3.90649L1.61883 3.90289L1.60391 3.89928L1.58899 3.89567C1.57904 3.89327 1.56164 3.88846 1.53677 3.88124C1.5119 3.87403 1.44476 3.84757 1.33535 3.80189C1.22594 3.7562 1.1389 3.71171 1.07424 3.66842C1.00943 3.62501 0.947626 3.57754 0.889235 3.5263C0.831047 3.47436 0.767145 3.40751 0.697513 3.32575C0.627888 3.24399 0.565724 3.149 0.511012 3.04079C0.456308 2.93257 0.415277 2.82917 0.387922 2.73058C0.360676 2.63256 0.3427 2.53235 0.334217 2.43119L0.320781 2.27969L0.328241 2.28113L0.335701 2.2833L0.343161 2.2869L0.350621 2.29051L0.358081 2.29412L0.365541 2.29772L0.481172 2.34822C0.558264 2.38189 0.653998 2.41075 0.768383 2.43479C0.882775 2.45884 0.951154 2.47207 0.973534 2.47447L1.0071 2.47808H1.07424L1.07276 2.47592L1.07051 2.47447L1.06828 2.47303L1.06678 2.47087L1.0653 2.4687L1.06305 2.46726L1.06082 2.46582L1.05932 2.46365L1.05186 2.46004L1.0444 2.45644L1.04292 2.45427L1.04067 2.45283L1.03844 2.45139L1.03694 2.44922L1.02948 2.44562L1.02202 2.44201L1.02054 2.43984C1.01905 2.43888 0.99766 2.42349 0.956376 2.39367C0.915592 2.36337 0.872823 2.32418 0.828063 2.27608C0.783303 2.22798 0.738543 2.17749 0.693783 2.12458C0.64894 2.07156 0.609 2.01483 0.574422 1.95505C0.539614 1.89493 0.502806 1.81846 0.464014 1.72564C0.425721 1.6333 0.396627 1.54023 0.376731 1.44645C0.356843 1.35266 0.345653 1.26008 0.343161 1.1687C0.340677 1.07732 0.343161 0.999168 0.350621 0.93424C0.358081 0.869312 0.373001 0.795965 0.395382 0.714206C0.417762 0.632448 0.450093 0.545877 0.492362 0.454495L0.555772 0.317425L0.559502 0.306604L0.563232 0.295782L0.565478 0.29434L0.566962 0.292175L0.568454 0.290011L0.570692 0.288568L0.572938 0.290011L0.574422 0.292175L0.575914 0.29434L0.578152 0.295782L0.580398 0.297225L0.581882 0.29939L0.583374 0.301554L0.585612 0.302997L0.589342 0.310211L0.593072 0.317425L0.595318 0.318868L0.596802 0.321032L0.697513 0.429245C0.764653 0.501387 0.844229 0.581948 0.936234 0.670921C1.02825 0.759894 1.07922 0.806065 1.08916 0.809434C1.09912 0.813279 1.11154 0.824338 1.12646 0.842619C1.14138 0.860417 1.19112 0.902981 1.27567 0.970311C1.36022 1.03764 1.47087 1.1158 1.60764 1.20477C1.74441 1.29375 1.89609 1.38152 2.0627 1.46809C2.22931 1.55466 2.40835 1.63281 2.59982 1.70255C2.7913 1.77229 2.92558 1.81798 3.00266 1.83962C3.07975 1.86127 3.21154 1.88892 3.39804 1.92259C3.58454 1.95625 3.72505 1.9779 3.81954 1.98751C3.91403 1.99713 3.97869 2.00266 4.0135 2.00411L4.06572 2.00555L4.06423 1.99473L4.06199 1.98391L4.04707 1.89373C4.03712 1.83361 4.03215 1.74944 4.03215 1.64123C4.03215 1.53302 4.04085 1.43322 4.05826 1.34184C4.07567 1.25046 4.10178 1.15788 4.13659 1.0641C4.1714 0.970311 4.20547 0.895038 4.23879 0.838291C4.27261 0.78202 4.31687 0.717814 4.37158 0.645671C4.42629 0.573529 4.49716 0.498985 4.58419 0.422031C4.67122 0.345077 4.77069 0.276542 4.88259 0.216426C4.99449 0.15631 5.09769 0.110615 5.19218 0.0793563C5.28668 0.0480971 5.36625 0.0276521 5.4309 0.0180355C5.49556 0.00841898 5.52788 0.00288568 5.52788 0.00144284Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Twitter</span>
</a>
<a href="#" class="share__item" data-code="tg">
<span class="share__item-icon share__item-icon--tg">
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.39589 3.04852C1.39589 3.04852 5.05491 1.51189 6.32392 0.9708C6.8104 0.754384 8.46012 0.0617918 8.46012 0.0617918C8.46012 0.0617918 9.22155 -0.241191 9.15809 0.494655C9.13692 0.797667 8.96773 1.85815 8.79854 3.00523C8.54472 4.62846 8.26976 6.40316 8.26976 6.40316C8.26976 6.40316 8.22746 6.90097 7.86791 6.98753C7.50836 7.0741 6.91613 6.68455 6.8104 6.59795C6.72577 6.53304 5.22411 5.5591 4.6742 5.08295C4.52614 4.9531 4.35695 4.6934 4.69533 4.39039C5.45676 3.67617 6.36622 2.78882 6.91613 2.2261C7.16995 1.96638 7.42374 1.36038 6.36622 2.09622C4.86456 3.15674 3.38403 4.15231 3.38403 4.15231C3.38403 4.15231 3.04561 4.36873 2.41111 4.17394C1.77657 3.97918 1.03631 3.71945 1.03631 3.71945C1.03631 3.71945 0.528726 3.39481 1.39589 3.04852Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Telegram</span>
</a>
<a href="#" class="share__item js-share-item-copy">
<span class="share__item-icon share__item-icon--copy">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.19922 5.40327C4.37217 5.63449 4.59283 5.8258 4.84622 5.96425C5.09962 6.10269 5.37982 6.18501 5.66783 6.20564C5.95584 6.22627 6.24492 6.18471 6.51546 6.08379C6.78599 5.98287 7.03166 5.82495 7.2358 5.62074L8.44399 4.41255C8.81079 4.03277 9.01375 3.52412 9.00917 2.99615C9.00458 2.46818 8.79281 1.96313 8.41946 1.58978C8.04611 1.21644 7.54106 1.00466 7.01309 1.00008C6.48512 0.995488 5.97647 1.19845 5.59669 1.56525L4.904 2.25392" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.81002 4.59658C5.63707 4.36536 5.41641 4.17404 5.16302 4.0356C4.90962 3.89716 4.62942 3.81483 4.34141 3.79421C4.0534 3.77358 3.76432 3.81514 3.49379 3.91605C3.22325 4.01697 2.97758 4.17489 2.77344 4.3791L1.56525 5.58729C1.19845 5.96707 0.995488 6.47572 1.00008 7.0037C1.00466 7.53167 1.21644 8.03672 1.58978 8.41006C1.96313 8.78341 2.46818 8.99518 2.99615 8.99977C3.52412 9.00436 4.03277 8.80139 4.41255 8.43459L5.10122 7.74592" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="share__item-text">Скопировать ссылку</span>
</a>
</div>
</div>
</noindex>
</div>
<section class="container inset" data-banner="221440" data-source="212098" data-format="horizontal">
<div class="row">
<div class="col-lg-8 col-sm-12">
<a
target="_blank" href="https://skillbox.ru/course/profession-java/"
class="article-advert-banner__link courseLink"
data-banner="221440"
data-source="212098"
data-format="horizontal"
data-type="horizontal"
>
<div class="inset__wrapper" style="background-color: #BDDAEC;">
<div class="inset__content">
<h2 class="inset__header">Курс</h2>
<p class="inset__description">
Профессия Java-разработчик + ИИ </p>
<p class="inset__text">
</p>
<p class="inset__button article-advert-banner__link"> Узнать про курс</p>
</div>
<div class="inset__image">
<img src="https://cdn.skillbox.pro/landgen/blocks/start-screen/604300/lg/a4acb4f6-f326-4e82-9bd1-fce4136cf411.webp" width="145" height="145" alt="">
</div>
</div>
</a>
</div>
</div>
</section>
<div style="align-content: center; background-color: black; overflow: hidden;">
<noindex>
<div style="display: flex; align-items: center; justify-content: center; background-color: black; height: 60px; color: white; text-align: center">
Листая дальше, вы перейдете на страницу <a style="text-decoration: underline;" data-type="scroll" href="https://bootcamp.skillbox.ru/osnovy/new/june/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_sbornik-888_all_scroll_skillbox">Получите 4 курса для старта работы в ИТ</a>
</div>
<div class="iframe-wrapper" style="height: 100vh; transform: scale(0.5);">
<iframe id="test_iframe" scrolling="no" style="overflow: hidden;margin: 0 auto;display: block; width: 100%; height: 100%" src="https://bootcamp.skillbox.ru/osnovy/new/june/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_sbornik-888_all_scroll_skillbox">
</iframe>
</div>
</noindex>
</div>
<script>
jQuery(document).ready(function($) {
$('footer.without-buttons').remove();
let iframeWrapper = $('.iframe-wrapper');
var check = false;
$(window).on('scroll', function() {
let iframeWrapperHeight = iframeWrapper.height();
let iframeWrapperOffset = iframeWrapper.offset().top - iframeWrapperHeight;
let scrollTop = $(window).scrollTop();
const {scrollHeight, clientHeight } = document.documentElement;
const maxScroll = scrollHeight - clientHeight;
const power = 1
const scale = (scrollTop / maxScroll) * power;
iframeWrapper.css('height', `${clientHeight}`)
if (scrollTop > iframeWrapperOffset) {
if(!check) {
document.dispatchEvent(new CustomEvent('articleAdvertBanner', {
detail: {
event: 'show',
id: 225806,
sourceId: 212098,
format: "new_banner"
}
}));
}
check = true;
iframeWrapper.css({'transform': `scale(${scale})`})
if (maxScroll === scrollTop || maxScroll === iframeWrapper.offset().top) {
redirect();
} else if (maxScroll <= scrollTop + 1 ) {
redirect();
}
}
function isNeedAddUtm(url)
{
if (typeof url !== 'string') {
return false;
}
var externalLinks = [
'freelancer.skillbox.ru',
'sale.skillbox.ru',
'course.skillbox.ru',
'interiordesign.skillbox.ru',
'iamwebdev.skillbox.ru',
'iammarketer.skillbox.ru',
'iamdesigner.skillbox.ru',
'live.skillbox.ru',
'b2b.skillbox.ru',
'highereducation.skillbox.ru',
'skillbox.ru/courses',
'skillbox.ru/sale',
'skillbox.ru/media'
];
for (var i = 0; i < externalLinks.length; i++) {
externalLinks[i] = escapeRegExp(externalLinks[i]);
}
var regexp = new RegExp('^http[s]?:\/\/(skillbox\.ru|' + escapeRegExp(window.location.host) + '|' + externalLinks.join('|') + ')\/(?!media/)[a-zA-Z0-9-_/]*');
return !!url.match(regexp);
}
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function redirect() {
document.dispatchEvent(new CustomEvent('articleAdvertBanner', {
detail: {
event: 'click',
id: 225806,
sourceId: 212098,
format: "new_banner"
}
}));
var page = window.location.href;
var $article = $('section[data-article-text]');
var pageId = $article.data('articleid');
if(pageId === undefined)
{
pageId = 0;
}
window.dataLayer.push({
'event': 'go_to_course',
'courseID': 225806,
'page': page,
'pageID': pageId
});
var link = "https://bootcamp.skillbox.ru/osnovy/new/june/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_sbornik-888_all_scroll_skillbox";
if(isNeedAddUtm(link)) {
var urlSplit = link.split('?');
var urlBase = urlSplit[0] ? urlSplit[0] : '';
link = urlBase + '?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_banners_scroll_all_all_skillbox';
}
window.location.assign(link);
// var iframe = document.getElementById("test_iframe");
// var src = iframe.src;
// var document_frame = iframe.contentWindow.document.documentElement;
// var body = window.document.body.innerHTML;
// var title = iframe.contentWindow.document.head.title;
//
// window.history.pushState({
// "html": body,
// "pageTitle": title,
// "src": document.location.href
// }, '', src);
// window.addEventListener("popstate", function(e) {
// window.location.href = document.location;
// });
//
// document.documentElement.replaceWith(document_frame);
}
});
});
</script> </section>
<div class="article-banner" data-banner="219298" data-source="212098" data-format="vertical" data-type="vertical">
<div class="row">
<div class="col-sm-4 col-sm-12">
<div class="inset__wrapper" style="background-color:#f2eeff;">
<div class="inset__content" >
<div class="inset__image" style="text-align: top;">
<img src="https://skillbox.ru/upload/setka_images/math-side.png" width="150" height="150" alt="">
</div>
<p class="inset__description" style="color:#000!important; padding-bottom:13px;">
Изучайте IT на практике — бесплатно</p>
<p class="inset__text" style="color:#000!important">
Курсы за <del>2990</del> 0 р. </p>
<ul class="inset__content" style="color:#007bff!important; list-style:'\2713 ' outside; margin-left:13px;">
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a data-source="212098" data-banner="219298" href="https://bootcamp.skillbox.ru/python-short/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_code_skillbox" target="_blank">Python</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/qa-start/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-655_all_code_skillbox" target="_blank">Тестирование</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/data-science/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-675_all_code_skillbox" target="_blank">Data Science</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/java/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-682_all_code_skillbox" target="_blank">Java</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/sql/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-695_all_code_skillbox" target="_blank">SQL и работа с данными</a>
</li>
</ul>
<a href="https://bootcamp.skillbox.ru/it-jobs/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-759_all_code_skillbox" class="inset__button article-advert-banner__link" target="_blank" style="color:#000; background-color:#ffafff">Я не знаю, с чего начать</a>
</div>
</div>
</div>
</div> </div>
<a
target="_blank" href="https://skillbox.ru/course/profession-java/"
class="article-banner article-advert-banner__link"
style="background-color: #BDDAEC;"
data-banner="221440"
data-source="212098"
data-format="top"
data-type="top"
>
<div class="article-banner__img">
<img src="https://cdn.skillbox.pro/landgen/blocks/start-screen/604300/lg/a4acb4f6-f326-4e82-9bd1-fce4136cf411.webp" alt="">
</div>
<span class="article-banner__title">Научитесь: <u>Профессия Java-разработчик + ИИ</u></span>
<span class="article-banner__link">Узнать больше</span>
</a>
<div class="question">
<div class="container">
<div class="question__inner">
<div class="question__title">Понравилась статья?</div>
<a href="#" data-cur-url="/media/code/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya/"
class="question__btn js-modalLink" data-mfp-src="#modalAuth">Да</a>
</div>
</div>
</div>
</div>
<span
data-area="article-bottom"
data-current-url="/media/code/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya/"
data-id="212098">
</span>
</div>
<script type="application/ld+json">
{"@context":"http:\/\/schema.org","@type":"Article","url":"https:\/\/skillbox.ru\/media\/code\/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya\/","headline":"\u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430, \u044d\u0442\u043e \u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0434\u043e: DRY, KISS, SOLID, YAGNI \u0438\u00a0\u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f","articleSection":"\u041a\u043e\u0434","articleBody":"\r\n \r\n\u0424\u0435\u0440\u043d\u0430\u043d\u0434\u043e \u0414\u043e\u043b\u044c\u043e \r\n(Fernando Doglio) \r\n----------------------\r\n\r\n\r\n\r\n\r\n\u041e\u0431 \u0430\u0432\u0442\u043e\u0440\u0435 \r\n\r\n\r\n\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u043d\u0430 Medium. \u041f\u0438\u0448\u0435\u0442 \r\n\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u043e\u0431\u0440\u0430\u0437\u0435 \u0436\u0438\u0437\u043d\u0438, \u043b\u0438\u0447\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0438 \u043c\u043d\u043e\u0433\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c. \r\n----------------------\r\n\r\n\r\n\r\n\r\n\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \r\n\r\n\r\nKISS, SOLID, YAGNI And Other Fun Acronyms \r\n \r\n----------------------\r\n\r\n\r\n\r\n\r\n\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \r\n\r\n\r\n\u0420\u0443\u0441\u043b\u0430\u043d \u0413\u0430\u0434\u0436\u0438\u0435\u0432 \r\n----------------------\r\n\r\n\r\n\u0417\u0430 17 \u043b\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u044f \u043a\u0430\u043a\u0438\u0445 \r\n\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043d\u0435 \u043f\u043e\u0432\u0438\u0434\u0430\u043b \u2014 \u0438 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445, \u0438 \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0445. \u0414\u0430 \u0438, \u0435\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u0432\u0441\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u041e\u0434\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0442 \u0440\u0435\u0447\u044c \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, MVP \u0438\u043b\u0438 PoC (\u044f\u0441\u043d\u043e \u0436\u0435, \u0447\u0442\u043e, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0438\u0445, \u043d\u0438\u043a\u0442\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0443\u0441\u0435\u0440\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u043b). \u0414\u0440\u0443\u0433\u0438\u0435 \u0435\u0449\u0451 \u0438 \u0437\u0432\u0443\u0447\u0430\u0442 \u0437\u0430\u0431\u0430\u0432\u043d\u043e: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, SOLID, DRY \u0438 KISS. \r\n\r\n\u0412\u043e\u043e\u0431\u0449\u0435, \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440 \u0432 \u0441\u043b\u0435\u043d\u0433\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \r\n\u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0437\u043e\u0440 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 (\u0438 \u043f\u0430\u0440\u043e\u0447\u043a\u0438 \u2014 \u043c\u0435\u043d\u0435\u0435) \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u043f\u043e\u0434\u0437\u0430\u0431\u044b\u043b\u0438, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442. \r\n\r\nDRY \r\n\r\n\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \r\n\u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437. DRY (\u0430\u043d\u0433\u043b. dry \u2014 \u0441\u0443\u0445\u043e\u0439, \u0441\u0443\u0448\u0438\u0442\u044c) \u2014 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041e\u043d \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a Don\u2019t repeat yourself \u2014 \u00ab\u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439\u0442\u0435\u0441\u044c\u00bb. \r\n\r\n\u041a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u0434, \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \r\n\u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0435\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0435\u0447\u044c \u043d\u0435 \u0438\u0434\u0451\u0442 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u2014 \u044f \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u0443\u044e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0442\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0431\u0449\u0438\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u043b\u0438 \u0432\u044b \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u044c, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. \r\n\r\n\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, don\u2019t repeat yourself, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435? \r\n\r\n\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432\u0441\u0435\u0433\u0434\u0430, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \r\n\u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438\u043b\u0438 \u044f\u0437\u044b\u043a\u0430. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u0435\u0437 \u043d\u0443\u0436\u0434\u044b, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u0435\u0451 \u0438 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \r\n\r\n\r\n\r\n\u041b\u0430\u0439\u0444\u0445\u0430\u043a: \u043f\u0440\u0438\u043d\u0446\u0438\u043f DRY \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \r\n\u043e\u0434\u043d\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Bit (\u0432\u043e\u0442 \u0435\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430 GitHub ). \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Node.js, TypeScript, React, Vue.js, Angular \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438. \r\n \r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 React \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e bit.dev \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Bit.dev \/ Skillbox Media \r\n\r\nKISS \r\n\r\n\u042d\u0442\u0430 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0430 (\u0430\u043d\u0433\u043b. kiss \u2014 \u043f\u043e\u0446\u0435\u043b\u0443\u0439, \r\n\u0446\u0435\u043b\u043e\u0432\u0430\u0442\u044c) \u043c\u043d\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u2014 \u043a\u0430\u043a \u043f\u043e \u0444\u043e\u0440\u043c\u0435, \u0442\u0430\u043a \u0438 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e: Keep it simple, stupid (\u00ab\u0421\u0434\u0435\u043b\u0430\u0439 \u044d\u0442\u043e \u043f\u0440\u043e\u0449\u0435, \u0442\u0443\u043f\u0438\u0446\u0430\u00bb) \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0443\u043f\u0438\u0446\u0435\u0439, \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 Keep it stupid simple (\u00ab\u041f\u0443\u0441\u0442\u044c \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0434\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u044f\u00bb), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u043c\u044b\u0441\u043b \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \r\n\r\n\u0420\u0435\u0448\u0430\u044f \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \r\n\u0443\u0432\u043b\u0435\u0447\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0430\u043c \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0448\u044c, \u043a\u0430\u043a \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u043b\u0441\u044f \u043e\u0432\u0435\u0440\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u043e\u043c \u0438\u043b\u0438, \u043a\u0430\u043a \u044f \u043b\u044e\u0431\u043b\u044e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c, \u0432\u043e\u0432\u0441\u044e \u043f\u0430\u043b\u0438\u0448\u044c \u0438\u0437 \u043f\u0443\u0448\u043a\u0438 \u043f\u043e \u0432\u043e\u0440\u043e\u0431\u044c\u044f\u043c. \u0417\u0430\u0434\u0430\u0447\u0430 \u0432 \u0438\u0442\u043e\u0433\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0430 \u2014 \u043d\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0438\u0437\u044f\u0449\u043d\u0435\u0435. \r\n\r\n\u041d\u0435 \u0441\u043f\u043e\u0440\u044e, \u0431\u044b\u0432\u0430\u044e\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \r\n\u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0430\u0434\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u0435\u0431\u044f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f KISS. \r\n\r\n\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0432\u0430\u0448\u0438 \r\n\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438. \u0425\u0432\u0430\u0442\u0438\u0442 \u043b\u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u0432\u0430\u0448\u0438\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u0432 \u043d\u0438\u0445 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f? \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0442 \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a, \u0434\u0430 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0449\u0435. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e KISS! \r\n\r\nSOLID \r\n\r\n\u042d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \r\n\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u043e \u0442\u0430\u043a: \r\n\r\n- Single responsibility principle (\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \r\n\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438). \r\n- Open-closed principle (\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438\/\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438). \r\n- Liskov substitution principle (\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \r\n\u041b\u0438\u0441\u043a\u043e\u0432). \r\n- Interface segregation principle (\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \r\n\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430). \r\n- Dependency inversion principle (\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439). \r\n\r\n\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \r\n\u0432 \u043e\u0434\u043d\u043e\u043c (\u0430\u043d\u0433\u043b. solid \u2014 \u0442\u0432\u0451\u0440\u0434\u044b\u0439, \u043f\u043b\u043e\u0442\u043d\u044b\u0439, \u043f\u0440\u043e\u0447\u043d\u044b\u0439). \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. 1. Single responsibility principle, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \r\n\r\n\u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \r\n\u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \r\n\r\n\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 *NIX-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u043c\u0438 \r\n\u043a\u0430\u043a \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u044b Linux, macOS \u0438 \u043f\u0440\u043e\u0447\u0438\u0435, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0438\u043c\u0435\u043b\u0438 \u0434\u0435\u043b\u043e \u0441 \u0438\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 ls \u0438\u043b\u0438 cd. \u041e\u043d\u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 SRP \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u0437\u0430\u0434\u0430\u0447\u0438 (\u0441\u043a\u0430\u0436\u0435\u043c, \u043c\u0435\u043d\u044f\u044e\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0451 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e). \u0412\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0430 \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447 (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u2014 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0451 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e). \u042d\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f UNIX-way. \r\n\r\n\u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \r\n\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u0432\u043e\u0434\u044b \u0438 \u0432\u044b\u0432\u043e\u0434\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e. \r\n\r\n\u0418 \u0445\u043e\u0442\u044c \u044f \u0438 \u0433\u043e\u0432\u043e\u0440\u044e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \r\n\u043f\u0440\u0438\u043d\u0446\u0438\u043f SRP \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e \u0432\u0441\u0435\u043c\u0443. \u0412\u0437\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0415\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0435\u0433\u0430\u043c\u043e\u0434\u0443\u043b\u044f, \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430 \u0432\u0441\u0451, \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u044e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u041d\u043e \u2014 \u0435\u0449\u0451 \u0440\u0430\u0437 \u2014 \u0442\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043b\u0435\u0433\u0447\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c. \r\n\r\n\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f getUserAndRelatedBooks, \r\n\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u0432\u0443\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: getUser \u0438 getUsersBooks, \u0433\u0434\u0435 \u0432\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439. \u0422\u0430\u043a \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u044f\u0449\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c getUserAndRelatedBooks, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0432 getUsersBooks (getUser), \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u0438\u0445 \u0432 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e. 2. Open-closed principle, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438\/\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438 \r\n\r\n\u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0448\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u043b\u0438 \r\n\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0434) \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f), \u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u0438\u0431\u043e \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e \u043d\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0447\u0443\u0436\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c). \r\n\r\n\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \r\n\u0432 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u2014 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u0432\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u043b\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438-\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438! :) \r\n\r\n\u0412\u043e\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \r\n\u043a\u043e\u0434 [ https:\/\/gist.github.com\/deleteman\/2ca52b9ddeb3a0bc9cdd105c486d6d41#file-non-open-mod-js ] \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0433\u043e\u0440\u043e\u0434, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0444\u0430\u0439\u043b \u0438 \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 knownCities. \r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media \r\n\r\n\u0410 \u0432\u043e\u0442 \u043a\u0430\u043a [ https:\/\/gist.github.com\/deleteman\/902d596a2e63b730bc8a4acbd3148cac#file-open-closed-mod-js ] \r\n\u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u0441\u043e\u0431\u043b\u044e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438\/\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0441\u0442\u0438. \r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media \r\n\r\n\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 addValidCity \u043c\u043e\u0436\u043d\u043e \r\n\u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b. 3. Liskov substitution principle, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u041b\u0438\u0441\u043a\u043e\u0432 \r\n\r\n\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f, \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u0430\u043a LSP, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \r\n\u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442 \u043d\u0430\u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0442\u0435\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0438\u043b\u044c\u043d\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0451 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0448\u0443 \u0441\u0443\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \r\n\r\n\r\n\r\n\u0424\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \r\n\u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0442\u0438\u043f\u044b \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044f \u043e\u0431 \u0438\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438. \r\n\r\n\u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430, \u0447\u0442\u043e \u043c\u044b \u0437\u0434\u0435\u0441\u044c \r\n\u044f\u0432\u043d\u043e \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u041e\u041e\u041f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \r\n\r\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 [ https:\/\/gist.github.com\/deleteman\/5a08bff5b0964e663ea20dd36958bdce#file-lsp-sample1-js ] \r\n. \u0412 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u0438 \u0434\u043b\u0438\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media \r\n\r\n\u0412 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0442\u0443\u0442 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430: \u043c\u0435\u0442\u043e\u0434\u044b setWidth \r\n\u0438 setHeight \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442, \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0438\u0437 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u0430 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e. \u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u041b\u0438\u0441\u043a\u043e\u0432. \r\n\r\n\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, LSP \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \r\n\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u0422\u0430\u043a \u0447\u0442\u043e, \u043a\u0430\u043a \u0431\u044b \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u043e\u043d \u0434\u043b\u044f \u0432\u0430\u0441 \u043d\u0438 \u0437\u0432\u0443\u0447\u0430\u043b, \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e \u043d\u0451\u043c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0441\u0442\u043e\u0438\u0442. 4. Interface segregation principle, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \r\n\r\n\u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \r\n\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 \u0432\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u0412\u0435\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 TypeScript) \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u044b \u0432\u0430\u0448\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u2014 \u0438 \u043d\u0435 \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043a\u0443\u0447\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\u0442\u0435. \r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media \r\n\r\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 [ https:\/\/gist.github.com\/deleteman\/68a7929b476b80750071774b8490e725#file-bad-interface-ts ] \r\n. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 MyModule \u043a\u043e\u043c\u0443-\u0442\u043e \u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b close \u0438 open, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 IE8, \u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0437 \u0442\u0440\u0451\u0445 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u0434\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f. \r\n\r\n\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \r\n\u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u043e \u0441 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c. \u0421\u043e\u0431\u043b\u044e\u0434\u0430\u044f \u0435\u0433\u043e, \u043e\u0442\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u2014 \u043f\u0443\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u044e\u0442, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. 5. Dependency inversion principle, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \r\n\r\n\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e SOLID \u0437\u0430\u043c\u044b\u043a\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438, \r\n\u0438\u043b\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \r\n\r\n\u041f\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0435 \u043e\u043d \u0437\u0432\u0443\u0447\u0438\u0442 \u0442\u0430\u043a: \r\n\r\n- \u041c\u043e\u0434\u0443\u043b\u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \r\n\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0438\u0436\u043d\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439. \u041e\u0431\u0430 \u0442\u0438\u043f\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439. \r\n- \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0434\u0435\u0442\u0430\u043b\u0435\u0439. \r\n\u0414\u0435\u0442\u0430\u043b\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439. \r\n\r\n\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \r\n\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043c\u043e\u043a \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 [ https:\/\/gist.github.com\/deleteman\/40e0372a2b75c1404ad0cc334efd7a05#file-no-dep-injection-js ] : \r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media \r\n\r\n\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \r\n\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e saveUser \u0432\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0435. \u0415\u0441\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043d\u0435\u0439. \r\n\r\n\u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \r\n\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043c\u043e\u043a \u0434\u0430\u043b\u044c\u0448\u0435 [ https:\/\/gist.github.com\/deleteman\/b83cd8608df737e42ae0faaecc304576#file-injected-db-js ] : \r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media \r\n\r\n\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \r\n\u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043d\u0430 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f, \u043e\u043d \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \r\n\r\n\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u2014 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \r\n\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u0435\u043d \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0430\u0436\u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \r\n\r\nYAGNI \r\n\r\n\u041f\u0440\u0438\u043d\u0446\u0438\u043f, \u0438\u043d\u0430\u0447\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u0430\u043a You ain\u2019t gonna \r\nneed it (\u00ab\u0412\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f\u00bb), \u043f\u0440\u0438\u0448\u0451\u043b \u0438\u0437 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0435\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u0430. \r\n\r\n\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Agile-\u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0439 \r\n\u043d\u0443\u0436\u043d\u043e \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043e\u043f\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0447\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u2014 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0438\u0434\u0435\u044f, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043b\u0430\u043d\u044b. \r\n\r\n\u0427\u0442\u043e \u044f \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443, \u0433\u043e\u0432\u043e\u0440\u044f \u043f\u0440\u043e \u0441\u043c\u0435\u043d\u0443 \r\n\u043f\u043b\u0430\u043d\u043e\u0432? \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 Agile \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0438\u0434\u0431\u044d\u043a \u0443\u0436\u0435 \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0432\u0430\u043c \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439? \r\n\r\n\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043c\u0435\u0447\u0443 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \r\n\u043c\u0435\u0442\u043e\u0434\u044b \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0433\u0434\u0435 \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0447\u0451\u0442\u043a\u043e \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043b\u0430\u043d\u0430, \u043f\u0440\u0438\u043d\u0446\u0438\u043f YAGNI \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c. \r\n\r\nBDUF \r\n\r\n\u0418 \u0440\u0430\u0437 \u0443\u0436 \u043c\u044b \u0437\u0430\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e\u0439 \r\n\u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 Big design up front (\u00ab\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u043e\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e\u00bb), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0451 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u041e\u043d \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0442\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u044b \u0442\u0440\u0430\u0442\u0438\u0442\u0435 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. \r\n\r\n\u0421\u0430\u043c\u0430 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \r\n\u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0451 \u2014 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \r\n\r\n\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0430\u043a \u0438 \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \r\n\u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432, \u0443 BDUF \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0438. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043a\u043b\u043e\u043d\u043d\u044b \u043d\u0430\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a\u0438 \u0433\u0438\u0431\u043a\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0439 \u2014 \u043e\u043d\u0438 \u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442, \u0447\u0442\u043e \u0432 \u043c\u0438\u0440\u0435 \u043f\u043e\u0431\u0435\u0434\u0438\u0432\u0448\u0435\u0433\u043e Agile \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d. \r\n\r\nSoC \r\n\r\nSeparation \u043ef concerns (\u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438) \u2014 \r\n\u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0438\u043b\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \r\n\r\n\u041d\u0435 \u043f\u0443\u0442\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0441 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0438\u043c\u0441\u044f \r\nSingle responsibility principle (\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438). SoC \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043d\u043e\u0433\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 \u0430 \u0442\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0438 \u0431\u044b\u0432\u0430\u0435\u0442 \u2014 \u043c\u043e\u0436\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440: \u0431\u043b\u043e\u0433-\u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0430, \u0433\u0434\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \r\n\u043c\u043e\u0433\u0443\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u044b. \u041e\u0434\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u0432\u0441\u0451 (\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u043f\u043e\u0441\u0442\u044b \u0432 \u0431\u043b\u043e\u0433\u0435, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435) \u2014 \u0438 \u0434\u0430\u0436\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 SoC, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0439\u0442\u0438 \u043a \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e: \r\n \r\n\u0418\u043d\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0430: \u041c\u0430\u0439\u044f \u041c\u0430\u043b\u044c\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Skillbox Media \r\n\r\n\u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u0443\u0431\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e \u0441\u0443\u0442\u044c \r\n\u0442\u0430\u043a\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u043b\u0438\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044f\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435: \r\n\r\n- \u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \r\n\u0431\u043b\u043e\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (User management) \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439. \r\n- \u0412\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043b\u0435\u0433\u0447\u0435: \u0441\u0432\u044f\u0437\u044c \r\n\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430 \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u0430, \u0438 \u0432\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0447\u0443\u0442\u044c \u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430\u043c\u0438, \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b. \r\n- \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439. \r\n\u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c. \u0421 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \r\n\r\nSoC \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \r\nAPI, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e. \u0415\u0433\u043e \u0441\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u0438 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c. \r\n\r\nMVP \r\n\r\n\u0415\u0441\u043b\u0438 \u043e\u0442\u043e\u0439\u0442\u0438 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \r\n\u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u0439 \u043e\u0442\u0440\u0430\u0441\u043b\u0438. MVP \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 Minimum viable product (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442) \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0438 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043b\u0438 \u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \r\n\r\n\u042d\u0442\u0438\u043c \u043f\u0440\u0438\u0451\u043c\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043f\u043b\u043e\u0448\u044c \u0438 \u0440\u044f\u0434\u043e\u043c \u2014 \r\n\u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u0434\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u043e \u0443\u043c\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f MVP \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c. \r\n\r\nPoC \r\n\r\n\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 MVP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e\u0433\u043e \r\n\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, Proof of concept (\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438) \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0435\u0433\u043e \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0434\u043e MVP \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u043f\u0440\u043e\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \r\n\r\n\u041f\u043e \u0441\u0443\u0442\u0438, PoC \u2014 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0440\u0430\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \r\n\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0415\u0433\u043e \u043f\u0438\u0448\u0443\u0442 \u043d\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c PoC \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0438\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0431\u044b\u0432\u0430\u0435\u0442, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e PoC. \u041a\u043e\u0440\u043f\u0435\u0442\u044c \u043d\u0430\u0434 \u043d\u0438\u043c\u0438 \u0432\u0441\u0435\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u0434\u0438\u043d \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u2014 \u0442\u0430\u043a \u0441\u0435\u0431\u0435 \u0438\u0434\u0435\u044f. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043d\u043e\u043a\u043e\u0434\u044f\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u043d\u0435 \u0436\u0430\u043b\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c. \r\n\r\n\u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f PoC \u2014 \r\n\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0440\u0430\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u042d\u0442\u043e \u043a\u0430\u043a \u0416\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0427\u0435\u043b\u043e\u0432\u0435\u043a \u0438 \u0435\u0433\u043e \u0431\u0440\u043e\u043d\u044f Mark I : \u043e\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430, \u043d\u0430 \u0447\u0442\u043e \u043e\u043d \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0443\u0433\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043a\u0442\u043e\u0440; \u0430 Mark II \u0431\u044b\u043b\u0430 \u0443\u0436\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 \u043b\u0443\u0447\u0448\u0435. \r\n\r\n\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \r\n\r\n\u0412\u0441\u0435 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0432 \u044d\u0442\u043e\u0439 \r\n\u0441\u0442\u0430\u0442\u044c\u0435, \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u0445 \u0438 \u043c\u0430\u043d\u0443\u0430\u043b\u0430\u0445 \u0438\u043b\u0438 \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043e\u0442 \u043a\u043e\u043b\u043b\u0435\u0433. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0445 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c. \r\n\r\n\r\n\r\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435: \r\n\r\n- \u041a\u0430\u043a \u043d\u043e\u0432\u0438\u0447\u043a\u0443 \u0438\u0441\u043a\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 IT \u0438 Digital \r\n \r\n- \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 JavaScript \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d \r\n \r\n- \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u0442\u0443\u043f\u043e\u0432: \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \r\n\u0432\u0451\u0440\u0441\u0442\u043a\u0443 \u0433\u0438\u0431\u043a\u043e\u0439 \u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a ","author":{"@type":"Person","name":"\u0420\u0443\u0441\u043b\u0430\u043d \u0413\u0430\u0434\u0436\u0438\u0435\u0432","url":"https:\/\/skillbox.ru\/media\/authors\/ruslan-gadsjiev\/"},"publisher":{"@type":"Organization","name":"Skillbox","logo":{"@type":"ImageObject","url":"https:\/\/skillbox.ru\/static\/images\/skillbox.png"}},"mainEntityOfPage":{"@type":"WebPage","url":"https:\/\/skillbox.ru\/media\/code\/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya\/"},"datePublished":"2022-06-06T09:00:00Z","dateModified":"2023-08-09T14:21:08Z","image":{"@type":"ImageObject","url":["https:\/\/248006.selcdn.ru\/main\/iblock\/bf5\/bf510ec283bc3c552d62f262833ad77e\/1be61be44a90e687874120073358cf5d.png"]},"description":"\u042d\u0442\u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043a\u0430\u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0438\u043c\u0435\u043d\u0430 \u0438\u0441\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0430\u0434\u043c\u0438\u0440\u0430\u043b\u0430 \u042f\u043c\u0430\u043c\u043e\u0442\u043e."}
</script><script data-skip-moving="true" id="FiMjZmipVK5U4ODg">if (window.relap) window.relap.ar('FiMjZmipVK5U4ODg');</script> </div>
<script>
window.Section_id = 10;
</script>
</div>
</main>
<footer class="without-buttons">
<div class="footer__wrapper container">
<div class="footer__firstgroup">
<section class="footer__contactbox">
<address class="footer__contacts">
<p class="footer__contacts-block">
<a class="footer__phone link" href="tel:+74951540915">8 (800) 500-05-22</a>
<span class="footer__phone-caption">Контактный центр</span>
</p>
<p class="footer__contacts-block">
<a class="footer__phone link" href="tel:+74952915987">+7(495) 291-59-87</a>
<span class="footer__phone-caption">Отдел заботы о пользователях</span>
</p>
<p class="footer__address"> Москва, Ленинский проспект, дом 6, строение 20</p>
</address>
<ul class="social-contacts footer__social">
<li>
<a class="social-contacts__item" href="https://vk.com/skillbox_education"
aria-label="Вконтакте">
<img src="/static/images/footer/soc_vk.svg"/>
</a>
</li>
<li>
<a class="social-contacts__item"
href="https://www.youtube.com/channel/UC2FJq-Rr7v4SlKAoM7x0ZhA" aria-label="YouTube">
<img src="/static/images/footer/soc_tube.svg"/>
</a>
</li>
<li>
<a class="social-contacts__item" href="tg://resolve?domain=skillboxru"
aria-label="Telegram">
<img src="/static/images/footer/soc_tg.svg"/>
</a>
</li>
</ul>
<div class="footer__age-limit">
16+
</div>
</section>
<section class="footer__rewardbox">
<ul class="rewards footer__rewards">
<li>
<span class="rewards__item">
<img src="/static/images/footer/footer_runet.svg" alt=""/>
<span>Премии Рунета</span>
<span>2018, 2019, 2020</span>
</span>
</li>
</ul>
</section>
</div>
<section class="footer__linksbox">
<ul class="links__list links__list--courses">
<li class="links__item links__item--header">Все направления</li>
<li class="links__item"><a href="/code/?utm_source=media&utm_medium=button&utm_campaign=footerlink_code&utm_term=footer">Программирование</a></li>
<li class="links__item"><a href="/design/?utm_source=media&utm_medium=button&utm_campaign=footerlink_design&utm_term=footer">Дизайн</a></li>
<li class="links__item"><a href="/marketing/?utm_source=media&utm_medium=button&utm_campaign=footerlink_marketing&utm_term=footer">Маркетинг</a></li>
<li class="links__item"><a href="/management/?utm_source=media&utm_medium=button&utm_campaign=footerlink_management&utm_term=footer">Управление</a></li>
<li class="links__item"><a href="/games/?utm_source=media&utm_medium=button&utm_campaign=footerlink_gamedev&utm_term=footer">Игры</a></li>
<li class="links__item"><a href="/multimedia/?utm_source=media&utm_medium=button&utm_campaign=footerlink_multimedia&utm_term=footer">Мультимедиа</a></li>
<li class="links__item"><a href="/psychology/?utm_source=media&utm_medium=button&utm_campaign=footerlink_psychology&utm_term=footer">Психология</a></li>
<li class="links__item"><a href="/general-development/?utm_source=media&utm_medium=button&utm_campaign=footerlink_general-development&utm_term=footer">Общее развитие</a></li>
<li class="links__item"><a href="/engineering/?utm_source=media&utm_medium=button&utm_campaign=footerlink_engineering&utm_term=footer">Инженерия</a></li>
<li class="links__item"><a href="/english/?utm_source=media&utm_medium=button&utm_campaign=footerlink_english&utm_term=footer">Английский язык</a></li>
<li class="links__item"><a href="/other/?utm_source=media&utm_medium=button&utm_campaign=footerlink_other&utm_term=footer">Другое</a></li>
</ul>
<ul class="links__list links__list--about">
<li class="links__item links__item--header">О Skillbox</li>
<li class="links__item"><a href="/company/?utm_source=media&utm_medium=button&utm_campaign=footerlink_aboutskillbox&utm_term=footer">О Платформе</a></li>
<li class="links__item"><a href="/career/?utm_source=media&utm_medium=button&utm_campaign=footerlink_careercentr&utm_term=footer"> Центр карьеры</a></li>
<li class="links__item"><a href="/otzyvy/?utm_source=media&utm_medium=button&utm_campaign=footerlink_testimonials&utm_term=footer">Отзывы</a></li>
<li class="links__item"><a href="/contacts/?utm_source=media&utm_medium=button&utm_campaign=footerlink_skillboxcontacts&utm_term=footer">Контакты</a></li>
<li class="links__item"><a href="/jobs/?utm_source=media&utm_medium=button&utm_campaign=footerlink_jobs&utm_term=footer">Вакансии</a></li>
<li class="links__item"><a href="/teachers/?utm_source=media&utm_medium=button&utm_campaign=footerlink_school&utm_term=footer">Школа кураторов</a></li>
<li class="links__item"><a href="/sale/free/?utm_source=media&utm_medium=button&utm_campaign=footerlink_free&utm_term=footer">Бесплатно</a></li>
<li class="links__item"><a href="/media/topic/tests/?utm_source=media&utm_medium=button&utm_campaign=footerlink_tests&utm_term=footer">Онлайн-тесты</a></li>
</ul>
<ul class="links__list links__list--webinar">
<li class="links__item links__item--header">Вебинары</li>
<li class="links__item"><a href="https://live.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_webinars&utm_term=footer" target="_blank" rel="noopener">Все вебинары</a></li>
<li class="links__item"><a href="https://live.skillbox.ru/playlists/?utm_source=media&utm_medium=button&utm_campaign=footerlink_playlists&utm_term=footer" target="_blank" rel="noopener">Плейлисты</a></li>
<li class="links__item"><a href="https://live.skillbox.ru/calendar/?utm_source=media&utm_medium=button&utm_campaign=footerlink_schedule&utm_term=footer" target="_blank" rel="noopener">Расписание</a></li>
</ul>
<ul class="links__list links__list--last">
<li class="links__item links__journal"><a href="/media/" target="_blank" rel="noopener">Медиа</a></li>
<li class="links__item"><a href="https://partners.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_partners&utm_term=footer" target="_blank" rel="noopener">Партнерская программа</a></li>
<li class="links__item"><a href="https://b2b.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_b2b&utm_term=footer" target="_blank" rel="noopener">Корпоративным клиентам</a></li>
<li class="links__item"><a href="https://career.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_employees&utm_term=footer" target="_blank" rel="noopener">Для работодателей</a></li>
</ul>
</section>
</div>
<div class="footer__underline container">
<span class="footer__copy">
© Skillbox, 2026 </span>
<div>
<span class="footer__oferta">
<a href="/oferta.pdf" target="_blank">Договор оферты</a>
</span>
<span class="footer__payment">
<a href="/payments/" target="_blank">Оплата</a>
</span>
<span class="footer__use-policy">
<a href="/terms_of_use.pdf" target="_blank">Правила пользования Платформой</a>
<a href="/privacy_policy.pdf" target="_blank">Политика конфиденциальности</a>
</span>
</div>
</div>
</footer>
<div class="cookies">
<p class="cookies__desc">
Пользуясь нашим сайтом, вы соглашаетесь с тем, что
<a href="https://skillbox.ru/privacy_policy.pdf" target="_blank" rel="noopener"
type="application/pdf">мы используем cookies</a> 🍪
</p>
<button type="button" class="cookies__button">
Окей
</button>
</div>
<div class="subscribe-popup subscribe">
<div class="subscribe-popup__spacer-mobile"></div>
<div class="subscribe-popup__row-content ">
<button class="subscribe__close"></button>
<div class="subscribe__content">
<div data-subscribe-popup-success class="hidden">
<h2 class="subscribe__header-success">Спасибо за подписку! Забирайте 5 бесплатных курсов:</h2>
<ul class="subscribe__list-block">
<li>Найти себя в IT за 5 дней</li>
<li>Как найти себя в дизайне в 2025 году</li>
<li>Интерьеры, мебель, ландшафт и декорирование</li>
<li>Интернет-маркетинг на практике</li>
<li>Бизнес-аналитик, продакт- и проджект-менеджер</li>
</ul>
<div class="subscribe__btns-el">
<a
target="_blank"
href="https://refer.id/?bot=skillbox_main_bot&platform=telegram&verbose_name=Skillbox&bot_avatar=https://designer.ftrcdn.com/uploads/bot_avatars/medium_54ab1ce8c393eb3df1474846ce0a0e2c.png&n=137050&c=9209&bc_number=890&?utm_source=media&utm_medium=&utm_campaign=all_all_media_banners_invite_sbornik-890_all_bot_skillbox"
class="subscribe__el-btn">Получить доступ</a>
</div>
</div>
<div data-subscribe-popup-content>
<h2 class="subscribe__header">У нас есть классные рассылки!</h2>
<form action="/media/code/eto-klassika-eto-znat-nado-dry-kiss-solid-yagni-i-drugie-poleznye-sokrashcheniya/" class="newsletter-form page-subscription__form3" data-type="popup">
<input type="hidden" name="action" value="subscribe">
<div class="subscribe__checkboxes"></div>
<div class="subscribe__email email_popup">
<input class="subscribe-form__input" type="text" name="email" placeholder="Email" >
<span class="subscribe-form__label-name">Электронная почта</span>
<button type="submit" class="popup-btn-click">Подписаться</button>
<span class="email__error">Поле необходимо заполнить</span>
</div>
<div class="subscribe-popup__checkbox-end">
<div class="subscribe-popup__checkbox-item" data-checkbox-personal-data>
<div class="subscribe__checkbox">
<input type="checkbox" name="agreements[PERS]" id="isCheckTrue" value="1" data-checkbox-personal-data-input>
<label for="isCheckTrue"><span>Я согласен на <a target="_blank" href="https://skillbox.ru/legal-docs/chou/file/privacy_policy/version-290425.pdf">обработку персональных данных</a></span></label>
</div>
<span class="email__error">Нужно ваше согласие</span>
</div>
<div class="subscribe__bottom">
<span>Нажимая на кнопку, я соглашаюсь с <a target="_blank" href="https://skillbox.ru/legal-docs/skillbox/file/terms_of_use/version-300824.pdf">правилами пользования Платформой</a></span>
</div>
<div class="subscribe-popup__checkbox-item" data-checkbox-personal-data-two>
<div class="subscribe__checkbox subscribe__checkbox--end" >
<input type="checkbox" name="agreements[ADS]" id="isAdsCalls" value="1" checked="" data-checkbox-personal-data-input-two>
<label for="isAdsCalls">Я согласен <a target="_blank" href="https://skillbox.ru/legal-docs/chou/file/soglasie-na-poluchenie-reklamy.pdf">получать рекламу и звонки</a></label>
</div>
<span class="email__error">Нужно ваше согласие</span>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- src="/static/images/articles/subscribe-popup-img.png" -->
</div>
<div class="bg-modal-overlay bg-modal-overlay--transparent"></div>
<script data-skip-moving="true" id="popup__data--formatted">
$(".popup-btn-click").on("click" , function (){
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
let input = $(this).closest(".subscribe__email").find(".subscribe-form__input");
let inputValue = input.val();
if(emailPattern.test(inputValue)) {
(window["rrApiOnReady"] = window["rrApiOnReady"] || []).push(function() { rrApi.setEmail(inputValue);});
}
});
/*
window.popupData = {
"8": {
header: 'У нас есть классные рассылки про дизайн!!!',
category: 'Дизайн',
checkboxes: [
'Лучшие статьи про Дизайн',
'«Типографика без боли»'
]
},
"10": {
header: 'У нас есть классные рассылки про код',
category: 'Код',
checkboxes: [
'Лучшие статьи про Код и Людей кода',
'«Жизнь без багов»'
]
},
"18": {
category: 'Геймдев',
checkboxes: []
},
"21": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Бизнес',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"9": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Маркетинг',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"11": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Управление',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"17": {
category: 'Развитие',
checkboxes: []
},
"22": {
header: 'У нас есть классные рассылки про образование',
category: 'Образование',
checkboxes: [
'Лучшие статьи про Образование',
'«EdTech по полочкам»',
'«Мой успешный онлайн-курс»'
]
},
}
*/
window.popupData = {"header":"\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 - \u043d\u0430 \u043f\u043e\u0447\u0442\u0443!\u003Cbr\/\u003E\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438\u003Cbr\/\u003E\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 5 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432:","category":"\u041a\u043e\u0434","checkboxes":{"23":"\u041c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442","24":"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433","26":"\u041a\u043e\u0440\u043f. \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435","13":"\u0414\u0438\u0437\u0430\u0439\u043d","16":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","15":"\u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","17":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0433\u0440","18":"\u041f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e"},"code":"code","scroll":true};
window.subscribePopupShow = 1;
</script>
<div class="copied">
<img src="/static/images/articles/done-circle.svg" alt="" class="copied__icon">
<p class="copied__text">
Ссылка скопирована
</p>
</div>
<!-- <style>@font-face{font-display:swap;font-family:Graphik;font-weight:500;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Medium.woff2) format("woff2")}@font-face{font-display:swap;font-family:Graphik;font-weight:700;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Bold.woff2) format("woff2")}.universal-notice{box-sizing:border-box;text-decoration:none;display:none;min-height:48px;color:var(--banner-color);background-color:var(--banner-bg);overflow:hidden;font-family:Graphik,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-transition:opacity .25s ease-in-out;transition:opacity .25s ease-in-out}.universal-notice *{box-sizing:inherit}.universal-notice.universal-notice--active{display:block}.universal-notice--bitrix{z-index:1000}.universal-notice__wrapper{position:relative;-webkit-box-pack:start;justify-content:flex-start;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-left:12px;padding:4px 0}.universal-notice__title{position:relative;flex-shrink:0;width:132px;margin-right:27px;font-size:14px;line-height:20px;text-transform:uppercase}.universal-notice__timer{display:none;margin:0;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.universal-notice__button{flex-shrink:0;min-width:120px;padding:8px 12px;border-radius:25px;font-weight:500;font-size:12px;line-height:16px;color:#3925b7;text-align:center;text-transform:uppercase;background-color:#ffa6a6}@media (min-width:768px){.universal-notice{min-height:72px}.universal-notice__wrapper{-webkit-box-pack:center;justify-content:center;height:72px;margin:0}.universal-notice__title{width:252px;margin-right:32px;margin-left:20px;font-size:24px;line-height:32px}.universal-notice__button{min-width:200px;margin-right:20px;padding:14px 36px;font-size:16px;line-height:20px}}@media (min-width:768px) and (max-width:0px){.universal-notice{min-height:72px}.universal-notice__wrapper{-webkit-box-pack:center;justify-content:center;height:72px;margin:0}.universal-notice__title{width:252px;margin-right:32px;margin-left:20px;font-size:24px;line-height:32px}.universal-notice__button{min-width:200px;margin-right:20px;padding:14px 36px;font-size:16px;line-height:20px}}@media (min-width:1280px) and (max-width:0px){.universal-notice__wrapper{padding:0}.universal-notice__title{width:unset;margin-right:76px}.universal-notice__timer{flex-shrink:0;margin-right:32px;font-weight:700;font-size:24px;line-height:32px}.universal-notice__timer.js-universal-notice-active{display:-webkit-box;display:flex}.universal-notice__days{margin-right:5px}}@media (min-width:1280px){.universal-notice__wrapper{padding:0}.universal-notice__title{width:unset;margin-right:76px}.universal-notice__timer{flex-shrink:0;margin-right:32px;font-weight:700;font-size:24px;line-height:32px}.universal-notice__timer.js-universal-notice-active{display:-webkit-box;display:flex}.universal-notice__days{margin-right:5px}}</style>-->
</body>
</html>