-
Notifications
You must be signed in to change notification settings - Fork 8
Condense ADR-000 #87
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
carbolymer
wants to merge
1
commit into
main
Choose a base branch
from
mgalazyn/slim-down-adr000
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Condense ADR-000 #87
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,65 +1,58 @@ | ||
| # ADR-000: Documenting Architecture Decisions | ||
|
|
||
| # Status | ||
|
|
||
| ✅ Adopted 2022-12-17 | ||
|
|
||
| # Context | ||
|
|
||
| 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. | ||
|
|
||
| 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. | ||
|
|
||
| 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. | ||
|
|
||
| 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: | ||
|
|
||
| 1. **Blindly accept the decision.** | ||
|
|
||
| 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. | ||
|
|
||
| 2. **Blindly change it.** | ||
|
|
||
| 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.) | ||
| In agile projects, architecture decisions are made incrementally rather than up front. | ||
| Large documentation is rarely read or maintained, so small, modular documents are preferable. | ||
|
|
||
| It's better to avoid either blind acceptance or blind reversal. | ||
| One of the hardest things to track during a project's life is the motivation behind certain decisions. | ||
| Without understanding the rationale, newcomers either blindly accept decisions (risking stagnation) or blindly change them (risking unintended damage). | ||
| It's better to avoid both. | ||
|
|
||
| # Decision | ||
|
|
||
| We will keep a collection of records for "architecturally significant" decisions: those that affect the structure, non-functional characteristics, dependencies, interfaces, or construction techniques. | ||
| Each record describes a set of forces and a single decision in response to those forces. | ||
|
|
||
| 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. | ||
| We will keep ADRs in the project wiki under https://github.com/input-output-hk/cardano-node-wiki/wiki/Architecture-Decision-Records using Markdown. | ||
carbolymer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ADRs will be numbered sequentially and monotonically. | ||
| Numbers will not be reused. | ||
| If a decision is reversed, we will keep the old one around, but mark it as superseded. | ||
|
|
||
| We will keep ADRs in the project wiki under https://github.com/input-output-hk/cardano-node-wiki/wiki/Architecture-Decision-Records | ||
| Each ADR will use the following format: | ||
|
|
||
| We should use a lightweight text formatting language like Markdown. | ||
| - **Title** — A short noun phrase. For example, "ADR-001: Deployment on Ruby on Rails 3.0.10". | ||
| - **Status** — One of: "Proposed" 📜, "Adopted" ✅, "Rejected" ❌, "Deprecated" 🗑️, or "Superseded" ⬆️ (with a reference to its replacement). | ||
| - **Context** — The forces at play (technological, political, social, project local), described in value-neutral language. | ||
carbolymer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| - **Decision** — Our response to these forces, stated in full sentences with active voice. "We will ..." | ||
| - **Alternatives Considered** — Other options that were evaluated and the reasons they were not chosen. | ||
| - **Consequences** — The resulting context after applying the decision, including positive, negative, and neutral consequences. | ||
| - **References** — Links to relevant research, documentation, RFCs, or prior ADRs that informed the decision. | ||
| - **Authors** — Who proposed and approved the decision. | ||
|
|
||
| ADRs will be numbered sequentially and monotonically. Numbers will not be reused. | ||
| We should aim to keep each ADR concise. | ||
| Each ADR should be written as a conversation with a future developer, using full sentences organized into paragraphs. | ||
|
|
||
| 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 was the decision, but is no longer the decision.) | ||
| # Alternatives Considered | ||
|
|
||
| We will use a format with just a few parts, so each document is easy to digest: | ||
|
|
||
| **Title** 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" | ||
|
|
||
| **Status** A decision may be "proposed" 📜 if the project stakeholders haven't agreed with it yet, "accepted" ✅ once it is agreed or "rejected" ❌ if not. If a later ADR changes or reverses a decision, it may be marked as "deprecated" 🗑️ or "superseded" ⬆️ with a reference to its replacement. | ||
|
|
||
| **Context** 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. | ||
|
|
||
| **Decision** This section describes our response to these forces. It is stated in full sentences, with active voice. "We will …" | ||
|
|
||
| **Consequences** 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. | ||
|
|
||
| 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.) | ||
| We considered not documenting decisions at all, relying on tribal knowledge and code comments. | ||
| This fails as team composition changes and institutional memory is lost. | ||
| We also considered using a traditional architecture document, but large documents are rarely kept up to date or read. | ||
|
|
||
| # Consequences | ||
|
|
||
carbolymer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| 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. | ||
| The consequences of one ADR are very likely to become the context for subsequent ADRs. | ||
| Developers and project stakeholders can see the ADRs even as team composition changes over time, making the motivation behind previous decisions visible for everyone, present and future. | ||
|
|
||
| # References | ||
|
|
||
| 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. | ||
| - Michael Nygard, [Documenting Architecture Decisions](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions) | ||
|
|
||
| Developers and project stakeholders can see the ADRs, even as the team composition changes over time. | ||
| # Authors | ||
|
|
||
| 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. | ||
| - John Ky (initial version) | ||
| - Mateusz Galazyn (trimmed down and added new sections) | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| # Status | ||
|
|
||
| ✅ Accepted 2025-02-21 | ||
| ✅ Adopted 2025-02-21 | ||
|
|
||
| # Context | ||
|
|
||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| # Status | ||
|
|
||
| -[x] Accepted 2025-03-13 | ||
| ✅ Adopted 2025-03-13 | ||
|
|
||
| # Context | ||
|
|
||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| # Status | ||
|
|
||
| ✅ Accepted 2025-03-11 | ||
| ✅ Adopted 2025-03-11 | ||
|
|
||
| # Context | ||
|
|
||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -12,7 +12,7 @@ | |
| ## Legend | ||
|
|
||
| * 📜 Proposed | ||
| * ✅ Accepted | ||
| * ✅ Adopted | ||
| * ❌ Rejected | ||
| * 🗑️ Deprecated | ||
| * ⬆️ Superseded | ||
|
|
||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.