skip to content

Describing Architecture

Getting the architecture out of your head and in front of stakeholders: which views to draw, which decisions to record, what to document, and which notation to use. It is the difference between having an architecture and having one the team can follow.

part ofSoftware design & architectureoverview, primer and where to startread it →
on this pageshow

questions

30

What is an Architecture Decision Record (ADR), and what are the four core sections of Michael Nygard's classic ADR template?

level: juniorimportance: must knowfreq 68%

answer

  1. Nygard 2011: Status, Context, Decision, Consequences
  2. One decision, one file, numbered, in git
  3. Context = neutral forces; Decision = "We will…"
  4. Consequences include the bad news
  5. Immutable — supersede, don't edit

basics

~20 s

An ADR is a short document recording one significant architecture decision and why it was made. Nygard's template has four sections: Context (the forces at play), Decision (what we chose), Status (proposed/accepted/superseded), and Consequences (what results, good and bad).

solid answer

~50 s

An Architecture Decision Record is a small, dated, numbered document capturing a single architecturally significant decision at the moment it is made. Michael Nygard's 2011 template has four core sections: **Status** (proposed, accepted, deprecated, superseded), **Context** (the forces — technical, organisational, budgetary — that make a decision necessary, stated neutrally as facts), **Decision** (the choice, written in active voice: "We will…"), and **Consequences** (everything that follows, positive, negative and neutral — the new constraints the team now lives under). A title line identifies the decision. ADRs live in the codebase (commonly `docs/adr/NNNN-title.md`), are versioned with the code, and form an append-only log: you do not rewrite an accepted ADR, you supersede it with a new one. Their purpose is to preserve rationale so future maintainers understand *why* the system looks the way it does, not just what it does.

code

markdown · 21 lines
markdown
# 7. Use PostgreSQL for the catalog store

## Status
Accepted (2026-02-11). Superseded by ADR-0019 (2026-07-03).

## Context
Catalog writes must be atomic across three tables. Team has strong SQL
experience, no operational experience with document stores. Managed
PostgreSQL is already part of our hosting plan at no extra cost.
Expected data volume < 50 GB for the next two years.

## Decision
We will store catalog data in PostgreSQL, accessed only through the
Catalog module's public API.

## Consequences
+ Multi-table writes get real transactions; no compensating logic.
+ Reuses existing backup/monitoring tooling.
- Every environment, including CI, now needs a PostgreSQL instance.
- Schema evolution requires reviewed migrations, slowing small changes.
- Free-text search will need a separate solution if requirements grow.

go deeper

for a junior

Name the four sections and say the point is preserving why, not what. One decision per numbered file, kept in the repo.

for a middle

Add the conventions: active-voice "We will…", neutral Context, honest negative Consequences, immutability with supersede-don't-edit, and PR review alongside the code.

for a senior

Discuss what qualifies as architecturally significant, how ADRs feed onboarding and reviews, and how the log stays alive (superseding chains, an index, periodic pruning of stale Proposed records).

for a principal

Frame ADRs as the artefact of a decision process: who may accept, how they interact with RFCs and an architecture advice process, how consequences become fitness functions or automated architecture tests, and how the log supports audits and org-wide reuse.

