On this path · Writing 6. Writing RFCs and Design Docs
  1. The Principles of Clear Prose
  2. Sentence Rhythm in Writing
  3. Professional Email
  4. Slack and Chat
  5. Technical Documentation
  6. Writing RFCs and Design Docs
  7. Performance Reviews and Written Feedback
  8. Persuasive Writing
  9. Resume, Cover Letter, and LinkedIn

Writing RFCs and Design Docs

Structure a proposal and frame trade-offs to persuade reviewers.

Learning outcomes

You have a plan to split the monolith into two services. You know it is right. You write it up, post the link, and wait. A week later the document has two comments, both bikeshedding the service names, and the real decision is still unmade. Meanwhile a colleague proposed a smaller change the same week, got six reviewers to sign off in two days, and is already building it. The difference was not the quality of the idea. It was the quality of the document. This page is about writing the document that wins alignment instead of the one that stalls.

After studying this page, you can:

  • Explain the three jobs an RFC does at once: propose a direction, win alignment from reviewers, and leave a durable record of why.
  • Write the standard sections (summary, context, goals and non-goals, design, alternatives, risks, rollout, open questions) and say what each one is for.
  • Lead with a summary a busy reviewer can read in thirty seconds, and draw scope with explicit non-goals.
  • Frame a tradeoff so the reasoning is auditable: name the real alternatives, put their costs on one axis, state each failure mode, and give the decision rule.
  • Write the alternatives-considered section that signals senior judgment, and anticipate objections before a reviewer raises them.
  • Write for asynchronous review, ask for a clear decision, and choose between a heavyweight design doc and a lightweight ADR.

Before we dive in

Here is the problem that makes this whole genre necessary. A team is about to build something big: a new service, a data migration, a change to how every request is authenticated. The work will touch many people, take weeks, and be hard to undo. If the team just starts coding, three bad things happen. People who should have weighed in never get the chance, so an objection surfaces halfway through, when changing course is expensive. Nobody agreed on what success even means, so the work drifts. And a year later, when someone asks why it was built this way, the answer lives only in the heads of people who have since left.

The RFC, short for request for comments, is the answer to all three. It is a document you write before building, circulated so people can comment, that proposes a direction and captures the reasoning behind it. The same artifact goes by other names, design doc, technical spec, one-pager, but the function is identical: think in writing, in the open, before the cost of changing your mind goes up.

This is not the same skill as documenting a system after you build it, which is covered in technical documentation. That writing describes what exists. This writing argues for what should exist, to an audience who can still say no. The whole craft turns on that one fact: your reader is a decision-maker who has not yet decided, and your job is to help them decide well and fast.

Mental Model: three jobs in one document

The wrong model is that an RFC is a description of your plan: you have a design in your head, and the document writes it down so others can read it. Under that model, a good RFC is a complete and accurate spec, and the goal is coverage. This is the model that produces a forty-page wall of design detail that nobody approves, because it answers a question the reader was not asking.

The better model is that an RFC does three jobs at the same time, and a sentence that serves none of them is wasted. It must propose a direction, so the reader knows what you want to do. It must win alignment, so the people affected agree, or surface their disagreement now while it is cheap. And it must leave a record, so a future reader understands not just what was decided but why, and which other options were weighed and dropped. The same paragraph often does two of these at once: a well-framed tradeoff both persuades a current reviewer and explains the choice to a reader a year out.

Holding the three jobs in view changes what you write. The propose job demands a clear, specific design. The alignment job demands that you anticipate objections and ask for an actual decision, not just narrate. The record job demands that you write down the alternatives you rejected and why, which feels like wasted effort until the day someone re-proposes exactly the option you already ruled out.

One document, three readers in one

Every part of an RFC should serve at least one of three jobs: propose (tell the reader your direction), align (get the affected people to agree or object now), record (let a future reader reconstruct the reasoning). When a section serves none of them, cut it. When you are unsure how much detail to include, ask which job the detail does.

Breaking it down

1. The standard structure, and why each part exists

RFCs converge on a standard set of sections not by fashion but because each one answers a question a reviewer will otherwise ask in a comment. Learn the sections as a list of pre-answered questions, and the structure stops feeling like a template you fill in and starts feeling like a conversation you are getting ahead of.

The table below is the backbone. Read the third column as the question each section heads off, and the fourth as what a careful reviewer actually checks when they reach it.

The standard RFC sections, what each one is for, and what a reviewer looks for when they reach it.

