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:

VagueUseful
"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

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

© 2026 forcsguy.com. Original lesson text and diagrams. Books and sites linked above belong to their authors.