## The problem ADRs solve Every system carries decisions that are expensive to reverse: which data store, whether to split a service, how modules may depend on each other, what authentication scheme to use. Six months later a new engineer asks "why on earth is it done this way?" The code shows *what* was built; it almost never shows *why*, nor what was considered and rejected. Without that rationale, teams do one of two harmful things: - **Blind reversal** — they undo a decision without knowing the constraint that forced it, and rediscover the pain. - **Blind preservation** — they treat an accidental choice as sacred and build around it forever, long after the reason expired. This lost rationale is sometimes called *architectural knowledge vaporisation*. An Architecture Decision Record (ADR) is the cheapest known antidote: a one-page document per decision, written when the decision is fresh, stored next to the code. ## Definitions - **Architecture decision** — a choice that addresses a significant requirement or constrains the system's structure. "Significant" typically means costly to change later (see *architecturally significant* below). - **ADR (Architecture Decision Record)** — the document capturing exactly one such decision. - **Decision log / decision record repository** — the ordered collection of all ADRs for a system. - **Nygard template** — the original, minimal ADR format published by Michael Nygard in the 2011 post "Documenting Architecture Decisions". It is the default that most other templates (MADR, Y-statements, Tyree & Akerman) extend or compress. ## The four core sections A Nygard ADR is a small Markdown file with a title (e.g. `0007-use-postgresql-for-the-catalog.md`) and these sections: ### 1. Status Where the decision stands in its lifecycle. The usual values are **Proposed** (drafted, awaiting agreement), **Accepted** (in force), **Deprecated** (no longer recommended but nothing replaces it), **Superseded by ADR-00NN** (replaced), and sometimes **Rejected** (considered and declined — still worth keeping, because it records that the idea was evaluated). ### 2. Context The forces at play, written as **neutral facts, not as advocacy**: functional and quality requirements, team skills, existing systems, licensing costs, regulatory constraints, deadlines. A good Context is value-free — it should read the same whichever option was eventually chosen, so that a reader can judge whether the *forces* still hold today. Include the ones that pull in opposite directions; that tension is what makes the decision a decision. ### 3. Decision The choice itself, stated in **active voice, present/future tense**: "We will store catalog data in PostgreSQL and expose it only through the Catalog module's public API." Nygard's phrasing convention ("We will…") matters: it signals a commitment made by a team, not a suggestion. Keep it to a few sentences; the reasoning belongs in Context, the fallout in Consequences. ### 4. Consequences Everything that becomes true *because* of the decision — **positive, negative and neutral alike**. "We gain transactional integrity across catalog writes" sits beside "we now operate a relational database in every environment, including CI" and "schema changes require migrations reviewed by two people". The negative consequences are the most valuable part and the most frequently omitted; they are what a future reader needs in order to weigh a reversal, and they often become the Context of a later ADR. ## Practical conventions - **One decision per file.** A file covering five decisions cannot be superseded cleanly. - **Sequential numbering, never reused**, plus a short slug: `0001-record-architecture-decisions.md` (traditionally the first ADR is the decision to use ADRs at all). - **Stored in version control, in the repository the decision affects** — commonly `docs/adr/` or `doc/architecture/decisions/`. Being in git means the ADR is reviewed in the same pull request as the code that implements it, and it travels with a fork or a repo split. - **Immutable once accepted.** Edits are limited to fixing typos and changing Status/adding a link to the superseding record. To change the decision, write a *new* ADR whose Context explains what changed, and mark the old one `Superseded by ADR-00NN`. This preserves the historical reasoning — the log is a ledger, not a wiki page. - **Short.** One or two pages. If it needs ten, it is either several decisions or a design document with an ADR hiding inside it. - **Written at decision time, by the people deciding.** Retrofitting ADRs months later produces rationalisation, not rationale — though back-filling a handful of key legacy decisions is still better than nothing. ## What an ADR is not - Not a design document or spec — it records a *choice*, not a full solution. - Not a task ticket — tickets track work; ADRs track commitments and their reasons. - Not a diagram store — diagrams may be linked, but the ADR's payload is prose rationale. - Not a policy for approval gates by itself — governance (who accepts an ADR) is a separate process layered on top. ## Cost/benefit The cost is roughly 30–60 minutes of writing per significant decision. The benefit is measured years later: onboarding time, avoided re-litigation of settled questions, and the ability to answer auditors or a new CTO with "here is the reasoning, here is what we rejected". Because the cost is per *significant* decision only, the log for a mature system is usually tens of records, not hundreds.

  • Where should ADRs be stored, and why does that choice matter?
    In version control, in the repository whose architecture they constrain (typically `docs/adr/`). That keeps the record reviewable in the same pull request as the implementing code, versioned alongside it, and available offline to anyone who clones the repo — unlike a wiki, which drifts, loses permissions, and cannot be diffed against the code it describes.
  • What goes in the first ADR of a new project?
    By convention, ADR-0001 records the decision to use ADRs themselves: the context (rationale keeps getting lost), the decision (we will record architecturally significant decisions as numbered Markdown files in `docs/adr/`), and the consequences (small ongoing writing cost, need for a review step). It bootstraps the practice and demonstrates the format.

An ADR is a ship's log entry, not a map. The map (the architecture diagram) shows where you ended up; the log says "18:00, storm to the north, chose the southern passage, cost us two days but kept the cargo dry." Months later the map alone can't tell you whether the southern passage was wisdom or whim.

