Skip to content
CodeStoa
System Design · IntroductionBeginner

How to Approach a System Design Problem, Step by Step

System design problems arrive vague on purpose. Follow a town planner through a bike-share scheme to learn five repeatable steps that stop you building the wrong thing well.

6 min readPublished
0:00 / 7:14

The bike-share nobody rode on a Tuesday

This is part 2 of the System Design Introduction, and it stands on its own. A system design problem arrives deliberately vague: "design a bike-share", "design a chat app". There is no spec. Working out what to build is part of the job, and a repeatable approach is what stops you building the wrong thing well.

Picture a mid-sized town. The council says: "We want a bike-share scheme." A rival team pitches first. They hear "bikes", notice the old castle is busy with tourists at weekends, and put most of the docks there. On Saturday it looks great. On Tuesday at 8 am the bikes sit by the castle while hundreds of people walk to the train station. The council meant weekday commuters all along. Nobody asked.

The rival team's docks worked and their app worked. They answered a question nobody had asked. Tomás, a planner at the council, gets the same request, the same town and the same money. Instead of placing docks, he walks five steps.

The five steps, and what each one produces

Each step produces something you can point at. That is how you know a step is finished.

  1. Clarify requirements → a short list: who uses it, what it must do, how well, and what is out of scope.
  2. Estimate the size → a few rough numbers for users, peak use and storage. Enough to tell small from huge.
  3. High-level design → a box diagram of the whole system, end to end, with no detail yet.
  4. Deep dive → one part, the hardest or busiest, designed properly, with its bottleneck found.
  5. Trade-offs and wrap-up → what you chose, what it costs, and what you would change at 10x.
  • Questions (step 1) to Numbers (step 2)
  • Numbers (step 2) to Boxes (step 3)
  • Boxes (step 3) to One deep dive (step 4)
  • One deep dive (step 4) to Trade-offs (step 5)
Each step's output feeds the next one.

The order matters. Requirements tell you what to count. The numbers tell you how big the boxes must be. The boxes show you where to dig. This is adapted from the System Design Primer, a widely used open guide, which follows the same arc: use cases and constraints, a high-level design, the core components, then scale.

Steps 1 and 2: ask, then count

Tomás draws nothing on day one. He asks questions and sorts the answers into three piles.

  • Functional requirements, what it must do: a rider unlocks a bike with the app, rides, and returns it to any dock. The app shows which stations have bikes.
  • Non-functional requirements, how well it must do it: at 8 am there is a bike within five minutes' walk of where commuters live, it works in the rain, and unlocking takes seconds, not a minute.
  • Out of scope: e-bikes in phase one. Writing this down matters as much as the rest. It is what you promise not to build.

The most important answer is to "who uses it?": weekday commuters heading to the train station and the Riverside offices. That one answer, the one the castle plan never got, moves every dock in the scheme.

Next he counts, roughly. In this example:

  • Rides a day

    Working
    40,000 residents × 4%
    Result
    1,600
  • Rides in the two rush hours

    Working
    1,600 × 40%
    Result
    640
  • Rides an hour

    Working
    640 ÷ 2
    Result
    ≈ 320, about one every 11 seconds
Step 2: rough numbers, not precise ones.

The verdict: for the computers, this is small. One modest server and one database can handle a ride every 11 seconds with room to spare, and even a year at 1,600 rides a day, about 584,000 ride records, fits easily in one database. So the hard part of this system is not the software. It is where the bikes are. Estimation gets its own lesson next. Here you only need enough to know whether you are building a shed or a stadium.

Steps 3 and 4: draw the boxes, then find the bottleneck

Step 3 is a map of the whole system, end to end, before any detail:

  • Riders' app to Central system
  • Central system to Docks and bikes
  • Central system to Payments
Step 3: four boxes, no detail yet.

A rider taps unlock. The central system checks their account and tells the dock to release the bike. When the bike goes back into any dock, the dock reports it, the ride ends and the payments box charges the fare. Every requirement from step 1 has a home, and nothing is designed in depth yet.

Step 4 picks the hardest or busiest part. Step 2 already said the servers are easy, so Tomás looks at the 8 am rush. Here is one weekday hour at four of his stations, in this example:

  • Train station

    Docks
    30
    Bikes at 8:00
    25
    Taken 8–9
    70
    Returned 8–9
    10
  • Riverside offices

    Docks
    30
    Bikes at 8:00
    10
    Taken 8–9
    5
    Returned 8–9
    55
  • Market square

    Docks
    20
    Bikes at 8:00
    12
    Taken 8–9
    10
    Returned 8–9
    8
  • University

    Docks
    25
    Bikes at 8:00
    15
    Taken 8–9
    20
    Returned 8–9
    15
One weekday rush hour, illustrative numbers.

