🔥 1 квітня: почалось переднавчання
📅 1 травня: старт курсу
КупитиЦе розбір патернів і принципів програмування в контексті їх нативної реалізації в JavaScript і TypeScript.
Ми допоможемо вам опанувати суть та особливості реалізації кожного патерну і принципу, а також закріпимо це на практичних заняттях у малих групах.
Ви отримаєте code review, зворотний зв'язок та валідацію ваших знань від Тимура та команди досвідчених інженерів.
Ми розберемо якісні характеристики коду — такі як зрозумілість, семантичність, гнучкість, підтримуваність та ресурсоємність. Сфокусуємось на багатовимірному аналізі цих характеристик і пошуку їх оптимального балансу.
Це дозволить не лише отримувати задоволення від написання коду, а й спростить подальшу роботу з ним.
У процесі прикладної роботи ви накопичуєте досвід, який поступово перетворюється на внутрішні практики, принципи та підходи — часто навіть неусвідомлені. Під час навчання ви будете впізнавати знайомі методи, які вже використовували раніше, навіть не знаючи їхніх формальних назв чи визначень.
Наше завдання — допомогти вам зрозуміти, як ваш практичний досвід співвідноситься з фундаментальними підходами. Коли доречно застосовувати кожен патерн і чому ви інтуїтивно приходили до подібних рішень.
Патерни виступають у ролі спільної термінології, доступної всім учасникам процесу.
Навіть якщо хтось із команди не знайомий із конкретним патерном, він завжди може знайти його формальне визначення в інтернеті, уникнувши неоднозначного трактування ваших слів. Розуміння та використання патернів сприяє більш точній та стислій передачі інформації, а також зменшує ймовірність її неправильного сприйняття.
Чим менше часу ви витрачаєте на розробку та підтримку коду — тим більше часу залишається на вирішення реальних бізнес-проблем.
Чим ефективніше ви розв’язуєте прикладні задачі — тим вищою є ваша цінність для команди, компанії та ринку загалом. А отже — тим більшою стає і ваша професійна свобода.
З покращенням якості вашого коду та результатів роботи, колеги й роботодавці уважніше ставитимуться до вашої думки. Адже вона буде підкріплена не лише теоретичною базою, а й реальними практичними результатами.
Відеолекція на тему тижня.
Навчання займає до 2 годин на тиждень у зручний для вас час.
Тимур розбирає практичні приклади застосування знань та відповідає на запитання на тему тижня.
Початок — у понеділок або вівторок. Тривалість — 1 година.
Групова зустріч з ментором для аналізу коду та надання рекомендацій.
Дається ще тиждень на доопрацювання та здачу домашнього завдання
У малій групі від 5 до 10 осіб.
Тривалість зустрічі — від 50 до 100 хв.
Структура та модульність.
Чому важливо переосмислити та адаптувати GoF, SOLID і GRASP для сучасного JavaScript/TypeScript?
Як це зробити ефективно?
Завдання Unit-y 1:
🧩 Існує шлях, який веде до радикального покращення структури і характеристик коду. Ми розглянемо принципи і шаблони GoF, SOLID, GRASP, як їх застосовувати і що вони дають. Характеристики коду: читабельність, надійність, тестованість, підтримуваність, повторне використання, гнучкість, безпека. Оптимальне використання обчислювальних ресурсів: процесор, памʼять, введення-виведення і когнітивні ресурси розробників.
⭐ Характеристики коду і стратегії оптимізації, V8 машинерія, SOLID: SRP, SoC
⭐ GRASP принципи розподілу відповідальності
💡 Принципи SOLID
💡 Шаблони GoF
💡 Мономорфний і поліморфний код, inline-кеш, приховані класи в JavaScript
JavaScript має вбудовані контракти: Thenable, Iterable, AsyncIterator, Callback-last, Callable, Cancelable, Observable, але культура розробки через контракти і інтерфейси не дуже поширена в спільноті. Як покращити продуктивність розробки за допомогою підходу, заснованого на знаннях. Як шаблони можуть допомогти нам у цьому: реалізовувати нові фічі швидко і ефективно, бути продуктивними, робити щоденну роботу цікавою, бути вмотивованими і не вигорати.
⭐ Контракти Callback і Callback-last-error-first
⭐ Контракт Thenable
⭐ Контракти Iterator і AsyncIterator
⭐ Promise
💡 Патерн Спостерігач (Observer + Observable)
Породжувальні шаблони: Constructor, Singleton, Factory, Pool, Builder, Prototype, Flyweight, інші шаблони і техніки. Давайте знайдемо повʼязані принципи і переосмислимо прикладне значення GRASP: Creator; GRASP: Polymorphism, SOLID: ISP; Aggregation і Composition. Як економити памʼять та інші ресурси; як ефективно застосовувати оптимізацію і кешування.
Як розробляти надзвичайно швидкий код і мінімізувати latency, зробити код кросплатформним і зрозумілим для колег.
⭐ GRASP: 👉 Information Expert, Creator, Polymorphism
⭐ SOLID: Interface Segregation Principle (ISP)
⭐ Instantiation: Constructor, Factory Method, Object Pool
⭐ Decomposition, Instantiation, Encapsulation, Aggregation, Composition, Association, Delegation
⭐ GoF Creational Patterns: 👉 Builder, 👉 Prototype, 👉 Singleton, 👉 Flyweight
⭐ Патерн Revealing Constructor — відкритий конструктор
💡 Фабрики і пули обʼєктів
💡 Асоціація, агрегація і композиція обʼєктів
Separation of Concerns (SoC) — це загальний інженерний
принцип, спрямований на створення гнучких, надійних і легко
модифікованих систем. Ми можемо використовувати шаблони GoF:
Mediator, Bridge, Abstract Factory, Strategy (у
JavaScript-реалізації:
Map<PropertyKey, Implementation>
); Системи
модульності; GRASP принципи Information Expert, Indirection і
Protected Variations; SOLID: SRP. Це покращить тестованість
коду і знизить витрати на інтеграцію.
⭐ Структура застосунків: системи модульності, пакети і залежності
⭐ Шари і впровадження залежностей
⭐ GoF Patterns: 👉 Abstract Factory, 👉 Factory Method, 👉 Strategy, 👉 Pool
⭐ GRASP: Indirection principle, Protected Variations
💡 AsyncPool — Шаблон асинхронного програмування «Асинхронний пул»
Ми навчимося оптимізувати звʼязність і зчеплення між компонентами програмних систем і проєктувати їх таким чином, щоб вони були готові до колаборативної розробки великою кількістю учасників без конфліктів. Ми розберемося, як побудувати застосунок таким чином, щоб він був готовий обробити будь-який обсяг даних і був готовий зреагувати на всі можливі помилки та виняткові ситуації.
Патерни: Adapter (Wrapper), Facade, Bridge, Composite, Proxy, Promisify; Front controller; GRASP: Low Coupling and High Cohesion; SOLID: LSP (Liskov); і SOLID: OCP (Open-Closed). Застосування контрактів відкриває можливість поетапного рефакторингу, усунення технічного боргу і підвищення стабільності підсистем; зниження залежності (звʼязаності) між шарами і модулями. На рівні управління проєктом це дозволяє масштабувати команду, керувати пріоритетами і приймати архітектурні рішення.
⭐ Контрактне програмування
⭐ Layers and Low Coupling на прикладі конфига і транспорту
⭐ GoF: 👉 Adapter, 👉 Proxy, 👉 Facade, 👉 Composite
⭐ GRASP: Зчеплення і звʼязаність — Coupling and Cohesion
💡 SOLID: Принцип підстановки Барбари Лісков (Liskov substitution principle, LSP)
💡 Семінар з адаптерів для Node.js і асинхронного програмування
Наступний підхід — це застосування шин подій всередині застосунку і між підсистемами. Це поширено в користувацьких інтерфейсах, розподілених системах, спільному доступі до розділюваних ресурсів. На основі асинхронного і подієвого програмування побудовано рішення з не блокувальним введенням-виведенням у Node.js. Ми розглянемо GRASP: Pure Fabrication і Low Coupling; AsyncQueue, Async collections та інші.
⭐ Події: EventTarget, EventEmitter
⭐ GRASP: Чиста вигадка — Pure Fabrication
💡 GoF: Патерн Спостерігач (Observer + Observable)
💡 Фази Event-loop у V8 і Node.js
💡 Стрім з розбором Event loop і асинхронності
Реактивне програмування розвинулося в окрему парадигму; потоки і сигнали ґрунтуються на GoF: Observer; GRASP: Pure Fabrication і подієвому підході з потоками даних та операторами перетворення даних. Це широко використовується в мережевих протоколах, доступі до даних і файлових систем, розробці ігор, фінансових і аналітичних системах, керуванні вбудованими системами, телеметрії та інших галузях. Це дає виразний синтаксис, вищий рівень абстракції, гнучкість і продуктивність для покращення користувацького досвіду.
⭐ Стріми: Readable, Writable, Transform, відкритий конструктор, буферизація, backpressure
💡 Асинхронність на RxJS і потоки подій
💡 Робота з файлами, буферами і файловими потоками
💡 Actor model — модель акторів
Ми розглянемо найкращі практики обробки помилок як з використанням виключень, так і доменних помилок. Як Graceful shutdown, Gracefully recover і обробка доменних помилок підвищують загальну продуктивність системи. Ми будемо використовувати Chain of Responsibility, SOLID, Promises, fallback-механізми для некритичних помилок; GRASP: Protected Variations і кастомні, специфічні для JavaScript AggregateError і Error.prototype.cause, а також серіалізацію помилок для передачі мережею.
⭐ Обробка помилок, логування і агрегування
⭐ Семінар: Обробка прикладних, операційних і доменних помилок, виключення, відновлення і логування
💡 Реалізація Graceful shutdown у Node.js, unhandled exceptions, async stack trace
Об’єднання всіх розглянутих технік і підходів у реальних умовах. У цьому юніті ми розглянемо, як основні концепції побудови структури застосунків, такі як контрактне програмування і патерни, перетворюються на працюючі та масштабовані застосунки.
Цей модуль зосереджений на тому, як особливості середовища виконання накладаються на завдання структури та архітектури застосунків. Ви отримаєте навички впровадження технік програмування, що перетворюють програмне рішення на платформу, розраховану на довготривалу експлуатацію; це включає підтримку зміни інструментарію, розширення команди, постійне інтенсивне нарощування функціональності та навантажень.
Для покращення виразності коду і чіткості семантики будь-яке складне програмне забезпечення потребує створення DSL (мов, спеціалізованих для предметної області). Під час розробки DSL можна використовувати добре відомі синтаксиси, такі як JSON, JSON5, Markdown і навіть сам JavaScript. Ми розглянемо патерни: Command, Interpreter, State, Strategy, Visitor. DSL робить код зрозумілим для аналітиків предметної області і навіть для досвідчених користувачів. Це покращує комунікацію і розуміння, пришвидшує розробку, адаптацію рішень до нових вимог, спрощує навчання і передачу знань, приховує технічну складність і дозволяє фахівцям зосередитися на своїй галузі, покращуючи загальну передбачуваність проєкту.
⭐ DSL (спеціалізовані мови), AST, Pattern Interpreter, підмножина JavaScript, Markdown, LISP
⭐ Pattern Interpreter — реалізація AST і LISP на JavaScript
⭐ Pattern Command
⭐ Приклад: електронна таблиця з формулами
💡 CQS, CQRS, Event Sourcing, транзакції
Розробка систем, незалежних від фреймворків, платформ, протоколів, баз даних і хмарних рішень — як стандартний підхід для забезпечення гнучкості та свободи архітектурних рішень. Такий підхід усуває залежність від постачальників хмарних сервісів і фреймворків. Звісно, не обов’язково впроваджувати всі аспекти агностичного підходу, але деякі з них принесуть значні переваги в масштабуванні системи та в процесі її експлуатації. Ми будемо використовувати ізоляцію, GRASP: Controller; SOLID: DIP; принципи IoC і DI; інтерфейси та патерн Strategy для відв'язання від конкретних реалізацій.
⭐ SOLID: DIP — Принцип інверсії залежностей (Dependency Inversion Principle)
⭐ Service Locator
На цьому тижні ми розглянемо, як проєктувати системи, які можуть масштабуватися і розвиватися ефективно, використовуючи різні архітектурні стилі: DDD, шарова архітектура, SOA, мікросервіси, подієва архітектура, монолітна, порти і адаптери, чиста архітектура, Event-Sourcing, CQRS, Pipeline, Peer-to-Peer, Client-Server архітектура — і як застосовувати SOLID, GRASP та GoF для реалізації архітектури.
Завершальна частина програми тренінгу зосереджена на
практичному застосуванні всіх знань у комплексі. Ми
розглянемо, як почати впроваджувати концепції і шаблони,
вивчені на курсі, в реальних проєктах. Цей модуль надає
практичні стратегії для створення дорожньої карти їх
впровадження. Як виявити потребу в шаблонах і принципах та
врахувати можливі негативні аспекти.
Ре факторинг успадкованих систем, впровадження нових методів
розробки та активностей у команді. Як спланувати власне
навчання і налагодити розвиток команди з використанням знань
із цього тренінгу.
⭐ Bridge;
⭐ Mediator;
⭐ Як застосовувати патерни на прикладі Mediator і Bridge в ООП, ФП, мультипарадигмовому стилі
Дізнайтеся, як шаблони проєктування підтримують масштабовану, надійну архітектуру та довгострокову підтримку системи. Зосередьтеся на стратегічних рішеннях і командному впровадженні практик для досягнення успішних результатів і створення бізнес-цінності. У цій частині буде розглянуто, як впроваджувати шаблони проєктування в команди бекенду та фронтенду, а також як бізнес-фактори впливають на архітектурні рішення.
⭐️ Огляд і класифікація архітектури ПЗ
⭐️ Багатошарова архітектура ПЗ, DDD, чиста архітектура ПЗ
⭐️ Структура застосунку: модульність, DI, DTO, моделі
⭐️ Черги: Pub/Sub, Push/Pull, CQS, CQRS, Event Sourcing, Command, Query Object
⭐️ Vertical Slice Architecture і Feature-Slice Design
⭐️ Архітектура Web: DDD для фронтенду і бекенду
⭐️ Багатопоточність для Web: Atomics/CAS, workers, locks, races
⭐️ Local-first, розподілені системи, блокчейн для Web 3.0
⭐ Розбір того, чому більшість впроваджень навіть найкращих ідей часто зазнають поразки.
⭐ Що таке «репутація інженера» і яку роль вона відіграє в успіху (або провалі) змін.
⭐ Як учасники проєкту — від розробників до менеджерів — по-різному сприймають інженерні практики та їх впровадження.
⭐ Типові проблеми, з якими стикаються команди під час спроб упровадити інженерні підходи, — та практичні рішення, які справді працюють.
⭐ Список найпоширеніших патернів проєктування на фронтенді.
⭐ Чим фронтенд відрізняється від бекенду в контексті застосування патернів?
⭐ Чи варто боротися за чистоту концепцій, чи все ж краще довіритися фреймворкам? Спойлер: радше друге, ніж перше.
⭐ Який результат: розуміння того, як застосовувати отримані знання у фронтенді — і де цього робити не варто.
Так, якщо ви відвідали всі заняття, але бажаєте більше практики чи отримати доступ до додаткових модулів.
Доступ до існуючих матеріалів та їх оновлень у вас зберігається незалежно від участі в наступних ітераціях курсу.
У Standard-форматі студенти навчаються в групах по 10 осіб, у Senior — по 5. У Senior більш кваліфіковані розробники, які прямо займаються активно розробкою складних, високонавантажених систем, їх дизайном, підтримкою.
У Standard передбачено основний, базовий курс, спроєктований як самодостатній і оптимізований, без перевантаження. У Prefessional додатково включено всі матеріали, які Тимур підготував, але свідомо не включив до базового курсу — щоб не ускладнювати структуру навчання для тих, хто має обмежений час.
Учасники Prefessional-формату зможуть переглядати ці додаткові лекції самостійно й обговорювати їх із менторами.
Також у Prefessional входить окремий курс по архітектурі від Тимура, курс по soft skills від Іллі, і загальна тривалість навчання — 4 місяці — через наявність двох додаткових модулів.
Так, доступна оплата на крипту, для цього в чаті оберіть зв'язок з менеджером турботи.