saying these in an interview costs you the question

  • Calling any technical choice an ADR — a library-version bump or a variable-naming rule is not architecturally significant
  • Omitting the Consequences section, or listing only the benefits (this turns an ADR into a sales pitch)
  • Editing an accepted ADR to reflect a new decision instead of superseding it, destroying the history the log exists to preserve
  • Writing Context as advocacy for the chosen option rather than as neutral forces
  • Bundling many decisions into one document so none can be superseded independently
  • Storing ADRs in a wiki or shared drive detached from the code they govern

context

open as a page

In Simon Brown's C4 model for describing software architecture, what are the four levels of diagram, and what does each level show?

level: juniorimportance: must knowfreq 72%

basics

~20 s

C4 is four zoom levels. Context: your system, its users, and neighbouring systems. Container: the separately runnable/deployable pieces (web app, API, database). Component: the major building blocks inside one container. Code: classes inside one component — usually skipped.

open as a page

What is an Architecture Decision Record (ADR), and what does a typical ADR contain?

level: juniorimportance: must knowfreq 72%

basics

~20 s

An ADR is a short document capturing one significant architecture decision: the context that forced the choice, the option chosen, and the consequences. ADRs are numbered, dated, kept in version control, and never rewritten — superseded ones stay for history.

open as a page

In the ISO/IEC 42010 conceptual model for architecture description, what is the difference between a stakeholder, a concern, an architecture viewpoint, and an architecture view?

level: juniorimportance: must knowfreq 55%

basics

~20 s

Stakeholders are people who care about the system; concerns are what they care about (cost, security, uptime). A viewpoint is a reusable template for describing one such area; a view is the actual description produced by applying that template to your system.

open as a page

In Kruchten's "4+1" view model of software architecture, what are the five views and what does each one describe?

level: juniorimportance: must knowfreq 48%

basics

~20 s

Logical view: functionality and domain structure. Process view: runtime processes, threads, concurrency. Development view: code modules, packages, build units. Physical (deployment) view: mapping software onto machines and networks. Plus Scenarios: key use cases that tie the four together.

open as a page

What are the four levels of Simon Brown's C4 model for visualising software architecture, and who is the intended audience for each?

level: juniorimportance: must knowfreq 55%

basics

~20 s

Context (the system and its users/external systems — everyone), Container (deployable/runnable units like apps, services, databases — technical staff), Component (major building blocks inside one container — developers), Code (classes inside one component — usually generated, rarely drawn).

open as a page

Why should an Architecture Decision Record document the alternatives that were rejected and the negative consequences of the chosen option, rather than just stating what was decided?

level: middleimportance: must knowfreq 55%

basics

~20 s

Because the decision alone doesn't tell future readers whether it still makes sense. Rejected options show what was already considered so nobody wastes time re-proposing them, and the negative consequences reveal the price paid — which is what you must weigh before reversing the choice.

open as a page

What does the Status field of an Architecture Decision Record track, and what is the rule about editing a record once it has been accepted?

level: middleimportance: must knowfreq 45%

basics

~20 s

Status shows where a record stands: Proposed, Accepted, Rejected, Deprecated, or Superseded by a newer record. Once accepted, the record is essentially immutable — to change the decision you write a new record and mark the old one superseded, so the history survives.

open as a page

Why are typical "boxes and lines" architecture diagrams ambiguous, and what concrete rules make a diagram self-explanatory to someone who was not in the room when it was drawn?

level: middleimportance: must knowfreq 58%

basics

~20 s

Because nothing says what a box or a line means: a box could be a service, a class, or a team; a line could be an HTTP call, a dependency, or data ownership. Fix it with titles, typed/labelled boxes, directed labelled arrows, a key, and one abstraction level.

open as a page

What is the arc42 template, and what problem does its fixed section structure solve?

level: middleimportance: must knowfreq 58%

basics

~20 s

arc42 is a free, open template for architecture documentation: twelve fixed, numbered sections covering goals, constraints, context, solution strategy, building blocks, runtime, deployment, cross-cutting concepts, decisions, quality, risks, and glossary. Fixed slots mean readers always know where to look.

open as a page

