What system design is, and how to approach it
A repeatable way to turn a vague request like 'design Twitter' into a concrete, defensible architecture.
On the roadmap:Beginner · step 1: Think like a designer
Lesson 1 of 13 · 9 min read · quiz · exercise
Design is choosing under constraints
A system is the set of servers, databases, caches, queues and networks that together deliver a product. System design is the work of deciding which pieces you need, how they connect, and what you give up with each choice.
It matters because code that works for ten users often fails at ten million. Not because the code is wrong, but because new problems appear with scale: one machine is no longer enough, networks drop messages, disks fail, and two users change the same data at once.
A five-step approach
You can use the same sequence for a real project or an interview.
Figure SDA-FND-01-1 · Five-step design approach · © forcsguy.com
1. Clarify requirements. Separate what the system must do (functional) from how well it must do it (non-functional). Ask until the problem is small enough to solve.
- Functional: "users can post a photo and follow other users"
- Non-functional: "feeds load in under 300 ms", "uploads are never lost", "the site stays up if one data center fails"
2. Estimate scale. A rough guess of requests per second and data size tells you whether one database is enough or you need to split data across many. Lesson 3 covers this.
3. Sketch the high-level design. Boxes and arrows: clients, a load balancer, application servers, a database, maybe a cache and a queue. Keep it simple first.
4. Go deep on the hard parts. Pick the two or three places where the problem is genuinely difficult, such as how a feed is built, and design those carefully.
5. Check bottlenecks and failures. Ask what breaks first as traffic grows, and what happens when each component fails. Fix single points of failure.
Requirements: the part people skip
Compare these two requests:
| Vague | Useful |
|---|---|
| "Build a chat app" | "1-to-1 and group chat for 10 million daily users, messages delivered in under a second, history kept forever, no message ever lost" |
The second one tells you that you need persistent storage, a way to push messages to online users and a durability guarantee. The first tells you nothing.
Trade-offs are the whole game
Every decision has a cost:
- A cache makes reads fast but can serve stale data.
- Replicating data across data centers survives failures but makes writes slower or harder to keep consistent.
- Splitting an application into microservices lets teams work independently but adds network calls that can fail.
State the cost whenever you state a choice: "I would use a cache here, accepting that a user may see data up to a minute old, because reads outnumber writes 100 to 1."
Common mistakes
- Naming technologies before understanding the problem ("we will use Kafka")
- Designing for a billion users when you have a thousand. Plan for roughly 10 times your expected scale, not 1000 times.
- Ignoring failure. Networks and machines fail constantly at scale, so failure handling is part of the design, not an add-on.
- Never writing down assumptions. When estimates are wrong, the design built on them is wrong too.
In the next lesson we start with the simplest question: how does one server become many?
Real-world reading
Related reading
- The Architecture Twitter Uses to Deal with 150M Active Users, 300K QPS, a 22 MB/S Firehose, and Send Tweets in Under 5 SecondsHigh Scalability engineers · High ScalabilityCase Studies
- LISA '10 - Operations at Twitter: Scaling Beyond 100 Million UsersYouTubeYouTube
- Scaling Load Balancing Infra to Support 1.3 Billion Users at Facebook - Patrick Shuff, Production Engineer at FacebookFacebookYouTube
- Scaling Mailbox - From 0 to One Million Users in 6 Weeks and 100 Million Messages Per Day - High Scalability -High Scalability engineers · High ScalabilityCase Studies
Show 6 moreShow fewer
- Designing Data-Intensive ApplicationsMartin Kleppmann · O'ReillyBooks
- Azure Architecture CenterMicrosoft · Microsoft AzureDocumentation
- Instagram Architecture: 14 Million users, Terabytes of Photos, 100s of Instances, Dozens of Technologies - High Scalability -High Scalability engineers · High ScalabilityCase Studies
- How Discord Scaled Elixir to 5,000,000 Concurrent UsersDiscordCase Studies
- Designing a Microservices Architecture for FailureRisingstack engineers · RisingstackCase Studies
- Spotify EngineeringSpotify engineers · SpotifyBlogs
Check your understanding
Question 1 of 3
0 correct so far
You are asked to design a photo-sharing app. What should you do first?
Go deeper
- Designing Data-Intensive Applications, chapter 1 by Martin Kleppmann: reliability, scalability and maintainability explained
Try it: see a system in action
One tap in a real app already crosses a client, a server and a database. Watch it happen, then try scoping a brief a few different ways below.
The app
Remind me 24 hours before "Team sync"
What just happened
Tap the button to send a real request.
One tap in the app sends a real request. Watch where it actually goes.
Go further: the Builder
Once you know what to ask, the Builder is where you turn requirements into an architecture. Come back to this once you've met a few more concepts.
Try it yourself
You are asked to design a service that sends a reminder email 24 hours before a calendar event. Write the questions you would ask before designing anything, and the non-functional requirements you would want numbers for.
Click what a strong design here would need:
Next course
© 2026 forcsguy.com. Original lesson text and diagrams. Books and sites linked above belong to their authors.