adr.zone

Why the “Why” Gets Lost in Software Projects

A straight take on decision context: what actually happens in repos, reviews, and docs.

We are good at seeing what changed. Git gives you a timeline; diffs show the edit. Pull requests often show how something was implemented—at least for the lines touched in that slice. What we are bad at, as an industry, is answering a different question months later: why did it end up this way? That gap is why code is hard to understand even when the repository looks healthy on the surface.

Where teams think the “why” lives

“The why is in tickets.” Sometimes true on day one. Rarely true a year later. Tickets get closed, renamed, split, or lost in a migration. The comment that carried the nuance is on issue #4812; the code now lives in a service whose name no one remembers to search for.

“The why is in commit messages.” A few teams actually write them. Most write fix or reference a ticket ID without restating the tradeoff. Squash merges and rebases make the story even thinner.

“The code is self-documenting.” It documents behavior, not intent. Two implementations can behave the same and exist for different reasons—compliance lock-in, migration staging, a temporary cap on scope. The behavior will not tell you which one you are looking at.

“PR discussions capture decisions.” They capturesome of what the reviewers noticed in a narrow window. They rarely capture the hallway conversation, the product constraint that never made it into a comment, or the decision to ship now and file debt that never got a follow-up issue.

Why those systems break

Decisions are not a single event. They stretch: you learn during implementation, the “simple” API hits an edge case, the org changes the deadline. The final code reflects a path, not a moment—and the paper trail is spread across three Slack threads, a design doc with “WIP” in the title, and a hotfix branch merged on a Friday.

Links rot. A Jira project moves. Slack retention eats the thread. A wiki page still exists but describes an architecture you already retired. That is not laziness; it is systems under load. This is a big part of why documentation fails in the places people expect it: the org updates the system of record, not the paragraph someone wrote under pressure in week two of a quarter.

Reasoning gets fragmented. One person holds the “real” reason in their head. A second person ships a workaround that was supposed to be temporary. A third person fixes a bug without knowing the original constraint. None of that is visible in a clean linear graph.

The shift in the AI era

Tools that generate or refactor code can shorten the path from idea to diff. The side effect, in many teams, is larger pull requests, faster churn, and reviews that look more like spot checks than full comprehension. A reviewer who once tried to read every line now skims for plausibility—wrong imports, obvious security footguns—because the alternative does not fit the calendar. That is a code review problem in the practical sense: the gate still exists, but the depth of shared understanding thins.

Summaries and automated commentary tell you what changed in prose, notwhy the team considered it good enough. If you are looking for a tight causal story of software architecture decisions, a summary of the diff is a different artifact from the decision that justified merging it.

The real problem

The problem is not simply “we need more documentation.” People write docs. They write tickets. The failure mode is a mismatch: decisions happen in chat, in stand-ups, in pairing sessions, in the middle of a branch—and the org still expects a stable narrative to show up in the ticket, the wiki, or the top commit on main. When those places diverge, the “why” does not exist in zero places; it exists in the wrong shape for the person reading the code in year two.

Why this matters

Where ADRs fit

An Architecture Decision Record is one way to put software architecture decisions next to the system they affect, in a small file, with a stable shape: what is an ADR, in a sentence, is a record of a single decision and its costs—not a design novel.

It is not magic. A rushed ADR that restates a title bar is as thin as a bad commit message. It helps when someone writes it at the point of decision—when the tradeoff is still legible—rather than as a post-hoc cover sheet after the code ships.

For formats and copy-paste scaffolds, see the templates and examples. If you use assistants in your workflow, our ADRs and LLM-assisted development page is about keeping human intent in the loop—not about replacing review.

What would actually help

Honest systems acknowledge where decisions are made, then add the lightest durable record in that same motion—not a week later in a different tool. The goal is not a longer wiki. The goal is fewer mismatches between the moment a constraint becomes real and the moment the next person can see it in context, without a scavenger hunt.