SectionPurposeQuestion it answersWhat the reviewer checks
Summary or TL;DRLet a busy reader grasp the whole proposal in a few sentencesWhat is this and what are you asking me to approve?Can I tell the decision from this alone, without reading on?
Context and problemEstablish the problem and why it matters nowWhy are we doing this at all?Is this a real problem, and is now the right time?
Goals and non-goalsDefine success and fence off what is out of scopeWhat counts as done, and what are you not solving?Do the goals match the problem? Is the scope sane?
Proposed designDescribe the direction in enough detail to evaluateWhat exactly do you propose to build?Will this work? Is it specific enough to judge?
Alternatives consideredShow the other options and why they lostDid you consider the obvious other approaches?Did they weigh the option I would have picked?
Risks and mitigationsName what could go wrong and how you guard against itWhat is the worst case, and are you ready for it?Did they see the risk I am worried about?
Rollout or migrationLay out how the change ships safely and reversiblyHow do we get from today to the new state?Can this ship incrementally? Can we roll back?
Open questionsFlag the parts not yet resolved, inviting inputWhat is still undecided that I could help with?Where can my expertise actually move the doc?

Two things about the order. The sections run roughly in the order a reviewer needs them: the problem before the design, because a solution makes no sense until you feel the problem, and the alternatives after the design, because you compare against the thing you just proposed. And the structure is a default, not a law. A small change may fold goals and design into one paragraph; a large one may split the design into several. The test is never “did I fill in every heading” but “did I pre-answer every question a reviewer would otherwise ask.”

2. The summary up top, because the reviewer is busy

The single highest-value paragraph in the document is the one at the very top, and it is the one writers most often skip. Your reviewers are senior, busy, and reading your doc between two meetings. Many of them will read only the summary and then either approve, skim for their area, or decide it does not need them. If the summary does not stand on its own, you have lost the readers you most needed.

A good summary states, in a few sentences, the problem, the proposed direction, and the decision you are asking for. It is not a teaser that withholds the answer to make you read on; it is the answer, with the rest of the document as the evidence. This is the inverted pyramid from the principles of clear prose: lead with the conclusion, because the skimmer may never reach the end. Watch the difference between a summary that hides the proposal and one that leads with it.

The strong version is not shorter by accident. It puts the load-bearing information, the proposal and the ask, where the reader looks first, and demotes the history to support. If a reviewer reads only those four sentences, they still have the one thing they needed.

3. Goals and non-goals: drawing the box

Goals say what success looks like. Non-goals say what you are deliberately not doing, and they are the more powerful of the two, precisely because they are the ones a writer is tempted to leave out. A non-goal does two jobs at once: it stops scope creep before it starts, and it heads off an objection before a reviewer raises it.

Suppose your proposal is to add a read-through cache to speed up the product page. Without non-goals, three different reviewers will each pull you somewhere else: one asks why you are not also caching the checkout flow, one worries this is a backdoor rewrite of the data layer, one wants to know your plan for cache invalidation across regions. Each is a reasonable question, and each can derail the thread for days. Now add a non-goals section: this does not touch checkout, does not change the data layer, and does not attempt cross-region invalidation, which is tracked separately. The same three reviewers read that, see their concern was anticipated, and move on. You did not duck the questions; you drew a box and said, on purpose, what is outside it.

A non-goal is an objection you pre-empt

Every non-goal is really a reviewer comment you are answering before it is written. The trick to finding them: imagine the three loudest people on the thread and ask what each would worry you are secretly doing or failing to do. Write each worry as a non-goal. ‘This is not a rewrite of X’, ‘we are not solving Y in this doc’, ‘performance beyond Z is out of scope’. Naming the boundary is what lets the reader trust the part inside it.

4. Framing tradeoffs to persuade

This is the central senior skill, so it gets its own section. A decision is rarely between a good option and a bad one; it is between options that are each good on some axis and bad on another. The amateur move is to assert that your option is best. The senior move is to make the tradeoff legible, so the reader can see the choice the way you see it and arrive at your conclusion themselves. A reader who is shown the reasoning trusts the conclusion; a reader who is only handed the conclusion looks for the catch.

A tradeoff framing that persuades has four parts, and skipping any one of them weakens it. The flowchart lays them out as a sequence you can run on any decision.

The four parts of a tradeoff that persuades, plus the reversal condition that makes the reasoning auditable.

