The eleven review questions
coreintermediateEleven questions, asked by somebody who did not write the design, about a design that is finished. They run in four passes. Does it do the job — does it meet the functional requirements, is the data model correct, are the invariants and concurrent cases handled? Does it survive — is there a single point of failure, are retries safe to run twice, what happens when the cache, the database, the queue or the provider fails, and how does it recover? Does it grow — where is the bottleneck, and can the system scale horizontally? Can we run it — how is it monitored, and what does it cost? Every item is a question rather than a checkbox, and that is deliberate: the reviewer's job is to make the author say something specific, because a reviewer who answers on the author's behalf is reviewing their own understanding. The order matters too. Correctness first, because a design that does not meet the requirement does not need a scaling discussion, and the failure-handling questions before the growth ones, because a system that falls over at current load has no interesting behaviour at ten times current load. The strongest single question on the list is "what happens when the provider fails", because it is the one the author cannot fix during an incident and therefore the one that sets the real availability ceiling.
Think of it as
A viva, not a form. The value comes from the author having to answer out loud, in specifics, to someone who does not already share their assumptions — which is why the questions are open ("what happens when the queue backs up") rather than closed ("is the queue handled"). A closed question can be answered yes by someone who has not thought about it; an open one cannot.
What we're doing: Run passes 1 and 2 over a colleague's design and produce findings the author has to answer.
- 12
- The follow-up question is where the finding lives. "The endpoint checks created_at" is a true answer to the question as asked, and completely hides the race with fulfilment.
- 22
- Asking "does it refund twice" rather than "is it idempotent" is deliberate: the second version can be answered yes by someone who has not traced the path.
- 34
- Naming two acceptable designs rather than one keeps the finding a finding. The reviewer identifies the gap; the author still owns which way to close it.
- 46
- Not every finding is a change. Converting an unstated assumption into a recorded decision is a real output of a review, and it is what stops the same question being re-asked next quarter.
Why this works: Every finding here came from a follow-up, not from the checklist question itself. The list gets the conversation to the right place; the second question — "and what happens then?" — is what turns a true-sounding answer into a discovered gap.
Reviewing the design you would have written
Wrong
Better
What you see: Reviews that take a long time, generate defensiveness, and end with the original design shipping unchanged — because the conversation was about preference and both people knew it.
Why: A review has authority over whether a design meets its requirements and survives its failure modes, not over which of several adequate shapes it takes. Substituting your design for the author's spends the review's credibility on a question it cannot settle, and the real defects go unexamined.
- Pass 1 — Does it do the job? — Functional requirements traced to components, a data model whose access paths serve every query in the design, and named concurrency controls for every contended entity. Stop here if the answer is no — the later passes are about a system that does not exist yet.
- Pass 2 — Does it survive? — Walk every component and kill one instance of it. Then kill the cache, the database, the queue and the external provider separately — four questions, four different right answers. Then ask how it comes back, with an RPO and an RTO that have numbers.
- Pass 3 — Does it grow? — Name the first component to saturate and the load at which it does. "It scales horizontally" is a claim about the stateless tier; the interesting answer is about the part that is not stateless, and what its ceiling is.
- Pass 4 — Can we run it? — One symptom-based alert per user-visible promise, with a named team it pages. Then the monthly cost at current load, and the cost per unit of whatever grows — the number almost no design computes until finance asks.
The eleven questions, by pass — and what separates an answer from a non-answer
The four dependency-failure questions have four different right answers
Remember: Eleven questions in four passes, asked by someone who did not write the design. Does it do the job (requirements, data model, concurrency and invariants), does it survive (SPOF, safe retries, cache/DB/queue/provider failure, recovery), does it grow (bottlenecks, horizontal scaling), can we run it (monitoring, cost). Keep every item an open question, make the author answer, and follow each answer with "and what happens then?" — that second question is where the findings actually come from.
See also: the high level design checklist · the low level design checklist · the failure mode question checklist · eliminating single points of failure · rpo vs rto · symptom based alerting · unit cost estimation