How do you identify a system's stakeholders and elicit their concerns, and how should those concerns determine which architecture views you actually produce?

level: middleimportance: must knowfreq 40%

basics

~20 s

List stakeholder classes (users, operators, developers, testers, support, acquirers, auditors), interview or workshop each to capture what worries them, turn vague wishes into measurable scenarios, then produce only the views that answer a real, prioritized concern — and skip the rest.

open as a page

In the Rozanski & Woods approach to describing software architecture, what is the difference between a viewpoint and a perspective, and why did they add perspectives on top of viewpoints?

level: middleimportance: must knowfreq 45%

basics

~20 s

A viewpoint gives you one structural slice of the system (functional, information, deployment...). A perspective is a quality property such as security or performance that cuts across many of those slices, so you apply it to several views rather than drawing a separate "security view".

open as a page

Architecture documentation always drifts out of date. What concrete mechanisms keep it current, and what are their limits?

level: seniorimportance: must knowfreq 54%

basics

~20 s

Keep docs in the repo next to the code and review them in the same pull requests (docs-as-code). Generate what can be generated — dependency and deployment diagrams from code and infrastructure files. Enforce structural rules with automated tests so violations fail the build, not the reader.

open as a page

You are asked to document the architecture of a new system and you can only produce three artefacts. How do you decide which views to write, and how do you match each to a stakeholder concern?

level: seniorimportance: must knowfreq 38%

basics

~20 s

Start from stakeholders and the questions they actually ask, not from a diagram template. Pick the views that answer the highest-risk or most-asked questions — usually a context/container-style structural view, a deployment view, and a walkthrough of one or two critical scenarios.

open as a page

Which UML diagram types remain genuinely useful for describing software architecture, what does each one express, and how do they relate to C4?

level: middleimportance: should knowfreq 45%

basics

~20 s

Mainly three: component diagrams (units of functionality and the interfaces they provide/require), deployment diagrams (which artefacts run on which nodes), and sequence diagrams (the ordered messages of one scenario over time). They map onto C4's component, deployment, and dynamic views.

open as a page

In ISO/IEC/IEEE 42010, what is the difference between a viewpoint and a view, and how do stakeholders and concerns drive them?

level: middleimportance: should knowfreq 34%

basics

~20 s

A viewpoint is the reusable rulebook — which concerns it addresses, what notation and model kinds to use. A view is the actual result of applying that rulebook to one system. Viewpoints are chosen because identified stakeholders have identified concerns.

open as a page

What is the difference between a view and a viewpoint in an architecture description (as defined by ISO/IEC/IEEE 42010)?

level: middleimportance: should knowfreq 32%

basics

~20 s

A viewpoint is the reusable template: which stakeholders and concerns it serves, what notation and rules to use. A view is the actual result of applying that template to one specific system — the concrete diagram plus its supporting text.

open as a page

How does the MADR (Markdown Any Decision Records) template differ from Michael Nygard's original four-section ADR template, and when would you choose each?

level: seniorimportance: should knowfreq 28%

basics

~20 s

Nygard's template is minimal: Status, Context, Decision, Consequences. MADR adds explicit structure for the evaluation — decision drivers (the criteria), a list of considered options with pros and cons for each, and the outcome with its justification. Use Nygard for speed, MADR when the comparison itself matters.

open as a page

How do you decide whether something is "architecturally significant" enough to warrant an Architecture Decision Record, and how do you stop the decision log from going stale?

level: seniorimportance: should knowfreq 38%

basics

~20 s

Write a record when the choice is costly to reverse, affects more than one team or module, or trades off a quality attribute like performance or security. Keep the log alive by writing records at decision time, reviewing them in the same pull request as the code, and superseding rather than ignoring outdated ones.

open as a page

What is the difference between diagram-based tools and model-based ("diagrams as code") tooling such as PlantUML and Structurizr, and what do you gain and lose by adopting a single-model approach?

level: seniorimportance: should knowfreq 36%

basics

~20 s

Drawing tools store pictures, so the same service exists five times and updates get missed. Model-based tools store one definition of elements and relationships, then render multiple views from it. PlantUML is scripted-per-diagram text; Structurizr holds a real model with views.

open as a page

What are the three view types in the SEI "Views and Beyond" approach, and what does "beyond views" refer to?

