Вітаю! Якщо ви читаєте ці рядки, ви пройшли довгий шлях від визначення Єдиної Мови до реалізації складних Саг і Агрегатів.
Але найважливіший урок DDD ми приберегли на кінець: Всі архітектурні рішення — тимчасові.
Те, що було ідеальним рішенням для стартапу з 3 людей (Моноліт на Laravel/Django), стане смертним вироком для компанії з 500 інженерів. І навпаки: мікросервісна архітектура Netflix вб'є ваш стартап ще до першого релізу.
У цій главі ми поговоримо про Час. Як наша система повинна змінюватися разом з бізнесом.
Від CRUD до DDD
Закон Конвея
Refactoring to Deeper Insight
У Главі 2 ми розділили світ на Core, Supporting та Generic domains. Але це не статичний поділ.
Уявіть, що ви будуєте інтернет-магазин у 2010 році.
Найбільша помилка — триматися за свій кастомний код, коли світ вже придумав стандартне рішення. Якщо ви пишете свій Authentication Server у 2024 році замість використання Auth0/Keycloak — ви спалюєте гроші компанії. Аутентифікація — це Commodity.
Тут ми не будемо холіварити. Ми подивимося на це через призму DDD.
Більшість проектів повинні починатися і закінчуватися тут.
Стосунки між командами теж змінюються.
"Організації, які проектують системи, змушені створювати проекти, які є копіями комунікаційних структур цих організацій." — Мелвін Конвей.
Якщо у вас є Команда Backend, Команда Frontend і Команда DBA — ви отримаєте тришарову архітектуру, де зміни в бізнес-логіці вимагатимуть синхронізації трьох менеджерів.
Якщо ви хочете мікросервісну (або модульну) архітектуру, сфокусовану на Бізнес-Доменах:
У вас є моноліт, де User клас має 5000 рядків, і все залежить від усього. З чого почати?
Встановіть правило: Новий код пишеться в нових модулях.
Не додавайте 5001-й рядок у User.php. Створіть UserPreferenceService збоку.
Почніть групувати код у папки за бізнес-змістом (Sales, Catalog), навіть якщо вони фізично знаходяться в одному проекті.
Використовуйте інструменти типу Deptrac (PHP) або ArchUnit (Java), щоб заборонити незаконні імпорти між цими папками.
Найважча частина.
Catalog напряму лізе в таблицю users через JOIN.Catalog зберігає копію ім'я користувача (якщо це допустимо).UserUpdated -> Catalog оновлює свій кеш.Catalog запитує UserModule->getName($id).Ерік Еванс каже: "Справжнє DDD починається тоді, коли ви робите прорив у розумінні моделі".
Спершу у нас була сутність Booking (Бронювання).
Ми думали: "Бронювання — це запис, що кімната зайнята".
Проблема: Бізнес каже "Ми хочемо овербукінг (продавати більше місць, ніж є)", "Ми хочемо переселяти людей", "Ми хочемо бронювати тип кімнати, а не конкретний номер".
Прорив (Insight): Ми зрозуміли, що є ДВІ різні концепції:
Рефакторинг:
Ми розділяємо Booking на Reservation і RoomAllocation.
Це фундаментально змінює код, базу даних і API. Але це робить систему набагато гнучкішою. Тепер ми можемо мати Reservation без Allocation (овербукінг).
Як досягти таких інсайтів? Не сидячи мовчки за клавіатурою.
Зберіть в одній кімнаті (або Miro) розробників, тестувальників, менеджерів і справжніх юзерів.
За 2 години Event Storming ви знайдете більше багів і невідповідностей у вимогах, ніж за 2 місяці Jira-переписки.
Процес моделювання не лінійний. Це постійний цикл:
Модель, яка не змінюється протягом року — це мертва модель.
Domain-Driven Design — це не про патерни. Не про Репозиторії, Агрегати чи Value Objects.
Це про Спілкування. Про те, щоб розробники і бізнес-експерти говорили однією мовою і будували модель, яка вирішує реальні проблеми.
Успіхів у ваших проектах! Нехай ваш код буде чистим, а домен — багатим.
Що читати далі?
Глава 10. Проектні Евристики
"It depends" (Це залежить) — найпопулярніша відповідь будь-якого консультанта чи архітектора. Але від чого саме це залежить?
Глава 12. EventStorming
Ми розглянули безліч інструментів DDD для аналізу та моделювання. Але як застосувати їх, коли ви працюєте не один, а з групою людей, які мають різний рівень розуміння бізнесу та технологій? Тут на сцену виходить EventStorming.