Перейти к основному содержимому

Event Storming — совместное проектирование домена

Архитектору Аналитику Разработчику
Теория данных (раздел 3)

Event Storming — это быстрый workshop (совместная сессия на 2–8 часов), на котором бизнес, аналитики и разработчики вместе выкладывают на стену или на доску Miro события предметной области и выстраивают из них процесс. Это общее понимание: что реально происходит в жизни клиента и в системе, а не презентация архитектора "сверху".

Если вы впервые слышите термин — представьте, что вы рассказываете историю заказа от клика "Купить" до "Заказ доставлен" — шаг за шагом, стикер за стикером, без UML-классов на первом проходе. Из этой истории потом рождаются границы сервисов, задачи в backlog и схемы.

Когда имеет смысл

Сложный или запутанный домен, спорные границы сервисов, новый продукт, модернизация легаси.

Для простого CRUD из трёх экранов workshop часто избыточен — достаточно короткого интервью с владельцем продукта.

Связанные материалы: Доменная модель, декомпозиция монолита, NFR, роль архитектора.


Откуда взялся метод и зачем он архитектору

Метод предложил Alberto Brandolini (сообщество Domain-Driven Design). Идея простая: люди из разных ролей быстро создают общую картину процесса, не утонув в UML. Архитектору это нужно, чтобы:

  • услышать реальные названия и правила от бизнеса, а не придумать их за закрытой дверью;
  • увидеть разрывы (ручные шаги, "потом в Excel", "звоним в другой отдел");
  • наметить bounded context до спора "сколько микросервисов".

Термины, которые услышите на сессии

ТерминЧеловеческое объяснение
Доменное событиеФакт, который уже произошёл: "Заказ создан", "Платёж отклонён". Формулируют в прошедшем времени.
КомандаДействие, которое запускает переход к событию: "Оформить заказ", "Отменить платёж". Кто-то или что-то инициирует.
Агрегат (жёлтый стикер)Место, где хранится состояние и проверяются правила: "Заказ", "Корзина". Не обязательно = таблица в БД.
ПолитикаПравило "когда случилось A — сделай B": "Когда платёж проведён — зарезервировать товар".
Внешняя системаТо, чем вы не владеете: банк, 1С, СМС-шлюз.
Проблема / болиКрасный стикер: неясность, задержка, ручной труд, риск.
Bounded contextЗона, где слова имеют один смысл; границы часто видны, когда на одной цепочке разные отделы по-разному называют одно и то же.

Событие и команда — разные стикеры. Новички пишут "Создать заказ" как событие; правильнее: команда "Оформить заказ" → событие "Заказ создан".


Что получаем на выходе

После хорошей сессии у команды есть:

  • хронология событий ("Заказ создан", "Платёж проведён", "Заказ отменён");
  • команды (кто или что инициирует действие — пользователь, таймер, другой сервис);
  • агрегаты и политики (где живут правила и данные);
  • внешние системы и проблемные места (узкие горлышки, ручные шаги);
  • черновик bounded contexts и кандидатов в backlog.

Это напрямую кормит C4, ADR и решение о декомпозиции (микросервисы, модульный монолит).

Разбор

Один оранжевый стикер "Платёж проведён" может означать разные вещи в биллинге и в отделе доставки. Линия между зонами на доске — явное место перевода смыслов (контракт, ACL, событие).

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


Три уровня workshop (не путайте их)

УровеньФокусУчастникиДлительность
Big PictureПоток ценности end-to-end, боли, внешние системыСтейкхолдеры, аналитики, архитектор, лиды½–1 день
ProcessОдин процесс детально (например, "оформление заказа")Команда продукта + разработка2–4 часа
DesignМодель команд, агрегатов, инвариантовРазработчики + доменный эксперт2–4 часа

Big Picture отвечает на вопрос "где вообще болит бизнес". Process — "как устроен один сценарий по шагам". Design — "как это ляжет в код и границы агрегатов".

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


Как провести сессию (подробный сценарий)

