🧭 System Design a framework for interviews
🧭 Part I · Foundations · chapter 3 / 24

Never face a blank
whiteboard

A system design interview isn't a memory test — it's a conversation about how you think when the problem is fuzzy. This chapter gives you a repeatable 4-step framework so you always know the next move.

Most people freeze in a design interview because they treat it like a pop quiz with one right answer. It isn't. There's no answer key — there's a problem too big to fully solve in 45 minutes, and an interviewer watching how you navigate it.

The good news: navigation is a skill you can rehearse. Strong candidates don't memorize architectures; they run the same loop every time — pin down what's actually being asked, sketch something simple, then sharpen the parts that matter while saying out loud what they're trading away.

This chapter hands you that loop as four steps you can lean on no matter the prompt. We'll thread one running example through all of it — "design a news feed" (think the home timeline of a social app) — so the abstract advice always has something concrete to land on.

1It's a conversation, not a quiz

The prompt you'll get is deliberately vague: "design a news feed," "design a URL shortener," "design Uber." That vagueness is the point. The interviewer isn't checking whether you've memorized a reference diagram — they're watching how you behave when the requirements are unclear, the scope is huge, and the clock is ticking. That's the actual job, distilled into 45 minutes.

So they're really probing four things, and almost none of them is recall:

  • How you handle ambiguity — do you charge in and start drawing, or do you stop and ask what problem you're solving?
  • How you communicate — can you think out loud, take a hint gracefully, and bring the interviewer along instead of going silent?
  • How you reason about tradeoffs — do you know that picking one thing means giving up another, and can you say which and why?
  • How you scope under pressure — can you find the 20% of the design that matters and spend your time there?

Treat it as a collaboration. The interviewer is your teammate for the session, not an examiner waiting to pounce. Drive the discussion, but check in often — "does that scope sound right to you?" A senior signal isn't a perfect answer; it's a reasonable answer reached out loud, with the dead ends and the judgment calls visible.

💬
Silence is the real failure mode. A blank diagram with a candidate narrating their reasoning beats a slick diagram drawn in silence. Your thinking is the thing being graded — so externalize it.

2The 4-step approach

Here's the loop. It works for any prompt because it mirrors how real systems get built: figure out what you need, sketch something whole, then make the important parts real.

  1. 1Understand & scope — ask questions until the fuzzy prompt becomes a concrete, bounded problem. Who uses it, what must it do, how big is it?
  2. 2Propose a high-level design & get buy-in — draw the major boxes (clients, API, services, storage) end to end, and check that your interviewer agrees before going deeper.
  3. 3Deep dive — pick the one or two pieces that carry the real difficulty and design them in detail. Follow the interviewer's hints about where to go.
  4. 4Wrap up — name the bottlenecks, the tradeoffs you made, how it fails, and what you'd do with more time.

Roughly budget your time: a few minutes scoping, about ten on the high-level design, the bulk on the deep dive, and a couple of minutes wrapping up. Click through the steps below to see each one play out on our running example.

Interactive · walk the 4 steps Click a step — the "design a news feed" example threads through all four
🧵
Notice the example never disappears between steps. A good answer is one continuous story — "we scoped it to X, so the high level looks like Y, which means the hard part is Z" — not four disconnected mini-lectures.

3Step 1 — clarify before you design

The single biggest mistake is to start drawing boxes the moment you hear the prompt. "Design a news feed" could mean a Twitter-scale firehose or a small group's bulletin board — and those are completely different systems. Before a single line goes on the board, you ask. Spend the first few minutes turning the vague ask into a problem with edges.

A simple set of prompts gets you most of the way:

  • Who uses it? Consumers, internal teams, other services? Mobile, web, both? — news feed: mobile-first consumers, occasional web.
  • What must it do? Nail the core actions and cut the rest. — news feed: post, follow, view a ranked home feed. No DMs, no ads — out of scope.
  • How big? Users, traffic, data, read-vs-write mix. — news feed: ~10M daily users, read-heavy, feed must feel instant.
  • What matters most? Freshness, latency, cost, correctness — which is the priority? — news feed: low latency over perfect freshness; a few-second-old post is fine.

Write the answers in a corner of the board and treat them as your contract. Every later decision points back to them. Crucially, scoping is also how you make the problem winnable — by agreeing to ignore DMs, ads, and notifications, you've turned an impossible 45-minute task into a focused one. Cutting scope out loud is a strength, not a dodge.

⚠️
Don't interrogate, converse. Five rapid-fire questions then silence isn't scoping — it's a checklist. Ask a question, state the assumption it lets you make, and move. "I'll assume reads dominate writes roughly 100:1 — sound right?" keeps it flowing.

4Functional vs non-functional requirements

As you clarify, sort what you hear into two buckets, because they pull on the design in completely different ways.

  • Functional requirements are what the system does — the features, the verbs. "A user can post a photo." "A user can follow another user." "The feed shows posts from people you follow." These define the API and the data model.
  • Non-functional requirements are how well it does it — the qualities. Scalable (handles 10M daily users), available (stays up), low-latency (feed loads in under 200 ms), consistent (everyone sees the same thing), durable (nothing posted is ever lost).