Walk through why each part earns its place. Naming the real alternatives, including the one a skeptic would reach for, signals that you did the homework and removes the reviewer’s instinct to play devil’s advocate, because you already did. Putting costs on one shared axis, latency, or operational load, or migration weeks, lets the reader compare options directly instead of in incommensurable units. Stating each option’s failure mode is the most honest and most trusted move: an engineer who tells you exactly where their preferred design breaks has earned the benefit of the doubt everywhere else. The decision rule then makes the call explicit: you are choosing to pay this cost to avoid that worse one. And naming what would reverse the decision, the benchmark result, the traffic level, the team size, makes the whole thing auditable: a future reader can check whether the condition still holds. This deliberate, reason-on-the-table framing is the same discipline that governs a good design review, treated from the reviewer’s side in technical discussions and reviews.

Two design docs argue for the same database choice. Which tradeoff framing is stronger, and why?

5. Alternatives considered: the part that signals judgment

Of all the sections, alternatives considered is the one experienced reviewers read first to gauge whether the author is senior. A proposal with no alternatives reads as either naive, you did not know there were other options, or evasive, you knew and hid them. A proposal that fairly weighs two or three real alternatives reads as the work of someone who can be trusted with a big decision, because they have already argued both sides.

The craft is to make each alternative a fair fight, not a strawman. Describe each option as its advocate would, give its genuine advantage, and then state the specific reason it loses for this problem in this context. “We could shard the database; this gives us horizontal write scale, but our write volume is low and sharding would add operational complexity we do not need yet” is a fair rejection: it grants the upside and rejects it on a stated, checkable ground. Compare that to “we could shard, but that is too complex”, which dismisses without engaging and makes a reviewer suspect you never really considered it.

Writing the alternatives-considered section

For each alternative, write three things in this order. First, the option, described as its supporter would, with its real strength: ‘Build it on a message queue, which decouples the services and absorbs traffic spikes.’ Second, the specific cost that matters here: ‘but it adds a new system to operate and a day of latency we cannot accept for this flow.’ Third, the verdict tied to that cost: ‘so we rule it out for the synchronous path, though it stays the right tool for the batch jobs.’ Granting the strength is what makes the rejection credible. A reviewer who sees you state your runner-up’s best case knows you are not selling them something.

6. Writing for asynchronous review

An RFC is read without you in the room. Nobody is there to clarify, to answer the obvious question, to say “no, I meant the other thing.” The document has to carry the whole conversation alone, which puts three demands on how you write it.

Make it skimmable. A reviewer arrives with a goal, often a narrow one, the security person checks the auth model, the database owner checks the schema, and scans for their part. Descriptive headings, a summary up top, short paragraphs, and the key claim first in each one let a reader route themselves. A wall of undifferentiated text forces every reviewer to read everything, so most read nothing.

Anticipate and pre-empt objections in the doc. The questions a reviewer would ask in a comment should already be answered in the text, because a comment thread is slow: a question posted Monday gets your answer Tuesday and the follow-up Wednesday, and the decision slips a week. When you can feel an objection coming, “won’t this break the mobile clients?”, answer it in a sentence where it arises. Each pre-empted objection is a comment thread that never happens.

State the decision you are asking for, plainly, and put it where it cannot be missed. The most common way a doc stalls is that it never actually asks for anything: it describes a design, trails off, and leaves reviewers unsure whether they are being asked to approve, to brainstorm, or just to be informed. End with the explicit ask, “I am requesting approval to proceed with the token service; please comment by Friday”, so there is no doubt about what a reader is supposed to do.

The doc that describes but never asks

A surprising number of design docs fail not on the design but on the request. They lay out a thorough proposal and then simply stop, never saying ‘I am asking you to approve this’ or ‘I need a decision on the two open questions by Thursday’. Without an explicit ask, reviewers default to the easiest action, which is no action: a few comments, no decision, and the doc dies on the vine. Always close by naming the decision you need and who you need it from. Describing a plan and requesting a decision are two different acts, and the second is the one that moves the work.

7. ADRs and the document lifecycle

Not every decision deserves a full RFC. For a smaller, more local choice, which library, which naming convention, which of two reasonable patterns, the lightweight form is an architecture decision record, or ADR: a short note, often a single page, capturing the context, the decision, and the consequences. An ADR does the record job of an RFC without the heavy propose-and-align machinery, and it is the right tool when the decision is real but the blast radius is small. The instinct to match the document’s weight to the decision’s weight is itself a mark of judgment: a five-line ADR for a five-minute decision, a full RFC for a quarter of work.

Whichever form you use, the document has a lifecycle, and knowing where a doc sits in it tells everyone how to treat it. The states run from draft to a recorded decision.

The lifecycle of an RFC: a draft is shared for review, cycles through comments and revisions, and ends in a recorded decision.

