Запись об архитектурном решении (Architecture Decision Record, ADR) — короткий версионируемый документ, фиксирующий одно значимое архитектурное решение: контекст, выбор, последствия и статус. В линейке шаблонов аналитика ADR отвечает на вопрос «почему система устроена так», а не «что делает» (SRS, BRD) и не «как вызывать интерфейс» (REST, SOAP, Kafka spec). Этот шаблон — единый формат записи решений с явной связью с требованиями и последующими спецификациями; место ADR в SDLC — 00.03 Жизненный цикл ПО и место аналитика (SDLC, STLC); теория архитектуры — 03.01.01 Понятие архитектуры ИС и её виды (бизнес-, системная, техническая).
1. Назначение
Документ пишут системный аналитик и/или архитектор (00.01 Кто такой аналитик (роли BA, SA, FA)); его читают разработка, другие аналитики, DevOps/SRE, QA, владелец продукта и владельцы смежных систем на этапах проектирования, ревью и сопровождения.
Роли инициаторов. Технический ADR (стек, репликация, протокол) обычно ведёт SA или architect. Business analyst поднимает Proposed, когда зафиксирован компромисс между стейкхолдерами по scope или NFR (например, «eventual consistency до 30 s допустима для списка») — передаёт SA problem statement, Source requirements, ранжированные drivers и согласованные ограничения; SA/architect дополняет options, POC и доводит до Accepted. Эскалация при споре reviewers — 09.06 Ведение переговоров с техническими командами.
Шаблон закрывает четыре задачи:
- Сохранение контекста решения — через полгода видно, какие ограничения, NFR и альтернативы учитывались; без post-rationalization после релиза.
- Единая точка «почему» — User Story, API spec, схема БД и BPMN ссылаются на ADR-ID, не дублируя обоснование в каждом артефакте.
- Управляемый жизненный цикл — до принятия:
Proposed→Accepted|Rejected|Withdrawn; после принятия:Accepted→Deprecated|Superseded by ADR-NNN. Смена решения = новый ADR, а не правка старого «задним числом». - Трассировка требований → архитектура — BRD/SRS/NFR попадают в Context и Decision drivers; ADR объясняет, как архитектурный ответ закрывает требование и снимает конфликт между REQ — 02.05.01 Управление зависимостями между требованиями; структура связей — 10.01.15 Шаблон матрицы трассировки, концепция — 02.03.04 Трассировка требований (концепция).
ADR фиксирует архитектурный компромисс или выбор — технический, интеграционный или business-level (03.01.01 Понятие архитектуры ИС и её виды (бизнес-, системная, техническая)): граница bounded context, sync vs EDA, выбор паттерна (01.06 Принципы и паттерны проектирования решений). Не контракт API и не пошаговый сценарий. Детали эндпоинтов — в 10.01.04 Шаблон спецификации REST API; измеримые пороги качества — в 10.01.12 Шаблон нефункциональных требований (NFR).
Decision log — реестр всех ADR проекта; формат и правила ведения — §3.0.
Immutability. В статусе Proposed блоки Options, Decision и Consequences можно дорабатывать до ревью. После любого финального статуса (Accepted, Rejected, Withdrawn, Deprecated, Superseded) не меняйте Decision, Options, Consequences и Source requirements — только опечатки, уточнение reviewers, смена статуса и поля Superseded by. Date обновляется только при смене статуса, не при правках текста решения.
2. Когда использовать
Подходит, если:
- выбираете стек, паттерн интеграции, границу микросервиса или модель данных на уровне системы (03.01.03 Декомпозиция системы на подсистемы и модули, 03.06.02 Основы Domain-Driven Design);
- решаете sync REST vs async events для сквозного потока (03.05.06 Event-Driven Architecture);
- меняете контракт, затрагивающий несколько команд или внешних потребителей;
- явный компромисс по NFR (latency vs consistency, cost vs availability, security vs time-to-market);
- отклоняетесь от корпоративного reference architecture — нужно зафиксировать обоснование;
- перед gate «готовность к разработке» (10.04 Чеклист аналитика перед стартом разработки) спорный пункт в спецификации требует архитектурного якоря;
- в refinement или architecture review (05.02 Scrum и Kanban (аналитик в Agile)) команда не может согласовать «почему» без формальной записи; в масштабируемых фреймворках — согласование с architecture board (05.03 SAFe и LeSS — аналитик в масштабируемых фреймворках).
Не подходит или требует дополнения, если:
- нужно описать что делает система для пользователя — 10.01.01 Шаблон User Story, 10.01.02 Шаблон Use Case;
- нужны поля, эндпоинты, схема сообщений — 10.01.04 Шаблон спецификации REST API, 10.01.05 Шаблон спецификации SOAP API, 10.01.06 Шаблон спецификации Producer (Kafka, RabbitMQ);
- нужна общая картина системы (компоненты, потоки, deployment) — HLD / C4 (06.03.05 C4-модель); ADR дополняет HLD точечными решениями, не заменяет его;
- нужен design doc / engineering spec с пошаговой реализацией, sequence diagram на уровне классов — отдельный артефакт; ADR фиксирует выбор, design doc — «как построить по выбранному»;
- нужен threat model, capacity plan, runbook или тест-план — отдельные артефакты; ADR может на них ссылаться;
- решение тривиально и не влияет на соседние команды — достаточно комментария в PR или meeting notes (критерий: «изменение затронет >1 артефакт 10.01 или >1 команду»).
Входные условия: границы scope согласованы (02.01.04 Определение границ решения (Scope Modelling)), релевантные FR/NFR из BRD/SRS известны. Для статуса Accepted — минимум две реальные альтернативы для сравнения; для Proposed достаточно problem statement и черновика options (см. §3.6).
Правило «одно решение — один ADR»: выбор REST vs gRPC — один ADR (03.05.02 Синхронные протоколы (REST, gRPC, GraphQL)); стратегия идемпотентности для конкретного API — другой. Смешение делает документ нечитаемым и ломает версионирование.
3. Структура документа
Скопируйте каркас из §3.0 в docs/adr/, Confluence или vault. Поля с пометкой обяз. для Accepted — см. §3.12; для Proposed — минимальный набор в §3.12. Лимит: 1–2 страницы; POC, диаграммы и протоколы встреч — в appendix или отдельных ссылках. Разделы §3.3–3.8 соответствуют классической тройке Nygard/MADR: Context → Options → Decision → Consequences (см. §7).
3.0. Бланк для копирования
Единый markdown-каркас; детали полей — в §3.1–3.11.
# ADR-NNNN: {Краткое название решения}
**Date:** YYYY-MM-DD · **Status:** Proposed | Accepted | Rejected | Withdrawn | Deprecated | Superseded
**Authors:** …
**Reviewers:** …
**Approvers:** … *(только для Accepted)*
**Supersedes:** ADR-… *(если заменяет прежнее решение)*
**Superseded by:** ADR-… *(заполняется при смене решения)*
## Summary
{2–4 предложения: проблема, выбор, главное последствие}
## Context
**Problem statement:** …
**Scope (in):** …
**Out of scope:** …
**Source requirements:** `BRD-…`, `SRS-REQ-…`, `US-…`
## Requirements и constraints
**NFR / constraints:** `NFR-…`, `CON-…` — по ID из NFR-реестра
**Functional drivers:** … *(опционально)*
## Decision drivers
1. … *(критерии сравнения options; не дублируйте числовые пороги из NFR)*
## Options considered
| Option | За | Против | Verdict |
|--------|-----|--------|---------|
| A. … | … | … | Rejected / Selected / TBD |
| B. … | … | … | … |
## Decision
**Принято:** … *(или «We will …» — один язык на весь ADR, см. §3.7)*
**Не делаем:** …
## Consequences
- *Positive:* …
- *Negative / risks:* …
- *Migration / rollout:* … *(если нужно)*
## Impact on artifacts
| Артефакт | ID / действие |
|----------|---------------|
| API spec | `API-…` — … |
| NFR | `NFR-…` — … |
## Open questions / Follow-up ADRs
…
## References
…Decision log (минимум): README.md или index.md в каталоге ADR — колонки: ID, Title, Status, Date, Epic/Release, Authors. Один ADR = один файл; поиск по ID и статусу обязателен. Хранение в Git — 07.05 Системы контроля версий (Git) для документации. При Superseded цепочка читается по полю Superseded by: последний Accepted в цепочке = актуальное решение.
| Роль | Ответственность |
|---|---|
| Author (A/R) | SA, architect или BA (черновик context) — готовит ADR |
| Reviewers (C) | Tech lead, владельцы spec, SRE, ИБ — комментируют на Proposed |
| Approver (A для Accepted) | Architect / architecture owner |
При конфликте двух Accepted ADR — эскалация approver + новый ADR; один из конфликтующих → Superseded или Deprecated. Просроченный Proposed без SLA ревью → Withdrawn или доработка.
На ревью ADR проверяйте: одно решение на документ; минимум две options; drivers согласованы с NFR-ID; Impact перечисляет затронутые spec; двусторонняя трассировка REQ ↔ ADR. Чеклист перед разработкой — 10.04 Чеклист аналитика перед стартом разработки; формальные техники ревью — 08.04 Рецензирование и инспекции (техники Фейгана).
3.1. Метаданные
| Поле | Обяз. | Что писать |
|---|---|---|
| ID | да | Монотонный номер: ADR-0012. Опциональный префикс домена: ADR-HR-0014 — тот же глобальный номер 0014, префикс только для навигации. Счётчик ведёт architecture owner (или назначенный SA) в decision log (README.md index); при нескольких репозиториях — один канонический каталог ADR на продукт/портфель, остальные repo ссылаются на него. Номера не переиспользуют после любого финального статуса. |
| Title | да | Краткое имя решения: «Async уведомления через Kafka вместо sync REST». |
| Date | да | Дата текущего статуса: при создании в Proposed — дата подачи на ревью; при Accepted / Rejected / Withdrawn / Deprecated / Superseded — дата соответствующего перехода. Не дата правки текста Decision. |
| Status | да | До принятия: Proposed → Accepted | Rejected | Withdrawn. После Accepted: Accepted → Deprecated | Superseded by ADR-NNN. Rejected — обсудили, ни один вариант не принят. Withdrawn — инициатор снял до решения. |
| Authors | да | Аналитик, архитектор, tech lead — кто подготовил документ. |
| Reviewers (Proposed) | да | Кого пригласили на ревью — без финального утверждения. |
| Approvers (Accepted) | да* | Кто перевёл в Accepted (*обязательно для Accepted). |
| Supersedes / Superseded by | нет | Перекрёстные ссылки при смене решения; читайте цепочку от нового ADR назад. |
| Related ADRs | нет | Зависимые или смежные записи без прямой замены. |
3.2. Summary
| Поле | Обяз. | Что писать |
|---|---|---|
| Краткое резюме | да | 2–4 предложения для PM и новых разработчиков: проблема, выбор, главное последствие. |
3.3. Context и scope
| Поле | Обяз. | Что писать |
|---|---|---|
| Problem statement | да | Какую архитектурную проблему решаем; почему «как сейчас» не подходит. |
| Scope (in) | да | Сервисы, интеграции, релиз, bounded context — 03.06.02 Основы Domain-Driven Design. |
| Out of scope | да | Что сознательно не меняем в этом ADR. |
| Source requirements | да | Ссылки на BRD goal, SRS-REQ, User Story, Epic — 04.01 Форматы документов (Vision&Scope, BRD, SRS, FRD). |
| Business context | нет | Цели, KPI, дедлайны — 02.01.02 Цели, KPI и критерии успеха (SMART, GQM). |
3.4. Requirements и constraints
| Поле | Обяз. | Что писать |
|---|---|---|
| Functional drivers | нет | FR, которые диктуют форму решения (например, «отложенная доставка допустима»). |
| NFR / constraints | да | Пороги и жёсткие ограничения по ID из 10.01.12 Шаблон нефункциональных требований (NFR): SLA, RTO, compliance, лимиты — без копирования всего каталога. При регуляторике — 08.06 Юридические и регуляторные требования РФ (PCI-DSS), 08.07 Основы кибербезопасности для системного аналитика. |
| Organizational constraints | нет | Корпоративный стандарт, лицензии, бюджет, skills команды. |
3.5. Decision drivers
| Поле | Обяз. | Что писать |
|---|---|---|
| Drivers (ранжированный список) | да | Критерии сравнения options: latency, cost, time-to-market, operability — что важнее при равных альтернативах. Числовые пороги не дублируйте: они в NFR / constraints (§3.4). |
| Quality attributes | нет | Явная привязка к атрибутам качества — 08.02 Нефункциональные требования (НФТ) — классификация и стандарты. |
3.6. Options considered
| Поле | Обяз. | Что писать |
|---|---|---|
| Option A, B, C… | да* | Минимум две реальные альтернативы для Accepted; для Proposed — хотя бы одна черновая + «TBD» допустимо. Таблица «за / против» по drivers. |
| Rejected because | да* | Почему отвергли вариант — конкретный критерий (*для Accepted). |
| POC / evidence | нет | Ссылка на spike, benchmark, vendor doc — без вставки полного OpenAPI. |
3.7. Decision
| Поле | Обяз. | Что писать |
|---|---|---|
| Decision outcome | да* | Однозначная формулировка в одном языке на весь ADR: для RU-корпоративной практики — «Принято: …»; для англоязычных команд — «We will …». Для Proposed — «TBD» или preferred option. |
| What we will NOT do | да* | Явные anti-decisions (*для Accepted). |
3.8. Consequences
| Поле | Обяз. | Что писать |
|---|---|---|
| Positive | да | Выигрыши: масштабируемость, decoupling, соответствие NFR. |
| Negative / risks | да | Минусы, технический долг, operational burden — 08.05 Управление рисками на этапе анализа. |
| Neutral | нет | Изменения без явного плюса/минуса (новый мониторинг, обучение команды). |
| Migration / rollout | нет | Этапы внедрения, feature flags, dual-write, откат — если внедрение не тривиально. |
| Monitoring / verification | нет | Как проверим, что решение работает (метрики, алерты, SLO). |
3.9. Impact on artifacts
| Поле | Обяз. | Что писать |
|---|---|---|
| Artifacts to create / update | да | Какие шаблоны 10.01 изменить после Accepted: API, БД, Kafka, BPMN, роли, Airflow, NFR. В репозитории продукта — plain ID (API-LEAVE-001) и URL spec; wiki-ссылки — только в учебных примерах KB. При смене контракта — 03.05.07 Управление версионированием API и жизненным циклом. |
| Trace links | да | ADR-ID в SRS-REQ, spec и матрице — 10.01.15 Шаблон матрицы трассировки. Детали колонок — в шаблоне 10.01.15. |
3.10. Open questions и follow-up
| Поле | Обяз. | Что писать |
|---|---|---|
| Open questions | нет | Нерешённые пункты с владельцем и дедлайном. |
| Follow-up ADRs | нет | Отложенные решения («стратегия DLQ — отдельный ADR-0013»). |
3.11. References
| Поле | Обяз. | Что писать |
|---|---|---|
| External references | нет | RFC, vendor docs, корпоративные стандарты, протокол воркшопа. |
3.12. Чеклисты качества
Минимум для Proposed:
- Problem statement и Scope заполнены.
- Source requirements указаны (хотя бы черновые REQ/Epic).
- Reviewers назначены; статус и Date (= дата подачи на ревью) зафиксированы.
- Есть черновик options или явный TBD с планом доработки.
Перед Accepted (дополнительно к Proposed):
- Один ADR = одно архитектурное решение.
- Минимум две альтернативы с критериями отказа.
- Decision outcome и anti-decisions заполнены.
- Блок Consequences содержит negative paths и риски.
- Нет дублирования OpenAPI / DDL — только ссылки на spec.
- Impact on artifacts перечисляет затронутые шаблоны 10.01.
- Approvers зафиксированы; index decision log обновлён.
- При смене решения — новый ADR + старый →
Superseded, не правка Decision.
Для Rejected:
- Options и
Rejected becauseзаполнены для каждого отвергнутого варианта. - Decision outcome = явный отказ («ни один вариант не принят») или зафиксирован preferred path вне scope ADR.
- Date = дата решения о Rejected; содержимое Decision/Options после Rejected не меняется (immutability).
4. Пример заполнения
Сокращённый технический ADR для HR Portal — сервис leave-service (данные условны). Для интеграционного ADR (sync REST vs Kafka для уведомлений) или business-level (граница сервиса Leave vs Payroll) тот же каркас §3.0; options и Impact другие, без Redis/replica.
ID: глобальный счётчик 0014 в decision log продукта HR Portal; HR — навигационный префикс. Supersedes показывает замену прежнего решения; Follow-up — отложенный ADR, который позже получит Supersedes: ADR-HR-0014.
В репозитории продукта в Impact указывайте
API-LEAVE-001,NFR-PERF-001— без wiki. Ниже wiki-ссылки только для навигации в KB.
ADR-HR-0014 · Async read path через read replica и cache
Date: 2026-03-12 · Status: Accepted
Authors: SA Иванова, Architect Петров
Reviewers: Tech Lead leave-team, SRE Козлов
Approvers: Architect Петров
Supersedes: ADR-HR-0008 (read path только с primary + индексы; p95 не достигнут на POC)
Summary. Список заявок на отпуск при росте БД не укладывается в NFR-PERF-001 (p95 ≤ 300 ms). Принято: чтение списка — с read replica PostgreSQL + Redis cache invalidation по событиям; запись — только primary.
Context. GET /leave-requests на primary при 500k записей даёт p95 ~800 ms (POC LT-2026-02). Scope: leave-service, web UI модуля Leave. Out of scope: mobile app v1, полнотекстовый поиск. Source: BRD-GOAL-011, SRS-HR-LEAVE-v2 REQ-012, NFR-PERF-001, US-0247.
NFR / constraints. NFR-PERF-001 (p95 ≤ 300 ms @ 200 RPS); CON-TECH-001 (PostgreSQL 15, без смены СУБД); CON-DATA-001 (ПДн в контуре РФ).
Decision drivers (по убыванию): 1) latency p95; 2) time-to-market (релиз v2.1 через 6 нед.); 3) operational cost; 4) consistency для списка (eventual допустима до 30 s).
Options considered:
| Option | За | Против | Verdict |
|---|---|---|---|
| A. Индексы + query tuning на primary | Без новой инфры | Недостаточно на POC | Rejected |
| B. Read replica + cache | Достижим p95 ~220 ms на POC | Eventual consistency, ops cache | Selected |
| C. Elasticsearch для списка | Быстрый search | Новый кластер, вне CON-TECH | Rejected |
Decision. Принято: маршрутизировать GET /leave-requests на read replica; Redis cache TTL 60 s с invalidation по domain events при create/update/delete. Запись — только primary. Не делаем: Elasticsearch в v2.1.
Consequences.
- Positive: p95 ~220 ms на stage POC; разгрузка primary.
- Negative: eventual consistency до 30 s; мониторинг replication lag; runbook cache stampede.
- Risks: replica lag > 30 s нарушает UX — alert
pg-replica-lag-leave. - Migration / rollout: v2.1 — feature flag
read-from-replica; неделя dual-read на stage; rollback — flag off.
Impact on artifacts:
| Артефакт | Действие |
|---|---|
10.01.04 Шаблон спецификации REST API API-LEAVE-001 | Header Cache-Control, note on stale reads |
| 10.01.03 Шаблон спецификации БД сервиса | Replica routing, индексы для read path |
| 10.01.06 Шаблон спецификации Producer (Kafka, RabbitMQ) | Topic leave.request.changed для invalidation |
| 10.01.12 Шаблон нефункциональных требований (NFR) | Примечание к NFR-PERF-001: eventual ≤ 30 s |
| 10.01.15 Шаблон матрицы трассировки | ADR-HR-0014 ↔ REQ-012 ↔ NFR-PERF-001 ↔ API-LEAVE-001 |
Open questions: стратегия cache warming при cold start — owner SRE, до 2026-03-20.
Follow-up ADR: ADR-HR-0015 (полнотекстовый поиск) — отложено post v2.1. При принятии 0015: Supersedes: ADR-HR-0014, у 0014 → Superseded by: ADR-HR-0015, Date обновляется на дату supersede.
5. Связанные артефакты
На входе (upstream)
| Артефакт | Связь |
|---|---|
| Vision & Scope, BRD | Цели, ограничения, бизнес-drivers — 04.01 Форматы документов (Vision&Scope, BRD, SRS, FRD) |
| SRS, User Story, Use Case | FR и системные требования — 02.03.03 Спецификация требований (SRS, Use Case, User Story) |
| 10.01.12 Шаблон нефункциональных требований (NFR) | Пороги и компромиссы качества |
| 10.01.08 Шаблон сквозной фичи (BPMN-процесс) | Сквозные потоки при смене orchestration |
| 10.01.14 Шаблон глоссария и словаря данных | Термины домена при границах сервисов |
| Context / HLD / C4 | 03.01.02 Моделирование контекста системы (Context Diagram), 06.03.05 C4-модель |
На выходе (downstream)
| Артефакт | Когда создавать / обновлять |
|---|---|
| 10.01.04 Шаблон спецификации REST API / 10.01.05 Шаблон спецификации SOAP API | После Accepted: протокол, sync/async, versioning |
| 10.01.03 Шаблон спецификации БД сервиса | Модель данных, sharding, replication |
| 10.01.06 Шаблон спецификации Producer (Kafka, RabbitMQ) / 10.01.07 Шаблон спецификации Consumer (Kafka, RabbitMQ) | Топики, семантика доставки, idempotency |
| 10.01.11 Шаблон ролевой модели | Trust boundary, OAuth scopes |
| 10.01.09 Шаблон описания экранной формы и логики на FE | Caching, offline, real-time на UI |
| 10.01.10 Шаблон описания Airflow-триггеров и автоматических процессов | Batch vs streaming |
| 10.01.15 Шаблон матрицы трассировки | REQ → ADR → spec → test |
Как пользоваться шаблоном (кратко)
- Спорный пункт в refinement (05.02 Scrum и Kanban (аналитик в Agile)) → ADR
Proposed; BA передаёт context/drivers, SA — options и POC. - Ревью reviewers (09.06 Ведение переговоров с техническими командами при эскалации); после согласования —
Accepted. - Обновить spec по Impact; трассировка в 10.01.15 Шаблон матрицы трассировки.
- Смена принятого решения — новый ADR, старый →
Superseded. - Формальное согласование изменения scope/контракта через CCB — 02.05.02 Управление изменениями (Change Control Board). Reprioritization backlog без смены архитектуры — 02.05.02 Управление приоритетами в условиях изменчивости (не путать с CCB).
Rejected— обсудили, не приняли;Withdrawn— сняли до решения.
6. Связи с другими разделами базы
Только то, что не разобрано выше:
- Паттерны распределённых систем — 03.06.01 Архитектурные паттерны распределённых систем
- Интеграции — 03.01.04 Интерфейсы и интеграционные взаимодействия, 03.05.02 Синхронные протоколы (REST, gRPC, GraphQL), 03.05.06 Event-Driven Architecture
- Жизненный цикл требования после ADR — 02.05.05 Жизненный цикл требования
7. Источники и дополнительные материалы
Структура §3.3–3.8 следует канону Context / Options / Decision / Consequences (Nygard, MADR); теория «зачем ADR» — 03.01.01 Понятие архитектуры ИС и её виды (бизнес-, системная, техническая).
Статьи и практики
- Michael Nygard — Documenting Architecture Decisions (классическая тройка Context / Decision / Consequences) — https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions
- Architecture Decision Records (adr.github.io) — каталог форматов и decision log — https://adr.github.io/
- Markdown ADR (MADR) — расширенный шаблон полей (drivers, options, consequences) — https://adr.github.io/madr/
- MADR (репозиторий шаблона) — https://github.com/adr/madr
- AWS Prescriptive Guidance — Architecture decision records — https://docs.aws.amazon.com/prescriptive-guidance/latest/architectural-decision-records/
- Joel Parker Henderson — Architecture decision record (коллекция шаблонов и примеров) — https://github.com/joelparkerhenderson/architecture-decision-record