Опираясь на 01.01 Понятие системы и системного подхода, 01.02 Ментальные модели аналитика и 01.03 Техники анализа проблем, а также на бережливый подход из 01.05 Теория ограничений и бережливое мышление, аналитик переходит к инженерным правилам, на которых строятся устойчивые границы решения и качество формулировок. Эта заметка — не про код: здесь проверочные вопросы к scope, декомпозиции, интеграции и процессам. Детали архитектуры, DDD, API и BPMN — в соседних разделах; здесь — карта принципов и семейств паттернов, чтобы не плодить хрупкие требования.
1. Суть темы
Принципы проектирования — устойчивые правила выбора: что включать в scope, как резать систему на части, где фиксировать знание один раз. Паттерны проектирования — типовые решения повторяющихся задач на уровне анализа: распределение обязанностей (GRASP), границы предметной области (идеи DDD), взаимодействие систем (EIP), фрагменты процессов (BPMN).
GoF-паттерны на уровне классов сознательно опущены: на этапе анализа важнее семейства, которые напрямую отражаются в user stories, use cases, интеграционных сценариях и моделях процессов. Четыре уровня паттернов в статье не смешиваются случайно:
| Уровень | Семейство | Вопрос аналитика |
|---|---|---|
| Распределение обязанностей | GRASP | Кто в спецификации отвечает за расчёт, создание, обработку события? |
| Предметная область | Идеи DDD | Где заканчивается смысл термина и единица изменения данных? |
| Интеграция | EIP | Как системы обмениваются данными при заданных SLA и согласованности? |
| Процесс | Process patterns | Как выглядит жизненный цикл объекта и типовые ветвления в BPMN? |
Принцип фиксируется в требовании, когда он задаёт поведение или ограничение для заказчика и команды; в архитектурном решении (ADR) — когда это выбор между альтернативами реализации с долгосрочными последствиями (см. 10.01.13 Шаблон архитектурного решения (ADR)). Граница БТ / ФТ / НФТ — 02.03.01 Классификация требований (БТ, ФТ, НФТ); НФТ вроде modifiability и interoperability часто становятся формальной «оболочкой» принципов — см. 08.02 Нефункциональные требования (НФТ) — классификация и стандарты.
2. Ключевые понятия
2.1. Фундаментальные принципы
KISS (Keep It Simple, Stupid) — решение не сложнее задачи. В спецификации: не плодить сущности «на всякий случай», предпочитать линейный процесс, если ветвление не даёт ощутимой ценности. Антипаттерн: спецификация на сотни страниц с редкими исключениями, которые никогда не наступят.
YAGNI (You Ain't Gonna Need It) — не закладывать функциональность, пока нет подтверждённой потребности. Связь с Lean и XP: 01.05 Теория ограничений и бережливое мышление, 05.05 Методология быстрой разработки (RAD, XP). Scope и MVP — 02.01.04 Определение границ решения (Scope Modelling), приоритизация — 02.03.02 Приоритизация требований (MoSCoW, WSJF, Кано). Антипаттерн: gold plating и раздел «на будущее» в BRD без привязки к текущей цели.
DRY (Don't Repeat Yourself) — каждая значимая часть знания имеет одно непротиворечивое место в системе документов. Единый глоссарий — 10.01.14 Шаблон глоссария и словаря данных; одно правило — одна формулировка с трассировкой в stories и use cases — 02.03.04 Трассировка требований (концепция). Форматы BRD/SRS/FRD — 04.01 Форматы документов (Vision&Scope, BRD, SRS, FRD). Антипаттерн: одно бизнес-правило скопировано в пять разделов; при изменении расходятся формулировки.
SOLID — пять принципов ООП, адаптированных к артефактам анализа:
- S — Single Responsibility: модуль, сервис или story отвечает за одну бизнес-способность. User Story — одна ценность (04.02 Пользовательские истории (User Stories) и Job Stories); Use Case — одна цель актора (03.02.01 Диаграмма прецедентов (Use Case Diagram)).
- O — Open/Closed: система расширяется без ломки ядра — точки расширения (plug-in, настраиваемые справочники) явно в требованиях. Конфликт с KISS: расширяемость vs срок поставки — фиксируйте в ADR, что откладывается до следующего релиза. OCP формулирует что должно расширяться в требованиях и ADR; GRASP Protected Variations подсказывает, куда в декомпозиции повесить абстракцию — это разные вопросы, не дубли одной идеи.
- L — Liskov Substitution: подтипы заменяют базовый тип без сюрпризов — проверяйте иерархии сущностей («Юрлицо» / «Физлицо» как «Контрагент») через единый сценарий в stories или use case: подтип проходит те же шаги без «особых исключений».
- I — Interface Segregation: актор видит только релевантные операции — отдельные контракты API, ролевые экраны и разделы BRD по ролям вместо универсальной формы «на всех».
- D — Dependency Inversion: требования в терминах предметной области и глоссария, не СУБД или фреймворка; бизнес-логика не привязана к технологии в формулировке.
Связность (Cohesion) и сцепление (Coupling) — две стороны декомпозиции: внутри модуля всё про одну задачу (высокая связность), между модулями — минимум зависимостей через стабильные интерфейсы (низкое сцепление). Антипаттерн: «божественный» модуль в спецификации, который одновременно про оплату, доставку и отчётность — признак низкой связности и высокого сцепления.
2.2. GRASP — распределение обязанностей в спецификации
GRASP (General Responsibility Assignment Software Patterns) на этапе анализа — проверочные вопросы к компонентной и сервисной декомпозиции, а не инструкция по классам. Девять паттернов:
| Паттерн | Вопрос аналитика | Пример в спецификации |
|---|---|---|
| Information Expert | У кого уже есть данные для расчёта или проверки? | Скидку считает модуль «Заказ», а не «Клиент» |
| Creator | Кто логично создаёт экземпляр по связи? | Позиции заказа создаёт «Заказ», не «Каталог» |
| Controller | Кто принимает системное событие первым? | Роль «приём заявки» для UC «Оформить заявку» — не обязательное имя класса |
| Low Coupling | Можно ли ослабить связь между компонентами? | Событие вместо прямого вызова чужой БД |
| High Cohesion | Все обязанности компонента про одну цель? | «Платёж» не смешивает сверку и печать чека |
| Polymorphism | Где поведение зависит от типа без цепочки if? | Разные правила для типов контрагента через общий контракт |
| Pure Fabrication | Нужен ли служебный компонент без прямой доменной сущности? | «Отчётный агрегатор», «Адаптер внешнего API» |
| Indirection | Нужен ли посредник, чтобы развязать стороны? | Очередь или шина между системами A и B |
| Protected Variations | Что изолировать от будущих изменений? | Абстракция «Провайдер оплаты» вместо одного вендора |
Use Case и последовательности — 03.02.01 Диаграмма прецедентов (Use Case Diagram), 03.02.03 Диаграмма последовательности (Sequence Diagram); декомпозиция системы — 03.01.03 Декомпозиция системы на подсистемы и модули.
2.3. Идеи предметной области (граница с DDD)
Для сложной бизнес-логики достаточно трёх опорных идей; полный DDD — в 03.06.02 Основы Domain-Driven Design:
- Единый язык (Ubiquitous Language) — термины в спецификации совпадают с языком бизнеса, не с таблицами БД.
- Ограниченный контекст (Bounded Context) — у термина один смысл внутри границы; между контекстами — явный контракт перевода.
- Агрегат (Aggregate) — единица изменения: транзакционная целостность внутри кластера сущностей.
Конфликт DRY vs bounded context: в разных контекстах допустимы разные модели «Клиента» — DRY не означает одну таблицу на всю корпорацию.
2.4. Интеграционные паттерны (EIP)
Шаблоны из Hohpe & Woolf описывают поведение обмена, не реализацию брокера. Таблица ниже — критерии для формулировки требований; протоколы, контракты и топологии — в 03.05.01 Виды интеграции (точка-точка, ESB, API-led), 03.05.02 Синхронные протоколы (REST, gRPC, GraphQL), 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events).
| Сценарий | Критерии | Типовой шаблон | НФТ и критерии приёмки |
|---|---|---|---|
| Разовая выгрузка файлов | Низкая частота, допустима задержка | File Transfer | SLA доставки, формат и кодировка файла |
| Жёсткая согласованность «здесь и сейчас» | Синхронный ответ, малый объём | Request-Reply | Latency, таймаут, коды ошибок |
| Слабая связность, пиковые нагрузки | Асинхронность, буферизация | Messaging, Message Broker | Гарантия доставки, retry, идемпотентность |
| Один факт — много подписчиков | Fan-out без знания получателей | Publish-Subscribe | Порядок событий, at-least-once vs exactly-once |
| Маршрутизация по содержимому | Разные системы по типу сообщения | Content-Based Router | Правила маршрутизации в спецификации |
| Разбиение/сборка пакета | Крупное сообщение или параллельная обработка | Splitter / Aggregator | Корреляция частей, таймаут сборки |
Выбранный шаблон фиксируйте в НФТ и критериях приёмки интеграции — см. 08.02 Нефункциональные требования (НФТ) — классификация и стандарты, 02.04.02 Критерии приёмки (Acceptance Criteria). Событийная модель — 03.05.06 Event-Driven Architecture; контракты — 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf).
2.5. Паттерны бизнес-процессов
Типовые фрагменты для BPMN и state-моделей:
- State Machine — жизненный цикл заявки/документа по состояниям: 03.02.04 Диаграмма состояний (State Machine Diagram), 03.04.01 BPMN 2.0 - введение и основы.
- Four-Eyes — аудит и разделение полномочий: критическое действие подтверждают две независимые роли; часто встречается в комплаенсе — 08.04 Рецензирование и инспекции (техники Фейгана), 08.06 Юридические и регуляторные требования РФ (PCI-DSS), 08.07 Основы кибербезопасности для системного аналитика.
- Split-Merge — параллельные ветки по компетенциям и синхронизация: 06.02.03 Типовые паттерны BPMN.
2.6. Эволюция без big bang
Паттерны Strangler Fig (постепенная замена legacy новым контуром) и Feature Toggle (включение функциональности без полного релиза) относятся к эволюции архитектуры и поставки, а не к BPMN-фрагментам. Каталог распределённых паттернов — 03.06.01 Архитектурные паттерны распределённых систем; разбор миграции — 10.02 Разбор кейса "Миграция legacy-системы".
3. Как применяется в работе аналитика
KISS, YAGNI и DRY одинаково работают в BRD, user stories и критериях приёмки — UML и sequence-диаграммы не обязательны. SOLID и GRASP переводятся в роли, глоссарий, границы stories и разделы спецификации; диаграммы помогают, но проверочные вопросы остаются текстовыми.
| Принцип / паттерн | Эффект в требованиях и артефактах |
|---|---|
| KISS, YAGNI | Узкий scope, MVP, простые проверяемые критерии приёмки — 02.04.02 Критерии приёмки (Acceptance Criteria) |
| DRY | Согласованность BRD/SRS, единый глоссарий, трассировка без копипасты |
| Single Responsibility | Атомарные stories, чёткие границы use cases, независимая приоритизация |
| Open/Closed vs KISS | Явное решение в ADR: что расширяем сейчас, что откладываем |
| Cohesion / Coupling | Декомпозиция на модули и сервисы, меньше интеграционных узлов — 03.01.03 Декомпозиция системы на подсистемы и модули |
| GRASP | Кто считает, кто создаёт, кто принимает событие — видно на диаграммах и в тексте UC |
| Идеи DDD | Один язык с бизнесом, границы контекста, единица изменения |
| EIP | Требования к доставке, форматам, ошибкам интеграции, не только «система B получит данные» |
| Process patterns | Повторяемые фрагменты в BPMN без изобретения с нуля |
| Strangler / Toggle | Поэтапная миграция и управляемый rollout в ADR и roadmap |
Классификация того, что идёт в требование, а что в ADR — 02.03.01 Классификация требований (БТ, ФТ, НФТ). В Agile принципы не противоречат «just enough documentation» (05.02 Scrum и Kanban (аналитик в Agile)): KISS и YAGNI как раз сокращают объём, DRY — дубли в Confluence и Jira.
graph TD
subgraph "Принципы"
KISS["KISS"] --> QUAL["Качество формулировок"]
YAGNI["YAGNI"] --> QUAL
DRY["DRY"] --> QUAL
SOLID["SOLID"] --> QUAL
COHESION["Связность / сцепление"] --> QUAL
COHESION --> DECOMP["Декомпозиция модулей"]
end
subgraph "Паттерны"
GRASP["GRASP"] --> BEHAV["Поведение компонентов"]
DOMAIN["Идеи DDD"] --> BEHAV
INTEGRATION["EIP"] --> BEHAV
PROCESS["Process patterns"] --> BEHAV
end
QUAL --> REQ["Стабильные требования"]
DECOMP --> REQ
BEHAV --> REQ
REQ --> ADR["ADR при выборе альтернатив"]
Практикум
- Рефакторинг scope. Возьмите фрагмент спецификации: одну формулировку упростите (KISS), одну «на будущее» вынесите из Must (YAGNI), одно дублирующееся правило сведите к одному месту с ссылками (DRY).
- GRASP на сущности. Для «Заказ» / «Платёж» / «Клиент» ответьте: Information Expert для расчёта, Creator для дочерних объектов, Controller для входящего события. Зафиксируйте на черновике sequence или use case.
- Интеграционный выбор. Опишите сценарий «событие A → система B» с критериями: нужен ли ответ сразу, допустима ли eventual consistency, кто ещё подписан. Сопоставьте с одной строкой таблицы интеграционных сценариев выше.
- SOLID и ADR. Для спорного расширяемого API выпишите: что требование (поведение для заказчика), что ADR (выбор plug-in vs жёсткая интеграция), как KISS ограничивает OCP в текущем релизе.
- Критерии приёмки. Перепишите один критерий так, чтобы по KISS/YAGNI его можно было проверить без «на будущее» и скрытых допущений.
4. Типовые ошибки и ограничения
- Принципы как декорация. KISS/YAGNI/DRY цитируют, но scope и бэклог не режут — принцип без артефакта (02.01.04 Определение границ решения (Scope Modelling), 02.03.02 Приоритизация требований (MoSCoW, WSJF, Кано)) бесполезен.
- DRY через насильственное слияние контекстов. Разные bounded context требуют разных моделей; одна универсальная сущность ломает смысл терминов.
- Information Expert vs enterprise master data. DRY тянет к «единому клиенту» на всю корпорацию, а Expert говорит: расчёт скидки — у «Заказа», мастер-данные — у MDM. Спор решают явной границей владения данными, а не слиянием моделей.
- GRASP и SOLID «для разработчиков». Если в спецификации не видно, кто за что отвечает, паттерны не применены — проверяйте на ревью требований (08.04 Рецензирование и инспекции (техники Фейгана)).
- EIP без SLA. «Через очередь» без требований к доставке, повтору и идемпотентности — не спецификация, а пожелание.
- Перегруз DDD в фундаменте. Entity/VO/Domain Service в деталях дублируют 03.06.02 Основы Domain-Driven Design — здесь достаточно языка, контекста и агрегата.
- Конфликты без решения. KISS vs OCP, DRY vs автономия команд, YAGNI vs страх «переделывать» — фиксируйте явно в ADR или протоколе решения (01.04 Теория игр для аналитика), иначе команда получит противоречивые требования.
- Scope creep под видом расширяемости. Open/Closed не оправдывает фичи вне приоритета — см. 02.05.03 Управление объёмом (Scope Creep) и ожиданиями.
Связи с другими разделами базы
- Фундамент мышления: 01.01 Понятие системы и системного подхода, 01.02 Ментальные модели аналитика, 01.03 Техники анализа проблем, 01.04 Теория игр для аналитика, 01.05 Теория ограничений и бережливое мышление, 01.07 Когнитивные искажения и критическое мышление
- Scope, приоритеты, трассировка: 02.01.04 Определение границ решения (Scope Modelling), 02.03.01 Классификация требований (БТ, ФТ, НФТ), 02.03.02 Приоритизация требований (MoSCoW, WSJF, Кано), 02.03.04 Трассировка требований (концепция), 02.04.02 Критерии приёмки (Acceptance Criteria)
- Декомпозиция и архитектура: 03.01.01 Понятие архитектуры ИС и её виды (бизнес-, системная, техническая), 03.01.03 Декомпозиция системы на подсистемы и модули, 03.06.01 Архитектурные паттерны распределённых систем, 03.06.02 Основы Domain-Driven Design
- Интеграция: 03.05.01 Виды интеграции (точка-точка, ESB, API-led), 03.05.02 Синхронные протоколы (REST, gRPC, GraphQL), 03.05.04 Асинхронное взаимодействие (очереди, Kafka, Events), 03.05.06 Event-Driven Architecture, 03.05.03 Спецификации контрактов (OpenAPI, AsyncAPI, Protobuf)
- Моделирование: 03.02.01 Диаграмма прецедентов (Use Case Diagram), 03.02.04 Диаграмма состояний (State Machine Diagram), 06.02.03 Типовые паттерны BPMN, 06.01.02 Поведенческие диаграммы (State, Activity, Use Case)
- Качество и решения: 08.02 Нефункциональные требования (НФТ) — классификация и стандарты, 08.04 Рецензирование и инспекции (техники Фейгана), 10.01.13 Шаблон архитектурного решения (ADR), 10.01.14 Шаблон глоссария и словаря данных
- Agile и кейсы: 05.02 Scrum и Kanban (аналитик в Agile), 10.02 Разбор кейса "Миграция legacy-системы"
Источники и дополнительные материалы
Книги и стандарты
- Craig Larman. Applying UML and Patterns (3rd ed., 2004). GRASP и связь анализа с паттернами. Amazon
- Eric Evans. Domain-Driven Design (2003). Ubiquitous Language, Bounded Context, Aggregate. Amazon
- Gregor Hohpe, Bobby Woolf. Enterprise Integration Patterns (2003; доп. издания 2025). Каталог EIP и сайт с описаниями паттернов: enterpriseintegrationpatterns.com
- Robert C. Martin. Clean Architecture (2017). SOLID и архитектурные границы. Amazon
Статьи и онлайн-каталоги
- Martin Fowler. Patterns of Enterprise Application Architecture — каталог
- Martin Fowler. Enterprise Application Architecture (обзорная статья)
- Martin Fowler. Yagni
- Martin Fowler. Beck's Design Rules (в т.ч. DRY)
- NDepend blog. Domain-Driven Design Demystified — вводное изложение DDD для практиков