ADR (Architecture Decision Records)

ADR (Architecture Decision Records) — это метод документирования архитектурных решений в проекте. Этот подход помогает зафиксировать и систематизировать выборы, сделанные в процессе разработки, а также объясняет причины этих решений и возможные альтернативы, которые рассматривались.

Использование ADR в процессе разработки программного обеспечения позволяет команде и будущим разработчикам понять, почему были выбраны те или иные архитектурные решения, а также улучшить коммуникацию внутри команды. Это важный инструмент для поддержания качества и поддержки проекта в долгосрочной перспективе.

Зачем использовать ADR?

ADR является важным инструментом для команд, работающих над сложными проектами. Когда проект растет и развивается, становится все труднее держать в голове все принятые решения. Без должного документационного сопровождения, в будущем будет трудно понять, почему были выбраны те или иные решения, какие факторы влияли на выбор и какие компромиссы были сделаны.

Основные преимущества использования ADR:

  • Объяснение принятых решений: каждый выбор имеет свои причины, которые стоит зафиксировать. Это упрощает понимание архитектуры и ускоряет процесс включения новых разработчиков в проект.
  • Отслеживание изменений: в процессе развития проекта часто возникает необходимость пересмотра решений. ADR позволяет зафиксировать изменения и помочь команде понять, почему необходимо было изменить то или иное решение.
  • Командная коммуникация: ADR помогает разработчикам ясно и четко объяснять свои выборы, а также упрощает обсуждение сложных вопросов в команде.
  • Документирование альтернатив: важно не только фиксировать принятые решения, но и описывать варианты, которые были отклонены. Это позволяет лучше понимать, почему был выбран тот или иной путь.

Структура ADR

Каждое архитектурное решение должно быть зафиксировано в одном документе ADR. Структура таких записей обычно состоит из нескольких ключевых компонентов:

  1. Заголовок: краткое описание решения, что и зачем было сделано.
  2. Контекст: ситуация, в которой принималось решение. Это описание проблемы или вызова, который нужно было решить.
  3. Решение: конкретное архитектурное решение, которое было принято.
  4. Рationale (Мотивация): объяснение, почему было выбрано это решение и какие факторы повлияли на выбор. Также следует описать, какие альтернативы были рассмотрены и почему они были отклонены.
  5. Последствия: описание того, как принятое решение влияет на проект. Это могут быть как положительные, так и негативные последствия.
  6. Ссылки: ссылки на внешние источники, которые могут быть полезны для понимания решения. Это могут быть документация, исследования, статьи, код и другие ресурсы.

Пример ADR

# Решение 001: Использование React для фронтенда

## Контекст
Проект представляет собой веб-приложение с динамичным интерфейсом, который требует высокоотзывчивой работы с пользователем и частых обновлений состояния UI. Мы ищем подходящий фреймворк для разработки фронтенда.

## Решение
Для создания пользовательского интерфейса выбрали React, так как он предоставляет высокую производительность благодаря виртуальному DOM и позволяет эффективно управлять состоянием приложения с помощью компонента.

## Мотивация
React был выбран по следующим причинам:
- Виртуальный DOM позволяет оптимизировать рендеринг, что улучшает производительность.
- Существующая экосистема библиотек и инструментов для React значительно ускоряет разработку.
- Компонентная модель и однонаправленный поток данных делают приложение предсказуемым и легко тестируемым.

Альтернативы:
- **Vue.js**: проще в освоении, но у нас уже есть опыт с React.
- **Angular**: более тяжеловесный фреймворк, что усложняет его использование в этом проекте.

## Последствия
Выбор React может привести к необходимости изучать дополнительные инструменты (например, Redux для управления состоянием). Однако, этот выбор предоставит нам гибкость и ускорит разработку.

## Ссылки
- https://reactjs.org/
- https://redux.js.org/

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

ADR создается в момент принятия архитектурных решений, особенно когда это решение может повлиять на архитектуру всего проекта. Это могут быть решения по выбору технологий, проектированию API, организации базы данных и т.д.

Лучше всего создавать ADR сразу после того, как принято архитектурное решение. Это поможет избежать забывания или недооценки важности какого-либо выбора в будущем. Следует избегать накопления решений и их документирования в конце проекта, так как это может привести к забыванию ключевых причин.

Как работать с ADR?

ADR не должен быть статичным документом. В процессе разработки могут возникать новые решения, которые потребуют корректировки существующих ADR или добавления новых. Таким образом, ADR должен быть живым и актуальным документом, который постоянно обновляется.

  1. Обновление существующих ADR: если принято решение, которое изменяет ранее зафиксированное архитектурное решение, необходимо обновить старый ADR с указанием изменений.
  2. Добавление новых ADR: каждый новый важный выбор требует создания нового ADR. Это позволяет поддерживать полную картину изменений в архитектуре проекта.
  3. Хранение ADR: важным аспектом работы с ADR является правильная организация их хранения. Наиболее распространенный подход — хранить все записи в папке с документацией проекта. Также можно использовать инструменты для управления документацией, такие как Confluence или Notion.

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

Для создания и управления ADR можно использовать различные инструменты. Наиболее популярными являются:

  • Text files (Markdown): это самый простой и распространенный способ создания ADR. Записи хранятся в текстовых файлах формата Markdown, что позволяет легко их редактировать и хранить в системе контроля версий.
  • Adr-tools: это утилита, предназначенная для управления ADR. Она позволяет легко создавать новые записи, обновлять существующие и поддерживать структуру документации.
  • Structurizr: инструмент для визуализации архитектуры, который может быть использован для создания графических схем архитектурных решений и связей между ними.

Заключение

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