Twenty-nine steps, in five phases
corebeginnerTwenty-nine steps, and they group into five phases where each phase supplies something the next one needs. Phase one, steps 1 to 5, is saying what the system must do: requirements, non-functional requirements, capacity estimation, latency and throughput, availability and reliability. It comes first because it produces the numbers every later choice gets checked against — without them, caching is a habit rather than a decision. Phase two, steps 6 to 12, builds a working single-region request path: APIs, load balancing, databases, indexes, transactions and concurrency, replication, caching. At the end of it you can build a real system. Phase three, steps 13 to 17, makes work asynchronous and survivable: queues, Kafka, idempotency, retries and timeouts, circuit breakers. Phase four, steps 18 to 22, distributes state and is the hardest: consistency, distributed transactions, sagas and outbox, distributed locks, search and object storage. Phase five, steps 23 to 29, is operating and communicating: security, observability, disaster recovery, cloud, high- and low-level design, case studies, interview practice. Four edges in this order genuinely cannot be swapped — capacity before caching, local transactions before distributed consistency, idempotency before retries, and everything before case studies. The rest is a sensible default you can rearrange around whatever you are currently building.
Think of it as
Learning a language: sounds, then words, then sentences, then argument, then writing well. You can skip ahead and produce something that sounds right, and it collapses under the first real question — not because the later material is hard, but because it was resting on something that was never there.
What we're doing: See what actually goes wrong when two of the four hard edges are reversed.
- 17
- A cache with a low hit rate is strictly worse than no cache on the miss path, because every miss pays the lookup before the query. That is only visible if the key distribution was measured.
- 24
- The N+1 detail is the common real ending: caching was applied to a symptom whose cause was a query-count problem the cache cannot fix.
- 39
- A timeout is not a failure — it is an unknown outcome. Treating the two as the same is exactly what makes an un-keyed retry dangerous.
Why this works: Both reversals produce the same shape of damage: a mechanism applied without the condition that makes it correct. That is the argument for the order in general — each phase is largely the set of conditions under which the next phase's tools are the right ones.
Treating the order as a syllabus to complete once
Wrong
Better
What you see: A complete-feeling coverage of every topic and no ability to answer a follow-up on any of them, because nothing in the sequence ever produced a failure to learn from.
Why: Depth comes from a topic failing on a system you own, not from reading it in the right sequence. The order exists to stop you meeting a mechanism before its precondition; it was never a claim that one pass gets you to mastery.
- Steps 01–05: Say what it must do — Requirements, NFRs, capacity estimation, latency and throughput, availability and reliability. Produces the numbers every later decision is checked against.
- Steps 06–12: Build the request path — APIs, load balancing, databases, indexes, transactions and concurrency, replication, caching. At the end of this phase you can build a correct single-region system.
- Steps 13–17: Make it asynchronous and survivable — Queues, Kafka, idempotency, retries and timeouts, circuit breakers. Work outlives the request, and a failing dependency stops being an outage.
- Steps 18–22: Distribute state — Consistency, distributed transactions, sagas and outbox, distributed locks, search and object storage. The hardest phase, and the one that needs phase two to be solid.
- Steps 23–29: Operate and communicate — Security, observability, disaster recovery, cloud, HLD/LLD, case studies, interview practice. The system can now be run, defended, explained and reviewed.
Five phases, and what each one makes possible
The four edges that cannot be swapped
Remember: Five phases: say what it must do (01–05), build the request path (06–12), make it asynchronous and survivable (13–17), distribute state (18–22), operate and communicate (23–29). Each phase is largely the set of conditions under which the next phase's tools are correct, which is why four edges cannot be swapped — capacity before caching, local transactions before distributed consistency, idempotency before retries, and everything before case studies. The rest is a default: when a real system is failing in front of you, jump to that topic, check its preconditions, and go deep there instead.
See also: tier 1 master · url shortener · estimation categories · why caching works · non idempotent retry danger · the ten step sequence

