Patterns first
Skip the skill-by-skill grind. Learn six system shapes that interviewers expect you to recognise, and use them as the scaffold for everything else. This is the longest path here, so take it one pattern a day.
For: Engineers who learn by shape, not by topic list
After this path
Recognise which of six system shapes a prompt maps to within the first few minutes, and narrate the v1 → v2 → v3 scaling path cold.
- 1Pattern
Read-heavy
Use caches, replicas and edge layers to absorb repeated reads before they reach the primary database.
Why this, here: One of the most common shapes, and the default for many prompts. Know the scaling path by heart.
- 2Pattern
Write-heavy
Use logs, shards, batching and idempotent consumers when the write path is the thing that runs out first.
Why this, here: The other half: ingest-heavy, partitioned by key, often on LSM storage.
- 3Pattern
Fan-out: on write vs on read
Choose whether distribution happens on write, on read, or with a measured hybrid boundary.
Why this, here: The Twitter / feed problem distilled. At scale the answer is often a hybrid.
Checkpoint
Self-quiz: say the v1 → v2 → v3 scaling narrative for read-heavy out loud, without peeking. If any stage is fuzzy, loop back before continuing — the rest of the patterns compose on top of this one.
- 4Pattern
Long-running tasks
Return a job id quickly, run the work elsewhere, and expose status, progress, cancellation and results.
Why this, here: Comes up whenever work outlives a request. Usually four pieces: job store, queue, worker pool, status channel.
Checkpoint
Name the four pieces of the async job pattern without looking: job store, queue, worker pool, status channel. Now map each piece to a concrete technology you’d defend in a round.
- 5Pattern
Real-time delivery architecture
Choose polling, SSE or WebSocket, then separate live fan-out from durable catch-up.
Why this, here: Push, not poll. WebSockets / SSE. Know when to reach for it.
- 6Pattern
Classic request-response
Use synchronous HTTP, a small app tier, a database and selective caching when the user needs an answer now.
Why this, here: The boring default. Naming it first shows you don't over-build.