A practical guide for PMs and engineering leads who need to write specs that prevent wasted engineering effort, align stakeholders, and survive contact with reality.
Most technical specs fail for one of these reasons:
| Failure Mode | What It Looks Like | Root Cause |
|---|---|---|
| Too long | 30-page document nobody reads past page 3 | Author included everything instead of the right things |
| Too vague | "The system should be scalable" with no specifics | Author didn't think through the details |
| Too detailed | Specifies implementation down to variable names | Author confused "spec" with "code in English" |
| Too late | Written after implementation started to "document" what was built | Team skipped the thinking phase |
| No audience | Written for the author, not the reader | Author didn't consider who needs to use this document |
Different decisions need different levels of documentation:
| Change Size | Document Type | Length | Review Process |
|---|---|---|---|
| Rename a variable | No document needed | — | Code review |
| Add a field to an API | Brief note in the PR description | 1 paragraph | Code review |
| New feature (1-2 sprints) | Technical design doc (lightweight) | 2-4 pages | 1-2 reviewers, async |
| New service or major refactor | Full technical design doc | 5-10 pages | Design review meeting |
| Cross-team architectural change | RFC | 5-15 pages | Formal review with deadline |
| Irreversible decision | ADR | 1-2 pages | Decision meeting |
The most common mistake is using the wrong level. A 15-page RFC for a 2-day feature wastes everyone's time. A 2-sentence Slack message for a new service wastes engineering time when it's built wrong.
Before opening a template, answer these questions in plain language:
1. What's broken or missing?
2. Who cares? (users, internal teams, the business)
3. What happens if we do nothing?
4. What does success look like?
If you can't answer these clearly, you're not ready to write a spec.
Draw the architecture on a whiteboard or in a text file. Don't worry about formatting. Focus on:
| Reader | What They Need | How Deep |
|---|---|---|
| PM / Product | Problem definition, user impact, timeline | Summary level |
| Engineering lead | Architecture, tradeoffs, risks | Full detail |
| Individual contributor | API contracts, data model, implementation guidance | Section-specific detail |
| Security | Auth, data handling, threat surface | Security section |
| Ops / SRE | Monitoring, deployment, failure modes | Operability section |
Use a template from templates/. Fill in the sections that matter, skip the ones that don't. Every section you include should earn its place.
1. Share the draft with 2-3 reviewers
2. Give them a deadline (3 business days is reasonable)
3. Ask them to focus on: "Is this the right approach?" not "Are there typos?"
4. Use the design review checklist from templates/design-review-checklist.md
| Vague (useless) | Specific (useful) |
|---|---|
| "The system should be fast" | "API responses should return within 200ms at p95 under 1,000 req/sec" |
| "We'll handle errors gracefully" | "If the payment service is unavailable, we queue the request and retry 3 times with exponential backoff (1s, 4s, 16s)" |
| "The data model is flexible" | "User profiles use JSONB for custom attributes, with a GIN index for key-path queries" |
Don't hide risks to make the spec look cleaner. A spec that says "there are no significant risks" is either dishonest or hasn't been thought through.
Bad: "This approach has minimal risk."
Good: "The main risk is data migration. If the migration fails mid-way, we'll have inconsistent data between the old and new tables. Mitigation: we'll run the migration behind a feature flag, writing to both tables during the transition period, and validate consistency before cutting over."
A single architecture diagram replaces 500 words of description. ASCII diagrams in markdown are perfectly acceptable:
Client → API Gateway → Service A → Database
↘ Service B → Cache → Database
In 6 months, someone (maybe you) will read this spec to understand why a decision was made. Include the context that won't be obvious later:
1. Read the whole thing first before commenting. Your first concern might be addressed later in the document.
2. Focus on the approach, not the details. "Is this the right architecture?" matters more than "Should this be a POST or PUT?"
3. Distinguish blocking concerns from suggestions. Use labels: [blocking], [suggestion], [question].
4. Propose alternatives, don't just criticize. "This won't scale because X. Consider Y instead."
5. Timebox your review. If you've spent 2 hours reviewing a 5-page spec, you're over-thinking it.
1. Don't take feedback personally. The spec is a tool, not your identity.
2. Respond to every piece of feedback. Even if the answer is "considered and declined because X."
3. Update the spec based on feedback. Don't leave the final version in the comments.
4. Know when to stop. A spec that's 90% right and shared beats a spec that's 100% right and stuck in draft.
Architecture Decision Records deserve special attention because they're the only document that explains *why* your system is the way it is.
Write an ADR when:
Use sequential numbers: ADR-001, ADR-002, etc. Never reuse numbers. If an ADR is superseded, mark it as "Superseded by ADR-XXX" but keep it in the repository.
A good ADR is 1-2 pages. If it's longer, you're writing a design doc, not a decision record. The ADR captures the decision and rationale; the design doc captures the implementation details.
By PM Toolkit Pro | $25
A complete set of templates for writing technical specifications, architecture decision records, RFC proposals, and API designs. Built for technical PMs and engineering leads who need to document decisions clearly and get alignment before writing code.
Get the full Technical Spec Templates and unlock everything.
Get the complete guide with every chapter unlocked, including code samples, diagrams, and best practices.
Access all interactive tools with complete data, all workload profiles, and the full scenario library.
Downloadable source code, configuration files, and working examples from every chapter.
Free updates for life. Every new chapter, tool, and improvement included.