Here's the part people miss: the non-functional requirements are what actually shape the architecture. "A user can post" is satisfied by almost any design. But "feed loads in under 200 ms for 10M daily users" is what forces caching, fan-out, replicas, and CDNs into the picture. Features tell you what to build; qualities tell you how hard it has to be — and therefore which of the tools from Chapters 1 and 2 you reach for.

So when you finish scoping, you should be able to say something like: "Functionally, post / follow / view-feed. Non-functionally, read-heavy, low-latency, highly available, eventual consistency is fine." That second sentence is the one that earns the rest of the hour. Try sorting a shuffled deck of requirements below.

Interactive · sort the requirements 0 / 8 sorted

Drag each card into a bin — or tap the Fn / NF buttons on touch. Instant feedback.

🔧Functional · what it does
📐Non-functional · how well
Sort all 8 to finish.

5Estimate the scale, then design the interface first

Once the requirements are pinned, two quick moves set up the whole high-level design — and both happen before you draw a single internal box.

Estimate the scale

Feed in the back-of-the-envelope math from Chapter 2. You don't need precision — you need the order of magnitude that decides the shape of the system. For the news feed: 10M daily users, each opening the app ~10 times a day, is roughly 100M feed reads a day ≈ ~1,200 reads/sec average, call it 5–10× that at peak. Posts are far rarer — maybe a few thousand writes/sec. That single ratio (read-heavy) already tells you to lean on caches and replicas. Storage and bandwidth estimates tell you whether one database can hold it or you'll be sharding.

Design the API and data model before the boxes

This is the "design the interface, then implement" instinct from good programming, applied to systems. Pin down the API contract — the handful of endpoints clients call — and the data model — the core entities and how they relate. Do this first, because the API and schema constrain everything downstream; the boxes are just an implementation of that contract.

  • API (the verbs): POST /posts, POST /follow, GET /feed?cursor=…. Notice the feed read is paginated by cursor — a scale decision falling straight out of "feed must feel instant."
  • Data model (the nouns): User, Post(author, body, ts), Follow(follower, followee), and a per-user Feed of post ids. How the feed is built — fan-out on write vs read — is the deep-dive question, but the data model is what frames it.

Below is that contract sketched as types. Treating requests and rows as plain data — and the system as functions over them — is the same lens Chapter 1 used for stateless servers. The shape is identical in both languages.

📐
Sketching the API and data model first does two jobs at once: it forces the requirements to be concrete, and it gives the interviewer something specific to react to. "Here are the three endpoints and four tables" is a far stronger opening than a cloud of unnamed boxes.

6Name your tradeoffs

This is the section that separates senior candidates from everyone else. There is no single right answer in system design — every choice buys you one thing by spending another. The skill isn't picking the "correct" option; it's seeing the tradeoff and saying it out loud before you choose.

The recurring ones you'll meet again and again:

  • Consistency vs availability — when the network splits, do you refuse to answer (stay consistent) or answer with possibly-stale data (stay available)? Chapter 4 is entirely this.
  • Latency vs cost — caches, replicas, and edge servers make things fast, but every copy is money and complexity. How fast do you actually need to be?
  • Simplicity vs flexibility — a simple design ships and is easy to reason about; a flexible one handles tomorrow's requirements but costs you today. Don't build for scale nobody asked for.

When you make a call, frame it as a tradeoff: "I'll use a cache here — that gets us under the latency target, at the cost of serving data that can be a few seconds stale, which our requirements said is fine." That one sentence shows you understood the requirement, knew the cost, and chose deliberately. Move the sliders below to feel each tradeoff swing.

Interactive · the tradeoff board Slide each dial — the plain-English consequence updates live
← ConsistencyAvailability →
← Low latencyLow cost →
← SimplicityFlexibility →
⚖️
The seniority signal: juniors defend their choice as "correct." Seniors say "here's what I gave up to get this, and here's when I'd choose differently." Naming the tradeoff is worth more than the choice itself.

7Common pitfalls

Most failed interviews die from a handful of avoidable mistakes. Recognize them and you've already dodged them.

  1. Skipping the questions. Drawing boxes before you've scoped means solving the wrong problem beautifully. Always clarify first.
  2. Premature deep dive. Burrowing into one component's details before the high-level design exists. Earn agreement on the whole picture, then zoom in.
  3. Over-engineering. Reaching for sharding, microservices, and exotic databases on day one. Start simple; add complexity only when a requirement forces it.
  4. Designing for scale nobody asked for. Building for a billion users when the prompt said ten thousand. Match the design to the numbers you actually agreed on.
  5. Ignoring hints. When the interviewer asks "what happens if that node fails?" they're steering you. Follow the nudge — it's where the points are.
  6. Going silent. Long quiet stretches read as being stuck. Narrate even your uncertainty: "I'm weighing two options here…"
🧭
Every pitfall above is the inverse of the framework. Clarify, sketch whole, deep-dive the hard part, name your tradeoffs, talk the whole time. Run the loop and the pitfalls take care of themselves.