Pick a depth. Each prompt opens in your AI pre-loaded with the lesson. Click a row to preview the prompt.
The ambiguity in a design problem is not laziness on the part of whoever set it; it is the problem. Design a chat app is not a specification, and the gap between it and a specification is where all the judgement lives. Two builders given that sentence will produce completely different systems, and both can be right, because one assumed 50 people in a company and the other assumed 500 million people worldwide. Requirements are how you make your assumptions visible so that the rest of the conversation is about the design rather than about a misunderstanding. The part almost everyone skips is the third category: not what the system does, and not how fast, but the constraints that come from outside engineering entirely — where the data is legally allowed to live, how long you must keep it, what you are allowed to spend, and how many people will be on call for it. Those constraints routinely eliminate the architecture people spend twenty minutes drawing, and finding that out at minute forty is expensive.
Take a deliberately vague brief — design a ride-hailing app — and turn it into something designable in under five minutes. Three moves, in order.
Move one: cut the feature list to three. A ride-hailing product has fifty features. Pick the three that generate the interesting load: request a ride, match a driver, track the ride live. Say out loud that pricing, ratings, payments and support are out of scope for this conversation. You have just deleted 90 percent of the problem and made the remainder honest.
Move two: attach numbers and targets to those three. Not availability is important — 99.9 percent, which is 43 minutes of downtime a month, and say whether that is acceptable for matching versus for tracking. They are usually different, and noticing that they are different is worth more than the number itself.
Move three: ask the four constraint questions nobody asks. Where must the data live? How long must you keep it, and what must you be able to delete? What is the budget, in headcount-equivalents? How many people operate this? On a ride-hailing app in India, the residency answer alone can force a single-region design and delete the entire multi-region discussion before it starts.
One trap worth naming: consistency is not a single dial. Read-your-writes (a rider who just requested a ride must see it) is cheap and local. Global linearizability (no two riders can ever be matched to the same driver) is expensive and specific. If you write strong consistency in a requirements block without saying which of those you mean, you have written nothing.
# Filled in ~4 minutes at the start of a design conversation.
# Everything here is an assumption you STATED, not one you made silently.
functional:
in_scope:
- rider requests a ride from A to B
- system matches one nearby available driver
- both parties see live location until drop-off
out_of_scope: [pricing, ratings, payments, support, scheduled rides]
non_functional:
latency:
match_p99_ms: 3000 # a rider will wait 3s for a match
location_update_p99_ms: 500
availability:
matching: 99.9 # 43 min/month; a missed ride is lost revenue
tracking: 99.0 # degraded tracking is annoying, not fatal
durability:
completed_trips_rpo: 0 # never lose a finished trip, it is a receipt
location_pings_rpo: 60s # losing a minute of breadcrumbs is fine
consistency:
driver_assignment: exclusive # two riders must never get one driver
trip_history: read_your_writes # rider sees their own trip immediately
constraints:
residency: trip and location data for India stays in India
retention: location pings 90 days, trip records 7 years (tax)
deletion: account deletion must purge pings within 30 days
budget: infra under ~2 full-time salaries at current volume
team: 4 people, one on-call rotation, no dedicated DBA
# The residency line just deleted the multi-region design.
# The exclusive-assignment line just made this a locking problem.
# Both were free to discover here and expensive to discover at minute 40.