Skip to main content
Test Double company logo
Services
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Management
Launch modern product orgs
Legacy Modernization
Renovate legacy software systems
DevOps
Scale infrastructure smoothly
Upgrade Rails
Update Rails versions seamlessly
Technical Recruitment
Build tech & product teams
Technical Assessments
Uncover root causes & improvements
Case Studies
Solutions
Accelerate Quality Software
Software Delivery, DevOps, & Product Delivery
Maximize Software Investments
Product Performance, Product Scaling, & Technical Assessments
Future-Proof Innovative Software
Legacy Modernization, Product Transformation, Upgrade Rails, Technical Recruitment
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say Hello
Test Double logo
Menu
Services
BackGrid of dots icon
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Management
Launch modern product orgs
Legacy Modernization
Renovate legacy software systems
Cycle icon
DevOps
Scale infrastructure smoothly
Upgrade Rails
Update Rails versions seamlessly
Technical Recruitment
Build tech & product teams
Technical Assessments
Uncover root causes & improvements
Case Studies
Solutions
Solutions
Accelerate Quality Software
Software Delivery, DevOps, & Product Delivery
Maximize Software Investments
Product Performance, Product Scaling, & Technical Assessments
Future-Proof Innovative Software
Legacy Modernization, Product Transformation, Upgrade Rails, Technical Recruitment
About
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say hello
Developers
Developers
Developers
DevOps & security

Architecture Decision Records help you, your team, and future teams

Ever wondered why a past decision was made on your project? Architecture Decision Records (ADRs) capture the whys, making your team more efficient and informed.
Pam-Marie Guzzo
Kyle Adams
|
March 29, 2022
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Over and over again the same story plays out. A new developer joins the team, takes one look at a repo, and asks the inevitable question: “WHY?!”

Most of the time there is no answer – the original creators are long gone, or it was so long ago no one remembers, or the decision was dictated and no one thought to (or was comfortable enough to) question it at the time. With no satisfactory answer available, the next inevitable thing happens: “Well, should we revisit this or fix it?” Queue the long arguments about effort, cost, time, and priorities!

We’re here to tell you that there’s another way. A way that can foster discussion, record the whys, and let Future You and Future New Person know exactly what the team was thinking when the decision was made. Architecture Decision Records (henceforth referred to as ADRs to save us some typing) are here to save the day!

The basics of Architecture Decision Records

A favourite place to send people to when introducing the subject of architecture decision records is Joel Parker Henderson’s ADR repo. He includes a list of starting templates that can help with initial understanding, but you’ll want to customize and iterate on your team’s template as you get used to the format.

That said, here’s an example—based on the MADR template—we’ll walk through:

# Improve morale with rainbow emojis 🌈🌈
​
- Status: accepted
- Deciders: Kyle Adams
- Date: 2022-03-03
​
# Context and problem statement
​
As Yoda, speaking in haiku form, would say:

Docs lead to boredom
Boredom leads to dev sadness
Sad devs to exit

How do we improve developer morale?
​
# Considered options
​
- Bouncy houses
- Free ice cream for life
- Rainbow emojis 🌈🌈
​
# Decision outcome
​
We chose the option: "Rainbow emojis 🌈🌈", because:
​
- Emojis are cheap
- Rainbows are the exact opposite of gloomy
- Documentation with emojis is proven to be 100% more engaging

‍The first section is relatively self-explanatory: you want a clear title, the status of the decision (ie draft, review, accepted), the people who own the decision (although the entire team is ideally part of the discussion), and the date the decision was made. Next, let’s review the other sections and why they are critical components to architecture decision records.

Context and problem statement

The context and problem statement is probably the most important part of the entire document. This is where you explain what the problem is and why it’s a problem. As developers, we should always strive to know why we’re taking any action. After all, if we don’t know why we’re doing something, why would we do it?

A woman holding her hands up, palms spread, expressing uncertainty
   Photo by Wayhome Studio

It’s possible you may be trying to fill in ADRs for older decisions to backfill this kind of documentation. Generally, we don’t recommend going too far back, but if you feel you have to you’ll likely need to do some code and task spelunking to fill this section out.

Worst case scenario, you might be stuck putting in a “best guess” on the original problem statement. That’s okay, but if that’s the case you should add a small disclaimer saying that the original problem and context has been lost to time.

For new decisions, try to be as clear as possible. This is one place it’s better to have too many details than not enough.

Try to put yourself in the mind of a brand-new employee or product owner who is trying to develop an understanding while onboarding.

