концепції / software-design
Проєктування програмного забезпечення
Проєктування — центральна тема каналу про інженерну майстерність: у Google, каже Віктор, твій рівень визначається вмінням проєктувати, а не знанням технологій (до приходу туди він жодного рядка не написав ні на Java, ні на Angular), і це вміння він напряму повʼязує з роботою з абстракціями та знанням властивостей речей через їхню внутрішню будову: індекс — це відсортована структура, а отже запис чогось коштує і виграють лише певні форми запитів (Q&A і плани на 2024). Його особистий метод — API-first: ніколи не починати з реалізації — спершу написати приклад коду використання, переписувати його, доки не проявиться скелет, і братися за реалізацію лише тоді, коли API демонструє єдину відповідальність, мінімум вхідних даних, відсутність витоку деталей реалізації та розширюваність (3 речі, які роблять програміста кращим, Q&A №2). Він відкрито анти-TDD-пурист: цикл red/green годиться для виправлення багів, але під час проєктування звужує фокус — він цитує A Philosophy of Software Design про те, що TDD відводить увагу вбік, пише тести після коду і тримається класицистської позиції щодо моків: замість них проєктувати під підмінювані (injectable) реалізації (Q&A №2). Детальне проєктування відбувається під час кодування, через прослідковування сценаріїв використання від початку до кінця; не передбачити все — нормально, і саме тому він любить думку Роберта Мартіна про те, що робота архітектора — відкладати рішення: хороша архітектура максимізує кількість неприйнятих рішень, бо розуміння домену покращується щодня (головна проблема мікросервісів).
Стрими з вайб-кодингу показують цю доктрину в дії: чиста архітектура, продиктована Claude, — мета: тонкі контролери як клей, що його не тестують (товсті контролери й анемічна доменна модель — антипатерни), один application service на ендпоінт з єдиним run(), валідація всередині сервісу, ніколи не випускати доменні сутності назовні (приклад із хешем пароля), бо хешування паролів — доменна бізнес-політика; плюс його жарт про «API для терранів» проти JSON:API «для зергів» і відповіді завжди-HTTP-200-зі-статус-прапорцем, як у API Facebook (стрим вайб-кодингу нового проєкту). Проєктування також спирається на контекст, якого бракує ШІ: він знає, що гоночних трас буде ~100–200 (кешувати назавжди, без пагінації), а точок телеметрії — мільйони (в жодному разі не окрема сутність на кожну точку) — з доказами: Rust→WASM-оптимізація Figma з першого дня і Monaco з VS Code, який відкинув усі веб-фреймворки (тоді як Atom помер від повільності): деякі властивості мають бути закладені в дизайн від самого початку (вайб-кодинг, частина 2). Глибина — передумова проєктування: потрібно знати властивості кожної підсистеми — що станеться з БД, якщо даних стане вдвічі більше, як поводиться її ізоляція — щоб система в цілому відповідала своїм вимогам (випуск про глибоке навчання і запамʼятовування). Патерни й best practices не священні: патерн — це лише класифікована назва того, що спрацювало, а best practices існують, щоб запобігати жахливому коду, а не породжувати найкращий — зрозумійте причини, і зможете свідомо їх порушувати; він наводить приклад event sourcing Ґреґа Янґа, канонізованого всупереч задуму автора (3 речі, які псують програміста). У WebbyLab ця дисципліна інституціалізована: періодичні архітектурні ревʼю з чеклістами помилок (анемічна доменна модель включно), ревʼюер, який мусить зуміти запустити проєкт однією командою, C4-діаграма контейнерів, з якої відкривається ~2-годинний дзвінок, і план дій, що повторно перевіряється за ~2 місяці (випуск про код-ревʼю в Google). Його книжковий канон: Clean Architecture про шари, Domain-Driven Design про домен, Patterns of Enterprise Application Architecture про те, як ці шари реально реалізуються (3 книжки про проєктування ПЗ, книжки на пʼять зірок).
Розібрано у відео
- Вайб-коджу новий крутий проєкт (стрім)
чиста архітектура наживо: тонкі контролери, один сервіс на ендпоінт, ніколи не випускати сутності назовні, думки про дизайн API
- Вайб-кодінг — частина 2 (стрим)
проєктування з контекстом, якого бракує ШІ (кардинальність даних), історії Figma/Monaco/Atom про перформанс за задумом, іменування input/result
- 3 речі, які роблять програміста кращим
метод API-first: писати приклади використання до реалізації
- 3 речі, що псують програміста
патерни та best practices не священні; розумійте, яку проблему вони розвʼязують
- Навіщо глибоко розбиратися в речах й як менше забувати вивчене
властивості підсистем як передумова проєктування
- Як покращити Code Review? Як це робить Google?
формат періодичних архітектурних ревʼю у WebbyLab
- Головна проблема мікросервісів, яку часто недооцінюють
хороша архітектура відкладає рішення
- Голосове №3 — страшні абстракції
виділяйте нові абстракції, коли відповідальності ростуть; правильно на 100 рядках, хибно на 5000
- Голосове №2 — як швидше розробляти інтерфейс
ще один декларативний шар як проєктне рішення, з застереженням «а на вашому проєкті може й не злетіти»
- 3 важливі книги про проектування програмного забезпечення
трикнижковий канон проєктування: шари, домен, патерни реалізації
- Книги, які я прочитав і поставив п'ять зірок
PoEAA замість GoF як книжка про патерни; DDD за Евансом і Верноном
- Відповідаю на питання №2
анти-TDD-пуризм, класицистські моки, перевинайдення патернів GoF у Mail.ua
Повʼязане
Абстракції — навичка проєктування — це навичка роботи з абстракціями Знання предметної області — архітектуру диктує домен, а не патерни Глибоке вивчення фундаментальних речей — внутрішня будова дає властивості, від яких залежать проєктні рішення Патерни проєктування — словник, а не євангеліє Test-driven development (TDD) — цикл, який він відкидає як інструмент проєктування Мікросервіси — архітектура, що карає за ранні рішення Clean Architecture, Domain-Driven Design, Patterns of Enterprise Application Architecture, A Philosophy of Software Design — книжкова полиця з проєктування