Writing Engineering Docs That People Actually Read
Most engineering documentation is a wiki nobody opens. Here's what makes docs useful to the next engineer, including your future self.
Every startup has a wiki. Almost none of them get read. Engineers write pages nobody opens, review pages that are already outdated, and eventually give up. Then a new hire joins and asks a question already answered on page 47, which nobody remembers writing.
Writing engineering documentation that people actually read isn't about tooling — Notion, Confluence, Markdown, all fine. It's about knowing which docs matter, keeping them short, and updating the ones people actually hit. This post is the version of internal documentation that survives a two-person startup and still works at twenty.
The problem with most engineering docs
The failure mode is universal. Someone writes a comprehensive doc when a feature ships. It's 3,000 words, has diagrams, and covers every edge case. Three months later half of it is wrong, and the person who wrote it has left.
The doc goes stale, nobody trusts it, and the team gives up on documentation. The next feature ships without any docs at all, and the cycle repeats.
Long docs written once are the enemy. Short docs updated often are the goal.
The four docs every startup needs
Almost every internal doc worth reading falls into one of these categories. Everything else is filler.
1. The onboarding doc
One page. How to get the codebase running, what tools to install, which Slack channels to join, who owns what. Written for a new engineer on day one.
The test: can a new hire get the app running locally in under two hours using only this doc? If not, it's incomplete. If yes, it's doing its job.
2. Runbooks for specific incidents
Short docs for things that go wrong. "What to do when the payment webhook fails." "How to restart the queue worker." "How to roll back a bad deploy."
Each runbook covers one problem, in one page, with concrete steps. A new engineer on call at 2am should be able to follow it without asking anyone. If it's more than a page, it's probably two runbooks.
3. Architecture overviews
One page per major service or system. What it does, what it talks to, where the source lives, who to ask when it breaks. Not exhaustive — just enough for a new engineer to know where to look.
Big architecture diagrams die fast. Small ones with three boxes and two arrows live forever.
4. Decision records
Short notes documenting why a choice was made. "We picked Postgres over MongoDB because…" "We turned off SSR because…" These are the docs future engineers thank you for, because they explain the current shape of the code without requiring an archaeology dig.
The format that works: date, decision, alternatives considered, why we picked this one. Under 300 words each. A folder of these becomes the actual history of the codebase.
What to stop writing
Three categories of doc that consistently go unread.
Auto-generated API documentation
If the docs come from code annotations, nobody reads them. They're technically correct and practically useless. Better to have hand-written examples of common calls than a giant reference.
Long feature specs after the feature is built
A spec written before shipping is planning. A spec written after shipping is fiction. It documents an intent that may or may not match what actually got built.
Instead, write a short summary of what the feature does when it ships. Two paragraphs, links to the code, done.
Style guides longer than a page
Nobody reads a 30-page style guide. Everyone reads a one-page cheat sheet. If your rules don't fit on a page, you have too many rules.
Writing docs people actually finish
The mechanics of docs that get read are boring.
Front-load the answer
The first sentence should tell the reader what they'll get from the page. Not "This document covers the payment integration architecture." Just "The payment webhook sometimes fails when Stripe retries. Here's how to fix it."
Engineers skim. Docs that don't reveal their point in the first sentence get closed.
Write for the person who's tired
The reader is stressed, on call, or new. They don't want context — they want the answer. Cut every sentence that isn't the answer or a step toward it.
Use code blocks generously
A code snippet is worth ten sentences of description. If a doc explains how to run something, the exact command belongs in a code block near the top.
Update dates matter
Every doc should have a "last updated" date near the top. When it's more than six months old, a reader can decide how much to trust it. Docs without dates are dangerous.
Keeping docs alive
Writing is the easy part. Keeping docs current is where most systems fail.
Own docs like code
Every doc has an owner. When their feature changes, they update the doc. Not a separate step — part of shipping the change. If a PR changes behavior that a doc describes, the doc update goes in the same PR.
Delete more than you write
Stale docs are worse than no docs. They tell readers wrong things confidently. Every quarter, delete anything that's clearly outdated and nobody's owned in six months.
Fold docs into onboarding
When a new hire ramps, note every question they had to ask a human because the doc was missing or wrong. Fix those docs while it's fresh. New hires are your best doc auditors.
What good docs look like for AI features
AI features have their own docs needs. Model choices, prompt versions, eval baselines. These change often and matter a lot.
What we track for every AI feature we ship: which model is currently in use, why we picked it, what prompt version is live, and what the current eval scores are. When any of those change, the doc changes. When a model regresses, we can see what shifted.
Our prompt ops post covers this in more depth.
Trade-offs
Writing docs takes time. For a two-person team shipping fast, over-documenting can slow you down. The right balance shifts over the life of a startup.
Pre-launch: minimal docs. A README, a runbook or two, that's it. You're changing everything constantly.
Post-launch, pre-second-hire: a onboarding doc, a couple of runbooks, decision records for the biggest choices. Enough to onboard the next person.
Post-second-hire: real ownership, real update discipline, real deletion of stale content. This is where the system either becomes durable or dies.
Common misconceptions
"Documentation is a nice-to-have." It becomes essential the moment your team has more than one person, or the moment your one engineer takes a vacation. Every hour of docs pays back in hours of not answering the same Slack question.
"AI will read our codebase and answer questions." AI coding assistants help, but they read what's there. If the "why" of a decision only lives in the head of the engineer who left, no AI recovers it.
"We need a fancy tool for docs." You don't. Markdown files in your repo work. Notion works. Confluence works. The tool is not the problem.
Frequently asked questions
Final note
Docs are infrastructure. Small, useful, kept current — they're one of the highest-leverage investments a small engineering team can make. Massive, exhaustive, and out of date — they're worse than nothing.
If you're setting up documentation for a growing engineering team and want a review of the structure, book a call. We'll walk through what we'd write first.
FAQ
Frequently asked questions
What documentation does a small engineering team really need?+
Four categories: an onboarding doc, runbooks for specific incidents, one-page architecture overviews per major system, and short decision records explaining why choices were made. Everything else is optional. These four cover the questions new engineers and on-call rotations actually ask.
Why do most engineering docs go unread?+
They're too long, written once and never updated, and don't reveal their point in the first sentence. Engineers skim under pressure. Docs that need a full read-through to be useful don't survive contact with real work. Short, current, and front-loaded is the pattern that works.
Should we use Notion, Confluence, or plain Markdown for docs?+
All three work. Markdown in the repo is best for docs that live with code. Notion works for team-wide knowledge that non-engineers also read. Confluence fits larger organizations. The tool matters less than ownership and update discipline. Pick one and stop debating it.
How do we keep documentation up to date?+
Every doc has an owner. When their feature changes, the doc update goes in the same PR — not as a separate task. Every quarter, delete anything clearly stale. Use new hires as auditors: note every question they had to ask a human and fix those docs while it's fresh.
Do AI coding assistants replace internal documentation?+
No. They read the code that exists, not the reasoning that produced it. Decision records — why we chose this database, why we turned off this feature — live in docs and nowhere else. Assistants help engineers explore code faster; they don't recover lost context.
Building something similar?
Let's talk in 30 minutes.