The loop in the middle, between commenting and revising, is the heart of the genre and the reason it is called a request for comments: the document is meant to change as reviewers push on it. A doc that reaches the decided state has done all three jobs, it proposed, it aligned the people who commented, and now it stands as the record of why the call was made. That final record is the part with the longest life: long after the work ships, the doc answers the question a new engineer will eventually ask, “why is it built this way, and did anyone consider the obvious alternative?”

Common mistakes

Each mistake below is a way of forgetting that your reader is a busy decision-maker who has not yet decided.

No summary, so the proposal is buried. The reviewer opens the doc, finds three paragraphs of history, and bounces before reaching the point. Lead with a summary that states the problem, the proposed direction, and the ask, so a reader who stops after it still has the decision.

No alternatives considered, so the proposal reads as naive or evasive. A single option with no comparison gives the reviewer nothing to check your judgment against, and senior readers distrust it on sight. Weigh two or three real alternatives, each granted its genuine strength before you reject it on a stated ground.

No non-goals, so scope creeps and objections multiply. Without an explicit boundary, every reviewer pulls the doc toward their own concern, and the thread sprawls. Name what you are deliberately not doing; each non-goal is an objection you answer in advance.

Not anticipating objections, so the comment thread does the work the doc should have done. Every question a reviewer asks in a comment is one you could have answered in the text in a fraction of the time. Imagine the loudest reviewer and pre-empt them on the page.

No clear decision requested, so the doc stalls. A proposal that describes but never asks leaves reviewers unsure what to do, and they default to doing nothing. Close with the explicit ask and a deadline.

A wall of text with no structure, so a skimming reviewer cannot find their part. Asynchronous review depends on a reader routing themselves to the section they care about. Descriptive headings, short paragraphs, and the point first make a long doc usable; a single dense block makes it invisible.

Mastery Questions

Question

What are the three jobs an RFC or design doc does at the same time, and why does naming them change what you write?

Answer

Propose a direction (tell the reader what you want to do), win alignment (get the affected people to agree, or surface their disagreement now while changing course is cheap), and leave a durable record (let a future reader reconstruct not just what was decided but why, and which alternatives were weighed and dropped). Naming them changes what you write because every sentence should serve at least one job, and one that serves none is cut: the propose job demands a specific design, the align job demands you anticipate objections and ask for an actual decision, and the record job demands you write down the rejected alternatives, which feels wasteful until someone re-proposes exactly the option you already ruled out.

1 / 5

Recommended next

  • Persuasive Writing
    Deepens the central RFC skill of framing options to persuade, the general moves of argument the alternatives section applies.
  • Technical Discussions and Reviews
    The reviewer-side counterpart of tradeoff framing: how the alignment a good RFC seeks plays out in a live design review.
  • Technical Documentation
    Contrasts the before-the-fact proposal with the after-the-fact record.
Sources & evidence7 claims · 2 cited

Teaches the three jobs, the standard section structure with per-section purpose, the busy-reader summary, goals and non-goals, the tradeoff framing, the alternatives-considered section, async-review writing, ADRs, and the draft-to-decision lifecycle. Claims are grounded mostly in engineering best practice (internal-reasoning or stable-common-knowledge); clarity and skimmability claims cite Williams and Pinker. No invented numbers.

  • An RFC or design doc serves three simultaneous functions: proposing a direction, securing alignment from reviewers, and leaving a durable record of the reasoning behind a decision.stable common knowledge
  • RFCs converge on a standard set of sections (summary, context and problem, goals and non-goals, proposed design, alternatives considered, risks and mitigations, rollout or migration, open questions), each of which pre-answers a question a reviewer would otherwise raise.stable common knowledge
  • Because reviewers skim and many read only the top, leading with a summary that states the problem, the proposed direction, and the requested decision lets a reader grasp and act on the proposal without reading the whole document.verified
  • A tradeoff framing persuades and stays auditable when it names the real alternatives, puts their costs on a shared axis, states each option's failure mode, gives the decision rule, and names what would reverse the decision.internal reasoning
  • An alternatives-considered section that grants each rejected option its genuine strength before rejecting it on a specific stated ground signals senior judgment, whereas a proposal with no alternatives reads as naive or evasive.internal reasoning
  • Writing for asynchronous review requires making the doc skimmable, pre-empting obvious objections, and stating the requested decision explicitly; a doc that describes a design but never asks for a decision tends to stall because reviewers default to no action.internal reasoning
  • A lightweight architecture decision record (ADR) captures the context, decision, and consequences of a smaller, more local choice, doing the record job without the heavier propose-and-align machinery of a full RFC; documents move from draft to review and comments to a recorded decision.stable common knowledge

Cited sources