Menu
Martin Fowler·March 24, 2026

Architecture Decision Records (ADRs): Documenting Software Architecture Decisions

Architecture Decision Records (ADRs) are lightweight documents that capture significant architectural decisions, their context, and consequences. They serve as a historical log to understand system evolution and, more importantly, facilitate clear thinking and alignment among teams by forcing discussions on trade-offs. ADRs are crucial for maintaining architectural consistency and enabling future teams to comprehend the rationale behind existing designs.

Read original on Martin Fowler

The Purpose of Architecture Decision Records (ADRs)

An Architecture Decision Record (ADR) is a concise document detailing a single architectural decision relevant to a system or ecosystem. Beyond merely recording decisions, the process of writing ADRs helps clarify thinking, surfaces different viewpoints, and fosters consensus among team members. This structured approach ensures that architectural choices are well-considered and explicitly documented, which is invaluable for long-term system maintainability and understanding.

Key Components and Structure of an ADR

  • Decision: The core architectural choice being made.
  • Context: The problem or forces that necessitated this decision.
  • Alternatives: Other serious options considered, along with their pros and cons. This highlights trade-offs.
  • Consequences: The impact of the decision, both positive and negative, on the system, development, and operations.
  • Status: Tracks the lifecycle of the decision (proposed, accepted, superseded).
💡

Brevity and Immutability

ADRs should be kept short, ideally a single page, focusing on essential information. Once an ADR is accepted, it should never be modified. If a decision needs to change, a new ADR is created to supersede the old one, providing a clear audit trail of architectural evolution.

Storing and Managing ADRs

The common practice is to store ADRs in the source code repository (e.g., in a `doc/adr` directory) of the project they relate to. This co-location ensures developers have immediate access to architectural rationale. They should be written in a lightweight markup language like Markdown for easy readability and version control. For broader architectural decisions spanning multiple codebases or involving non-developers, alternative storage solutions might be considered, though maintaining proximity to code is generally preferred for system-specific decisions.

markdown
# 0001-Use-PostgreSQL-for-Main-Database

## Status
Accepted

## Context
Our application requires a robust, ACID-compliant relational database for transactional data. Key considerations include data integrity, scalability for moderate loads, and community support.

## Decision
We will use PostgreSQL as our primary database.

## Alternatives Considered
*   **MySQL:** Strong community, but PostgreSQL offers more advanced features like advanced indexing, richer JSON support, and better adherence to SQL standards.
*   **MongoDB:** NoSQL database, better for flexible schemas, but less suitable for our transactional, relational data model without significant application-level complexity.

## Consequences
*   Leverages strong ACID properties for critical data.
*   Good ecosystem for tooling and community support.
*   Requires careful schema design and migration management.
*   Potential for vertical scaling until sharding becomes necessary.

ADRs are a cornerstone of transparent and accountable architectural governance, ensuring that design choices are not only made but also understood and justified over the system's lifetime. They are particularly valuable in distributed teams or when onboarding new engineers, providing immediate access to critical architectural knowledge.

ArchitectureDecision MakingDocumentationSoftware DevelopmentEngineering PracticesSystem DesignArchitectural Governance

Comments

Loading comments...