|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- title: Documenting Architecture Decisions
- url: http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions
- hash_url: 011e34ad5c059996409dc1ee3caa6b17
-
- <h1>Context</h1>
-
- <p>Architecture for agile projects has to be described and defined
- differently. Not all decisions will be made at once, nor will all of
- them be done when the project begins.</p>
-
- <p>Agile methods are not opposed to documentation, only to valueless
- documentation. Documents that assist the team itself can have value,
- but only if they are kept up to date. Large documents are never kept
- up to date. Small, modular documents have at least a chance at being
- updated.</p>
-
- <p>Nobody ever reads large documents, either. Most developers have been
- on at least one project where the specification document was larger
- (in bytes) than the total source code size. Those documents are too
- large to open, read, or update. Bite sized pieces are easier for for
- all stakeholders to consume.</p>
-
- <p>One of the hardest things to track during the life of a project is the
- motivation behind certain decisions. A new person coming on to a
- project may be perplexed, baffled, delighted, or infuriated by some
- past decision. Without understanding the rationale or consequences,
- this person has only two choices:</p>
-
- <ol>
- <li><p><strong>Blindly accept the decision.</strong> </p>
-
- <p>This response may be OK, if the decision is still valid. It may
- not be good, however, if the context has changed and the decision
- should really be revisited. If the project accumulates too many
- decisions accepted without understanding, then the development
- team becomes afraid to change anything and the project collapses
- under its own weight.</p></li>
- <li><p><strong>Blindly change it.</strong></p>
-
- <p>Again, this may be OK if the decision needs to be reversed. On the
- other hand, changing the decision without understanding its
- motivation or consequences could mean damaging the project's
- overall value without realizing it. (E.g., the decision supported
- a non-functional requirement that hasn't been tested yet.)</p></li>
- </ol>
-
- <p>It's better to avoid either blind acceptance or blind reversal.</p>
-
- <h1>Decision</h1>
-
- <p>We will keep a collection of records for "architecturally significant"
- decisions: those that affect the structure, non-functional
- characteristics, dependencies, interfaces, or construction techniques.</p>
-
- <p>An architecture decision record is a short text file in a format
- similar to an Alexandrian pattern. (Though the decisions themselves
- are not necessarily patterns, they share the characteristic balancing
- of forces.) Each record describes a set of forces and a single
- decision in response to those forces. Note that the decision is the
- central piece here, so specific forces may appear in multiple ADRs.</p>
-
- <p>We will keep ADRs in the project repository under doc/arch/adr-NNN.md</p>
-
- <p>We should use a lightweight text formatting language like Markdown or
- Textile.</p>
-
- <p>ADRs will be numbered sequentially and monotonically. Numbers will not
- be reused.</p>
-
- <p>If a decision is reversed, we will keep the old one around, but mark
- it as superseded. (It's still relevant to know that it <em>was</em> the
- decision, but is <em>no longer</em> the decision.)</p>
-
- <p>We will use a format with just a few parts, so each document is easy
- to digest. The format has just a few parts.</p>
-
- <p><strong>Title</strong> These documents have names that are short noun phrases. For
- example, "ADR 1: Deployment on Ruby on Rails 3.0.10" or "ADR 9: LDAP
- for Multitenant Integration"</p>
-
- <p><strong>Context</strong> This section describes the forces at play, including
- technological, political, social, and project local. These forces are
- probably in tension, and should be called out as such. The language in
- this section is value-neutral. It is simply describing facts.</p>
-
- <p><strong>Decision</strong> This section describes our response to these forces. It
- is stated in full sentences, with active voice. "We will ..."</p>
-
- <p><strong>Status</strong> A decision may be "proposed" if the project stakeholders
- haven't agreed with it yet, or "accepted" once it is agreed. If a
- later ADR changes or reverses a decision, it may be marked as
- "deprecated" or "superseded" with a reference to its replacement.</p>
-
- <p><strong>Consequences</strong> This section describes the resulting context, after
- applying the decision. All consequences should be listed here, not
- just the "positive" ones. A particular decision may have positive,
- negative, and neutral consequences, but all of them affect the team
- and project in the future.</p>
-
- <p>The whole document should be one or two pages long. We will write each
- ADR as if it is a conversation with a future developer. This requires
- good writing style, with full sentences organized into
- paragraphs. Bullets are acceptable only for visual style, not as an
- excuse for writing sentence fragments. (Bullets kill people, even
- PowerPoint bullets.)</p>
-
- <h1>Status</h1>
-
- <p>Accepted.</p>
-
- <h1>Consequences</h1>
-
- <p>One ADR describes one significant decision for a specific project. It
- should be something that has an effect on how the rest of the project
- will run.</p>
-
- <p>The consequences of one ADR are very likely to become the context for
- subsequent ADRs. This is also similar to Alexander's idea of a pattern
- language: the large-scale responses create spaces for the smaller
- scale to fit into.</p>
-
- <p>Developers and project stakeholders can see the ADRs, even as the team
- composition changes over time.</p>
-
- <p>The motivation behind previous decisions is visible for everyone,
- present and future. Nobody is left scratching their heads to
- understand, "What were they thinking?" and the time to change old
- decisions will be clear from changes in the project's context.</p>
-
- <hr/>
-
- <h1>Experience Report</h1>
-
- <p>You may have noticed that this post is formatted like an ADR
- itself. We've been using this format on a few of our projects since
- early August. That's not a very long time in the global sense, but
- early feedback from both clients and developers has been quite
- positive. In that time, we've had six to ten developers rotate through
- projects using ADRs. All of them have stated that they appreciate the
- degree of context they received by reading them.</p>
-
- <p>ADRs have been especially useful for capturing longer-term
- intentions. We have several clients who are stabilizing their current
- systems, but looking toward a larger rearchitecture in the
- not-too-distant future. By writing these intentions down, we don't
- inadvertently make those future changes harder.</p>
-
- <p>One potential objection is that keeping these in version control with
- the code makes them less accessible for project managers, client
- stakeholders, and others who don't live in version control like the
- development team does. In practice, our projects almost all live in
- GitHub private repositories, so we can exchange links to the latest
- version in master. Since GitHub does markdown processing
- automatically, it looks just as friendly as any wiki page would.</p>
-
- <p>So far, ADRs are proving to be a useful tool, so we'll keep using
- them.</p>
-
- <h1>More Reading</h1>
-
- <p>Thanks to Philipe Kruchten for discussing the <a href="http://www.computer.org/portal/web/csdl/doi/10.1109/MS.2009.52">importance of
- architecture decisions</a>. I'm
- told there is more about them in
- <a href="http://www.sei.cmu.edu/library/abstracts/books/0321552687.cfm">Documenting Software Architectures</a>
- which is near the top of my reading queue.</p>
|