Модель понятий бесполезна, если ею пользуешься только ты. Её сила — когда одними и теми же словами говорят бизнес, код и AI-агент. Эта практика называется ubiquitous language — «единый язык», и это самая недооценённая идея DDD: не про архитектуру, а про то, как перестать терять смысл при переводах.
Испорченный телефон переводов
Посмотри, сколько переводов проходит обычное требование. Бизнес говорит «клиент бросил корзину». Аналитик записывает «сессия с неоформленным заказом». Разработчик называет это abandoned_cart, а в коде рядом живёт pending_order — «это же почти то же самое». Тестировщик проверяет «незавершённую покупку». Четыре формулировки, и у каждой — чуть-чуть свой смысл: почти то же самое, но «почти» здесь — источник дефектов.
Каждый перевод — точка потери смысла. Единый язык убирает переводы: слово из разговора с бизнесом попадает в модель, из модели — в код, из кода — в тесты и промпты, не меняясь по дороге. Если бизнес говорит «корзина брошена» — в коде есть CartAbandoned, а не «примерно оно же другими словами».
Практическое следствие: если для понятия в коде нет слова из языка бизнеса — это сигнал. Либо ты изобрёл сущность, которой нет в домене (зачем?), либо бизнес пользуется понятием, которого нет в твоей модели (что ты ещё не понял?).
Слова меняют смысл на границах
Вторая половина идеи, без которой первая не работает: не пытайся сделать один словарь на всю компанию. Мы уже видели на модели понятий: «клиент» для маркетинга, платежей и доставки — три разных понятия. Это не беспорядок, который надо победить, а природа предметных областей.
Решение DDD — границы контекстов (bounded context): единый язык действует внутри границы. Внутри контекста платежей «клиент» — всегда плательщик с реквизитами, и никаких других значений. На границе между контекстами происходит явный перевод: событие «заказ оформлен» из контекста заказов превращается в «появился плательщик» в контексте платежей — и этот перевод записан, а не происходит в чьей-то голове.
Попытка натянуть одно значение на всех даёт то самое «универсальное» понятие-монстра, неудобное каждому. Честные границы с явными переводами — дешевле.
Словарь — это артефакт, а не фольклор
Единый язык работает, только если он записан. Формат минимальный — глоссарий на страницу:
- Термин — точное имя (и имя в коде, если отличается — но лучше, чтобы не отличалось).
- Определение — одним-двумя предложениями, без «ну все же понимают».
- Границы — в каком контексте действует; чем отличается от похожего термина соседнего контекста.
- Состояния/правила — если у понятия есть жизненный цикл.
Признак живого словаря: на ревью можно сказать «у нас нет понятия „подписка", есть „регулярный платёж"» — и это аргумент, а не вкусовщина.
Словарь и агент
Для продукт-инженера у единого языка появился третий потребитель — AI-агент. И он самый требовательный: человек хотя бы чувствует, что «что-то тут не так», агент — молча достроит пропуски догадками.
Словарь в контексте агента (в системных инструкциях, памяти проекта, спеке) — это контракт: агент называет сущности так же, как бизнес; не изобретает синонимов (Order, а не Purchase во второй сессии); соблюдает записанные правила состояний. Три сессии агента без словаря дают три несовместимых решения — не потому, что модель плохая, а потому, что каждый раз она заново угадывает твою систему понятий. Словарь делает угадывание ненужным.
Коротко
- Единый язык — один словарь для бизнеса, модели, кода, тестов и агента; слово проходит весь путь, не меняясь. Каждый «перевод» между жаргонами — точка потери смысла.
- Нет слова из бизнеса в коде — сигнал: либо лишняя сущность, либо непонятый домен.
- Один словарь на всю компанию невозможен: слова меняют смысл на границах контекстов; внутри границы — строгое значение, на границе — явный записанный перевод.
- Словарь — записанный артефакт (термин, определение, границы, состояния), а не устная традиция.
- Для агента словарь — контракт, убирающий угадывание: без него каждая сессия заново изобретает твою модель понятий.
Дальше — от модели понятий к спеке: как словарь и модель превращаются в документ, по которому агент строит фичу.