Don’t bother being overly technical – this occasionally leads to dictating how the problem should be solved, and we want to avoid that. Instead, focus on giving the decision real meaning for every member of the team.

Options to build out ADRs

There are a couple of options around how to build out ADRs that are likely to affect these sections.

For example, if you’re having a meeting to discuss the problem, the Considered Options section might be a rather large collection of notes from the discussion. If you’re creating ADRs in a repo and having asynchronous comments feeding the decision, this section is more likely to be a very small summary of the main options, since anyone can go to the original Peer Review and see the full discussion.

For Decision Outcome, again there are options. Some teams like to split this out into three sections, detailing the final decision, positive impacts, and consequences separately. Other teams like to use this section to link to any related Peer Reviews or task items that were created as a result of the discussion. It’s really up to what’s most useful for the team and for new members coming in.

Where should Architecture Decision Records live?

As with all process items, where these records live is really up to the team. That said, there are a few things that should be considered:

  •  Can anyone find and search the records easily?
  •  How close to the impacted item can we place them (e.g. in the same repo in a /decisions/ folder)?
  •  Do we need different places based on the type of decision (e.g. a shared drive if the decision impacts multiple teams or repos)?
  •  Is it easy to change and comment on the documents once created?
  •  Can we add pictures and diagrams easily?

Generally, you’ll see repo-specific decisions in the repo they relate to and team-wide decisions wherever other team-wide documentation lives. There are also a bunch of tools that allow you to organize and deploy ADRs in various ways, often ending in them being published to GitHub Pages or something similar.

Which decisions do we write these for?

This will change depending on where your team is in their lifecycle and where your products are in theirs. If it’s a brand-new team, you can use ADRs to ease the storming stage as a guide to work through decisions around processes, preferences, tools, codes of conduct, etcetera! There are always a ton of decisions and discussions when an engineering team is new, and architecture decision records can help the team codify all those decisions.

If you’re starting a new repo or product, you can use ADRs when picking everything from data storage to language and frameworks to linters! Capturing these decisions and the reasons behind them is a huge win for anyone who ever joins your team in the future, and may even be able to inform your manager’s hiring decisions.

For example, in an interview, you could give a potential candidate the Context and Problem Statement for something you already have an ADR for and see if they come to the same ideas – or think of something your team missed entirely!

For long-running products, ADRs can come in handy when talking through major refactors, tool additions, or major new features the business wants to add. You’ll want to be more nuanced in what you use ADRs for here. The goal is to make decisions easier for the team to agree on and understand, not bury the team under documentation and process.

In all of this advice, the key thing to remember is the first tenet of Agile: People before Process.

Related Insights

🔗
How to balance software architecture goals with limited resources
🔗
How to trust again

Explore our insights

See all insights
Leadership
Leadership
Leadership
Why we coach the system, not just the team

Slow delivery isn’t usually about your people—it’s about your system. Shifting focus to incremental improvements in the system helps change not just processes but behaviors for lasting change.

by
Doc Norton
Developers
Developers
Developers
Developer QA checklist for feature releases

Quality Assurance is a mindset integrated throughout development to catch issues early, build user trust, and reduce maintenance costs. These recommended procedures for dev teams without dedicated QA roles establish collective responsibility for ensuring feature stability, functionality, and usability before release.

by
Lee Quarella
Developers
Developers
Developers
From engineer to consultant: The powerful shift from inward to outward focus

What transforms a skilled software engineer into an exceptional consultant? Approach new codebases with respect rather than judgment, embrace constraints as creative boundaries, and prioritize client needs over personal preferences.

by
Dave Mosher
Letter art spelling out NEAT

Join the conversation

Technology is a means to an end: answers to very human questions. That’s why we created a community for developers and product managers.

Explore the community
Test Double Executive Leadership Team

Learn about our team

Like what we have to say about building great software and great teams?

Get to know us
No items found.
Test Double company logo
Improving the way the world builds software.
What we do
Services OverviewSoftware DeliveryProduct ManagementLegacy ModernizationDevOpsUpgrade RailsTechnical RecruitmentTechnical Assessments
Who WE ARE
About UsCulture & CareersGreat CausesEDIOur TeamContact UsNews & AwardsN.E.A.T.
Resources
Case StudiesAll InsightsLeadership InsightsDeveloper InsightsProduct InsightsPairing & Office Hours
NEWSLETTER
Sign up hear about our latest innovations.
Your email has been added!
Oops! Something went wrong while submitting the form.
Standard Ruby badge
614.349.4279hello@testdouble.com
Privacy Policy
© 2020 Test Double. All Rights Reserved.