Every engineer has been there. You inherit a service someone else built. The README is three lines long, one of which says “TODO: add setup instructions.” You spend a week figuring out what should have taken a day. That lost week is not a learning opportunity â it is a tax on bad documentation.
Documentation is not a nice-to-have. It is infrastructure, just like your CI pipeline or your monitoring dashboard. And when that infrastructure is missing or broken, the cost shows up in ways that are easy to ignore until they compound into real damage.

The Real Cost of Missing Documentation
Bad documentation has a price tag. You just do not see it on a bill. It shows up as time spent reverse-engineering decisions instead of building features. It shows up as outages caused by someone who did not understand a system well enough to change it safely. It shows up as new team members taking three months to become productive instead of three weeks.
A 2020 Stack Overflow Developer Survey noted that one of the biggest challenges developers face is working with undocumented or poorly documented code. This is not a new problem, and it is not getting better on its own.
Consider the math. If a team of eight engineers each spends two hours a week trying to understand undocumented systems, that is sixteen hours a week. Over a year, you have burned through more than eight hundred hours â the equivalent of a half-time employee â on friction that good documentation would eliminate.
Who Documentation Serves
Documentation is often framed as a gift to the next person. That framing is wrong. Documentation serves multiple audiences, and you are almost always one of them.
Your future self
Six months from now, you will not remember why you chose one caching strategy over another. You will remember that you had a reason, but the specifics will be gone. Writing that down when the context is fresh costs you minutes. Reconstructing it later costs hours or days.
Your team
When only one person understands how a service works, that person becomes a bottleneck. Every question goes through them. Every change needs their review. That is not job security â it is a single point of failure. If that person leaves, gets sick, or moves to a different project, the team stalls.
Your customers
For teams building APIs, SDKs, or platforms, documentation is part of the product. A well-documented API gets adopted faster. A poorly documented one generates support tickets, frustrates developers, and drives them to competitors. Stripe did not win developer mindshare just because their API was good â they won because their documentation made it trivially easy to start building.

What Good Documentation Actually Looks Like
Good documentation is not long documentation. A fifty-page wiki that nobody reads is worse than no documentation at all, because it creates a false sense of confidence. Good documentation is usable. That means it is findable, accurate, and written for the person reading it.
Findable
If people cannot find your documentation, it does not exist. This means putting documentation where people look â inside the repository, linked from the service dashboard, searchable in the company wiki. If you have to ask someone where the docs are, the docs have already failed.
Accurate
Outdated documentation is worse than missing documentation. It steers people in the wrong direction with confidence. This is why documentation needs to live close to the code it describes. When docs are in the repo, they get updated in the same pull request as the code change. When they live in a separate wiki that nobody maintains, they rot.
Written for the reader
A design document written for the author’s team is useful to that team. It is not useful to an engineer on a different team who needs to integrate with the service. Good documentation meets its audience where they are. That might mean writing different documents for different audiences: a quick-start guide for someone evaluating the tool, a reference for someone using it daily, and an architecture overview for someone debugging it at 2 AM.
Common Anti-Patterns
After years of auditing documentation at various companies, a few patterns repeat themselves.
The “Code Is Self-Documenting” excuse
Code tells you what it does. It does not tell you why it does it, what alternatives were considered, or what constraints shaped the implementation. Reading code to understand a system is like reading a novel one word at a time with no paragraph breaks. It is possible, but it is not efficient, and it is not respectful of anyone’s time.
The giant wiki graveyard
Someone sets up a wiki. Everyone agrees documentation is important. A few pages get written with enthusiasm. Then the product changes, the wiki does not, and six months later the pages are actively misleading. This happens at almost every company. The solution is not more wiki pages. The solution is a documentation strategy that includes maintenance, not just creation.
The knowledge hoarding
Some engineers resist documenting because it reduces their perceived importance. This is understandable but corrosive. If your value to the team depends on being the only person who understands a system, you are not a senior engineer â you are a liability. Real seniority is building systems that others can run without you.

Building a Documentation Culture
Telling engineers to “write better docs” does not work. You need systems that make documentation the default, not the exception.
Make it part of the definition of done
If a pull request adds a new feature, it should also update the relevant documentation. If it does not, it is not complete. This is easy to enforce in code review and impossible to argue against if it is written into your team’s standards.
Write documentation templates
Starting from a blank page is hard. Starting from a template that asks “What does this service do? How do I run it locally? What are its dependencies?” is much easier. Templates reduce the effort and create consistency, which makes documentation more trustworthy because readers know what to expect.
Treat docs like code
This means version control, peer review, and CI checks. Store documentation in the repository. Review it in pull requests. Run link checkers and linters on it. If you treat documentation as a second-class citizen, it will become one.
Give people time
Documentation takes time. If your sprint planning only accounts for feature work, documentation will always get pushed aside. Allocate time for it. Make it visible in your project tracking. Celebrate good documentation the same way you celebrate good code.
Practical Starting Points
If your documentation is in bad shape today, do not try to fix everything at once. Start with the highest-impact areas.
Service READMEs. Every service should have a README that answers three questions: What is this? How do I run it? Who is responsible for it? If you do only one thing, do this.
Onboarding guides. A good onboarding guide for a new engineer should get them from zero to their first commit in under a day. If it takes longer, the documentation â or the system â needs work.
Runbooks. When something breaks at 3 AM, nobody wants to read a design document. They want a runbook that says “If you see this error, do this thing.” Runbooks turn a stressful incident into a manageable one.
Decision records. Architectural Decision Records, or ADRs, capture why a choice was made. They are short, timestamped, and stored in the repo. When someone asks “Why did we use RabbitMQ instead of Kafka?” you can point them to the ADR instead of relying on institutional memory.
FAQ
How much documentation is enough?
Enough that someone can use, operate, and debug your system without needing to talk to you. If you get the same question twice, the answer should be documented somewhere findable. You do not need to document every function in your codebase, but you do need to document every system that someone depends on.
Should documentation live in the repo or in a wiki?
Prefer the repo. Documentation that lives next to code gets updated when the code does. Documentation that lives in a separate system drifts from reality. There are exceptions â product-focused docs aimed at external users may need a different home â but for engineering documentation, the repo should be the default.
What if I do not have time to write documentation?
You do not have time not to write it. The time you spend answering the same question, debugging the same misunderstanding, or onboarding the same type of task without a guide adds up fast. An hour of writing saves ten hours of explaining. If your manager will not allocate time for documentation, that is a conversation worth having â and it helps to come with data about how much time undocumented systems are already costing the team.
Good documentation is not about being a good writer, though that helps. It is about respecting the people who come after you â including your future self. It is about making your systems survivable, scalable, and maintainable. If your code cannot be understood without you, it cannot be maintained without you. And that is a problem, not a virtue.