For each station, work out bikes at 8:00, plus returned, minus taken:

  • Train station: 25 + 10 − 70 = −35. A station can't hold fewer than zero bikes, so it runs dry. If rides are spread evenly through the hour, it is empty by about 8:25, and 35 commuters find no bike.
  • Riverside offices: 10 + 55 − 5 = 60 bikes for 30 docks. It is full by about 8:24, and 30 riders can't return their bike at the end of the ride, on their way into work.
  • Market square: 12 + 8 − 10 = 10. Fine.
  • University: 15 + 15 − 20 = 10. Fine.

Step 5 and the expert corner

Tomás has three ways to fix the imbalance, and each one has a cost:

  • A rebalancing van moves bikes from Riverside back to the train station before and during the rush. Reliable, but a running cost every weekday: a van and a driver.
  • More docks at Riverside fix the overflow, but cost money and pavement space, and do nothing for the empty train station.
  • A discount for returning bikes to the train station is cheap, but unreliable. On a rainy morning, few people will ride back the other way for a small discount.

His wrap-up says it plainly: "For phase one I chose the van plus the discount. The van is reliable and the discount trims how many bikes it has to move. It costs a driver every weekday. At 10x, 16,000 rides a day, one van can't keep up, so I'd add docks near the offices and more vans, and start measuring the servers: nearly a ride a second is still modest, but now worth watching." That is step 5: a choice, its price, and what changes at scale.

Where it breaks. The approach fails in two predictable ways. Skip step 1 and you get the castle docks: a solid design for the wrong problem. Jump to step 4 too early and you spend an hour perfecting the dock's lock before you know where the docks go. A quieter failure is false precision in step 2. You want the order of magnitude, not three decimal places.

In a system design interview. The same five steps work for "design a URL shortener" or "design a photo-sharing app": ask who uses it and what it must do, estimate, draw the boxes, go deep where the numbers say it hurts or where the interviewer pushes, then name your trade-offs. One common way to split a 45-minute interview, as a rough guide rather than a rule:

  • The first 5 to 10 minutes: requirements and estimates.
  • About a third: the high-level design.
  • About a third: the deep dive.
  • The last few minutes: trade-offs and what changes at 10x.

Recap: ask before you draw

Tomás and the rival team had the same town and the same budget. The difference was the order of the work: questions before docks, numbers before servers, one deep dive where it hurt, and an honest list of what each fix costs.

Ask before you draw: requirements, numbers, boxes, one deep dive, then the trade-offs.

Next in the series: back-of-the-envelope estimation, the quick maths behind step 2.

Summary

Key takeaways

  • A system design problem is vague on purpose; working out what to build is part of the job.
  • Clarify requirements first: who uses it, what it must do, how well, and what is out of scope.
  • Estimate just enough to tell small from huge; the numbers tell you where the real difficulty is.
  • Draw the whole system as boxes before designing any one part in depth.
  • Deep dive on the hardest or busiest part and find its bottleneck, which may not be the servers.
  • Ask before you draw: requirements, numbers, boxes, one deep dive, then the trade-offs.

Practice

Check your understanding

Question 1

01A team builds bike docks that work perfectly, but nobody uses them on weekdays because the council wanted commuters served. Which step did they skip?

Question 2

02Tomás estimates about one ride every 11 seconds. What does that tell him?

Question 3

03Riverside has 30 docks and 10 bikes at 8:00. Between 8 and 9, 55 bikes are returned and 5 taken. What happens?

Question 4

04Why wouldn't buying 20 more bikes and spreading them evenly fix the 8 am rush?

Question 5

05An interviewer says "design a URL shortener". What is the best first move?

Question 6

06Which statement belongs in step 5, trade-offs and wrap-up?

0 of 6 answered

Finished this lesson?

Mark it done to track your progress. Saved in this browser only.

FAQ

Frequently asked questions

What are the steps to approach a system design interview?

Clarify the requirements, estimate the size, sketch a high-level design, deep dive into the hardest or busiest part, then explain your trade-offs and what you would change at 10x scale.

What is the difference between functional and non-functional requirements?

Functional requirements say what the system must do, like unlocking a bike with an app. Non-functional requirements say how well, like unlocking in seconds or a bike within five minutes' walk at 8 am.

How long should each part of a 45-minute system design interview take?

There is no fixed rule. A common rough guide is the first 5 to 10 minutes on requirements and estimates, about a third on the high-level design, about a third on a deep dive, and the last few minutes on trade-offs.

Why ask questions before drawing a design?

Because the problem is vague on purpose. Without questions you can build a solid design for the wrong problem, like docks by a tourist castle when the council wanted weekday commuters served.

  • 6:55

    System Design Intermediate 5 min read

    Back-of-the-Envelope Estimation for System Design

    A few lines of rough maths tell you how big a problem is before you design for it. Follow an exam results website from 21 requests a second to 1,500 at 8:00 am, and see what each number decides.

    Oct 23, 2026

  • 7:12

    AI Engineering Beginner 6 min read

    LLM Eval Methods: Code Checks, Human Review and LLM-as-Judge

    An eval method is the procedure that turns one output into a verdict. See code, a judge model and a person each judge the same five customer emails, and learn when each one is the right tool.

    Oct 23, 2026