level: seniorimportance: should knowfreq 26%

basics

~20 s

Views and Beyond groups architecture views into three types: module (units of implementation), component-and-connector (runtime elements and their interactions), and allocation (mapping software to environments — deployment, install, work assignment). "Beyond views" is the cross-view information: how views relate, rationale, and a documentation roadmap.

open as a page

You are documenting a mid-size system and want a "minimum yet sufficient" architecture description. How do you decide how many views to produce, at what depth, and in what notation for each audience?

level: seniorimportance: should knowfreq 30%

basics

~20 s

Derive views from prioritized stakeholder concerns rather than from a template: one view per live, high-priority concern cluster. Go deep only where risk is high, keep the notation simple enough for the intended reader, and delete anything nobody would act on.

open as a page

Architecture diagrams famously go stale. What causes drift between views and the real system, and what mechanisms keep multiple views consistent with each other and with reality?

level: seniorimportance: should knowfreq 30%

basics

~20 s

Diagrams drift because they are separate hand-maintained artefacts with no owner and no update trigger, while code changes daily. Fixes: keep few, high-level views; store the model as code next to the source; generate volatile detail; check correspondences automatically.

open as a page

As a technical leader, how do you stop architecture diagrams from becoming stale and misleading across many teams — which diagrams do you maintain, which do you generate, and which do you deliberately throw away?

level: principalimportance: should knowfreq 22%

basics

~20 s

Keep few diagrams, store them as text beside the code, and review them in the same pull request as the change. Generate the volatile low-level ones from code and infrastructure; throw away workshop sketches; delete anything nobody maintains rather than leaving it wrong.

open as a page

Two stakeholder groups raise concerns that pull the architecture in opposite directions — for example a compliance officer demanding full encryption and immutable audit of every transaction, and a trading desk demanding sub-millisecond latency. How do you resolve that, and what do you record?

level: principalimportance: should knowfreq 35%

basics

~20 s

Do not average the two. Make both concerns measurable, separate hard constraints (law, safety) from negotiable targets, scope the design so each need is met where it applies, let the accountable sponsor rank what remains, then record the decision, the rejected option, and the residual risk.

open as a page

Beyond the four static C4 levels, what do C4's supplementary dynamic and deployment diagrams add, and what question does each answer that a container diagram cannot?

level: seniorimportance: nice to knowfreq 24%

basics

~20 s

A container diagram shows what exists and what talks to what, but not order or placement. A dynamic diagram numbers the steps of one scenario over time; a deployment diagram maps containers onto infrastructure nodes, showing environments and how many instances run.

open as a page

How do you scale architectural decision-making across many teams without either a bottlenecked central architecture board or uncoordinated local choices — and where do decision records fit?

level: principalimportance: nice to knowfreq 20%

basics

~20 s

Let the teams closest to the work decide, but require them to seek advice from everyone affected and from people with relevant expertise before deciding, and to write the decision down. A central board reviews patterns and standards, not every choice.

open as a page

You own architecture documentation standards across many teams. How do you decide what is mandatory, and how do you know the documentation is actually working?

level: principalimportance: nice to knowfreq 18%

basics

~20 s

Mandate only what has a named reader and a real consequence: system context, external contracts, decisions, and quality goals. Standardise structure and location, not depth. Measure by outcomes — onboarding time, questions asked, incident-time lookups — not by page counts or compliance ticks.

open as a page

An architecture description contains several views produced from different viewpoints. ISO/IEC 42010 asks you to record "correspondences", "correspondence rules", and architecture rationale. What are these, and what problem do they solve?

level: principalimportance: nice to knowfreq 15%

basics

~20 s

Correspondences are recorded relationships between elements in different views; correspondence rules are constraints those relationships must satisfy. Together they stop multi-view descriptions from silently contradicting each other. Rationale records why decisions were made, including rejected alternatives.

open as a page

4+1 and C4 are both viewpoint sets. When would you extend or replace them with additional views, and what governs adding a new view to your organisation's standard set?

level: principalimportance: nice to knowfreq 18%

basics

~20 s

Add a view only when a real stakeholder concern is unanswered by the existing set and cannot be answered by annotating an existing view — for example data residency, concurrency in a real-time system, or a safety case. Otherwise standardise and keep the set small.

open as a page