Подготовка (30–60 минут)

  • Выберите один сценарий ("от заявки до оплаты"), не "всю ERP".
  • Пригласите эксперта домена (product owner, ведущий аналитик, операционист) — без него стикеры превращаются в технические фантазии.
  • Подготовьте доску — Miro, FigJam, физическая стена.
  • Договоритесь о цветах стикеров (пример ниже).

Цвета стикеров (типичная договорённость):

ЦветСмысл
ОранжевыйДоменное событие
СинийКоманда
ЖёлтыйАгрегат / сущность с правилами
РозовыйВнешняя система
КрасныйПроблема, риск, вопрос
ФиолетовыйПолитика (реакция на событие)

Роли в комнате — фасилитатор (задаёт вопросы, следит за временем), секретарь (фото, экспорт), эксперт домена (подтверждает или опровергает факты).


Ход Process-уровня (2–3 часа)

  1. События по времени (30–60 мин)
    Участники пишут события в прошедшем времени и выкладывают слева направо — как временную линию.
    Вопрос фасилитатора: "Что уже произошло в системе или в жизни клиента в этот момент?"
    Паузы и пустые места — нормально: туда позже придут команды и уточнения.

  2. Уточнение (20–30 мин)
    Где формулировка размыта — красный стикер "?" или "боль". Не спорить "правильно ли назван класс" — спорить "так ли бывает в жизни".

  3. Команды (20–30 мин)
    Перед каждым событием (кроме самого первого) — кто или что инициировал переход — пользователь, cron, webhook банка.

  4. Правила и агрегаты (30–40 мин)
    Где хранится состояние? Какие инварианты? Пример: "нельзя отгрузить без оплаты" — политика или правило внутри агрегата "Заказ".

  5. Границы (20–30 мин)
    Провести вертикальные линии там, где меняется язык или владелец процесса. Это кандидаты в bounded context.


Завершение (15–20 минут)

  • Сфотографировать / экспортировать доску в репозиторий (docs/workshops/2025-05-order-storming.png).
  • Зафиксировать 3–5 решений в ADR или Confluence — границы, спорные места, открытые вопросы.
  • Каждый красный стикер → задача в backlog с владельцем.

Пример — фрагмент интернет-магазина

Упрощённая цепочка (Process level):

Разбор для новичка:

  • После "Заказ создан" склад может резервировать остаток — отдельное событие, отдельная ответственность.
  • "Платёж проведён" и "Заказ подтверждён" могут жить в разных контекстах (Billing и Fulfillment). Workshop показывает, нужен ли синхронный вызов (пользователь ждёт ответа) или сообщение PaymentCompleted (слабая связность, возможна задержка).
  • Красный стикер "таймаут банка" → в backlog — политика повторов, таймаут UI, идемпотентность callback.

Онлайн и офлайн — практические советы

СитуацияСовет
Удалённая командаMiro + таймер на блоки; один человек двигает стикеры, остальные диктуют
10+ участниковРазбить на группы по подпроцессам, потом склеить на общей линии
Сопротивление бизнесаНачать с их боли (красные стикеры), не с "нарисуем микросервисы"
ЛегасиДобавить розовые стикеры "1С", "старый монолит" и явно показать, где ручной обмен

Типичные ошибки

ОшибкаПочему мешаетЧто делать
Нет доменного экспертаСобытия превращаются в CRUD-таблицыПеренести сессию, пока не найдётся владелец процесса
Слишком широкий scopeУсталость, водаОдин процесс за раз; Big Picture — отдельный день
Сразу рисовать микросервисыПутают домен и деплойСначала события и контексты, сервисы — после оценки альтернатив
Не зафиксировать результатПовторные споры через месяцADR + снимок доски в репозитории
Спор об именах классовWorkshop не про кодОтложить Design-уровень на отдельную сессию

Связь с архитектурными решениями


Мини-чек-лист "сессия удалась"

  • Есть временная линия из 10+ согласованных событий для одного сценария.
  • Бизнес подтвердил формулировки ("да, так и бывает").
  • Отмечены минимум 3 проблемы/риска с владельцами в backlog.
  • Намечены 1–3 границы контекстов (линии на доске или список).
  • Результат сохранён вне головы участников (фото + ADR/Confluence).

Дальше