Реестр архитектурных решений

опубликовано: ⏰ 6

Реестр архитектурных решений (Architecture Decision Record, ADR) – это документированный процесс принятия ключевых архитектурных решений в проекте. Он помогает команде сохранять и передавать знания о том, почему были сделаны определенные решения, какие альтернативы рассматривались и какие последствия от этих решений.

Наверное, одна из самых частых проблем, которая встречалась на проектах с “историей” заключалась в том, что носители знаний о принятых решениях и реализованном функционале уже покинули проект. Ушли в светлое будущее, оставив неизвестность и тёмное настоящее потомкам – без полноценной документации, без информации, почему сделано именно так и никак иначе. Чтобы избежать подобных ситуаций, в проекте можно и нужно использовать так называемые реестры архитектурных решений (ADR).

Цели использования ADR

Самое главное, что ADR отражают архитектурно значимые решения (ASR), которые могут влиять на различные аспекты архитектуры решения (например, производительность, масштабируемость, поддерживаемость и т.д.), как с точки зрения программной части, так и аппаратной.

Основные цели использования ADR включают:

  • Документирование архитектурных решений.
  • Обоснование этих решений.
  • Сохранение знаний о принятых решениях.
  • Упрощение понимания архитектуры проекта новыми участниками команды.
  • Отслеживаемость изменений в архитектуре и их влияние на проект.
  • Обеспечение согласованности между разработчиками и другими участниками команды.

Когда использовать ADR?

ADR следует использовать, когда:

  • Вы принимаете решение, которое может существенно повлиять на архитектуру проекта.
  • Решение требует обсуждения и согласования между несколькими участниками команды.
  • Решение имеет долгосрочные последствия для проекта.
  • Решение не является тривиальным или очевидным.

Больше информации можно найти на сайте Architectural Decision Record и в репозитории Architecture decision record (ADR).

Инструменты для работы с ADR

Существует несколько инструментов и библиотек для работы с ADR. Некоторые из них:

Так как ADR это обычные текстовые файлы в формате Markdown или AsciiDoc, то возможно использование любого текстового редактора или системы управления версиями, поддерживающей эти форматы.

Структура ADR

Обычно каждый ADR состоит из следующих разделов:

  1. Номер и название - уникальный номер для каждого ADR и краткое описание темы (в имени файлы).
  2. Дата и автор - дата создания ADR и имя автора.
  3. Статус - текущий статус решения (например, принято, отклонено).
  4. Заинтересованные стороны (aka Stakeholders) - кто участвует и заинтересован в решении этой проблемы.
  5. Контекст - описание текущей ситуации или проблемы, которую решает ADR.
  6. Решение - описание принятого решения и почему оно было выбрано.
  7. Альтернативы - описание альтернативных решений и почему они были отклонены (довольно полезная информация, позволяющая понять процесс принятия решения).
  8. Последствия - описание последствий принятия данного решения.

Это минимальный вариант. При этом существуют более детализированные шаблоны, которые могут включать дополнительные разделы с учётом специфики проекта или предметной области.

Ниже пример шаблона MADR в формате Markdown.

Markdown
---
# These are optional metadata elements. Feel free to remove any of them.
status: "{proposed | rejected | accepted | deprecated | … | superseded by ADR-0123"
date: {YYYY-MM-DD when the decision was last updated}
decision-makers: {list everyone involved in the decision}
consulted: {list everyone whose opinions are sought (typically subject-matter experts); and with whom there is a two-way communication}
informed: {list everyone who is kept up-to-date on progress; and with whom there is a one-way communication}
---

# {short title, representative of solved problem and found solution}

## Context and Problem Statement

{Describe the context and problem statement, e.g., in free form using two to three sentences or in the form of an
illustrative story. You may want to articulate the problem in form of a question and add links to collaboration boards
or issue management systems.}

<!-- This is an optional element. Feel free to remove. -->

## Decision Drivers

* {decision driver 1, e.g., a force, facing concern, …}
* {decision driver 2, e.g., a force, facing concern, …}
* … <!-- numbers of drivers can vary -->

## Considered Options

* {title of option 1}
* {title of option 2}
* {title of option 3}
* … <!-- numbers of options can vary -->

## Decision Outcome

Chosen option: "{title of option 1}", because {justification. e.g., only option, which meets k.o. criterion decision
driver | which resolves force {force} | … | comes out best (see below)}.

<!-- This is an optional element. Feel free to remove. -->

### Consequences

* Good, because {positive consequence, e.g., improvement of one or more desired qualities, …}
* Bad, because {negative consequence, e.g., compromising one or more desired qualities, …}
* … <!-- numbers of consequences can vary -->

<!-- This is an optional element. Feel free to remove. -->

### Confirmation

{Describe how the implementation of/compliance with the ADR can/will be confirmed. Are the design that was decided for
and its implementation in line with the decision made? E.g., a design/code review or a test with a library such as
ArchUnit can help validate this. Not that although we classify this element as optional, it is included in many ADRs.}

<!-- This is an optional element. Feel free to remove. -->

## Pros and Cons of the Options

### {title of option 1}

<!-- This is an optional element. Feel free to remove. -->
{example | description | pointer to more information | …}

* Good, because {argument a}
* Good, because {argument b}

<!-- use "neutral" if the given argument weights neither for good nor bad -->

* Neutral, because {argument c}
* Bad, because {argument d}
* … <!-- numbers of pros and cons can vary -->

### {title of other option}

{example | description | pointer to more information | …}

* Good, because {argument a}
* Good, because {argument b}
* Neutral, because {argument c}
* Bad, because {argument d}
* …

<!-- This is an optional element. Feel free to remove. -->

## More Information

{You might want to provide additional evidence/confidence for the decision outcome here and/or document the team
agreement on the decision and/or define when/how this decision the decision should be realized and if/when it should be
re-visited. Links to other decisions and resources might appear here as well.}

Заключение

Реестры архитектурных решений довольно полезный инструмент документирования проектов на всём жизненном цикле разработки от этапа проектирования до передачи внедрённого решения в поддержку. Они позволяют эффективно организовать процесс принятия решений и обеспечивают доступ всей проектной команде к информации о том, на основании чего были приняты. И что важно – реестры архитектурных решений не статичны и требуют регулярного обновления в процессе разработки.

Adr Documentation Essentials