I’m going to say something controversial: the async-first movement is overselling documentation as a silver bullet.
I lead a 120-person remote-first engineering organization. We’ve invested heavily in documentation infrastructure. We have comprehensive wikis, detailed ADRs, extensive runbooks. And yes, it helps. But if I’m being honest about what actually makes our distributed team effective? Documentation is necessary but not sufficient.
Let me explain the gap between async-first theory and distributed team reality.
Three Documentation Anti-Patterns I See Everywhere
1. Write-Only Culture
Documentation gets created but never consumed. Engineers dutifully write ADRs because the process requires it. Those ADRs get committed to Git and never read again. New engineers ask questions in Slack instead of searching docs because nobody trusts that docs are current or comprehensive.
It’s documentation theater—going through the motions without the substance.
2. Zombie Wikis
Comprehensive documentation that’s outdated within months. We’ve all seen this: a beautiful wiki with hundreds of pages, organized into categories, searchable and well-intentioned. But 40% of it describes systems that no longer exist, processes that changed, or decisions that got reversed.
Stale documentation is worse than no documentation. It actively misleads.
3. Documentation Instead of Conversation
The most insidious pattern: using “we should document that” as a way to avoid having difficult conversations. Architecture decisions that need real-time debate get deferred to “write an RFC.” Strategic disagreements get turned into competing documentation. Important decisions get slower, not faster.
The Alternative: Executable Documentation
Here’s what I’m increasingly convinced of: the best documentation is code that documents itself.
- Type systems are contracts that can’t go stale
- Tests are specifications that break when behavior changes
- Infrastructure-as-code is architecture documentation that stays current by definition
- Automated diagram generation from actual systems beats hand-drawn diagrams
Manual documentation should be reserved for things code can’t express: context, tradeoffs, strategic intent.
The Real Cost Analysis
Let’s be honest about what comprehensive documentation actually costs:
Manual Doc Maintenance:
- Initial creation: 10% of engineering capacity
- Keeping current: another 5-10% ongoing
- Cultural overhead: endless debates about what needs documenting
Tooling Investment:
- Automated testing: pays for itself in bug prevention
- Type systems: pay for themselves in refactoring safety
- Observability: pays for itself in incident reduction
- Self-documenting architecture: pays for itself in cognitive load reduction
The ROI math isn’t close. We’re over-investing in manual prose and under-investing in executable contracts.
When to Document vs When to Talk
The async-first ideology treats synchronous communication as a failure. But some things are genuinely better resolved in real-time:
- Strategic disagreements that need rapid iteration
- Architectural debates with multiple valid options
- Crisis response and incident management
- Onboarding conversations that surface unknown unknowns
Documentation should capture decisions and context after the conversation, not replace the conversation.
My Proposal: Tiered Documentation Strategy
Not all documentation has the same lifecycle:
Tier 1 - Code as Documentation (perpetual)
- Tests, types, contracts
- Infrastructure-as-code
- API schemas
- Automated architecture diagrams
Tier 2 - Architectural Context (years)
- ADRs for major decisions
- System design overviews
- Technology strategy
Tier 3 - Operational Knowledge (months)
- Runbooks
- Onboarding guides
- Process documentation
Tier 4 - Ephemeral (weeks)
- Meeting notes
- Decision logs
- Status updates
Different tiers deserve different maintenance investments.
The Uncomfortable Question
Maybe we’re documenting too much of the wrong things. Maybe the async-first movement has overcorrected from “just talk to people” to “just read the docs” without acknowledging that some knowledge transfer is fundamentally conversational.
Are we documenting too much of the wrong things and not enough of the right things?
What if the answer isn’t more comprehensive documentation but more intelligent choices about what to document, what to automate, and when to just have a conversation?
Looking forward to getting challenged on this.