System Design Basics: How to Approach Any Design Problem
System Design & ArchitectureLesson 1 of 66 min read
What you'll learn
- Separate functional from non-functional requirements and ask the right clarifying questions
- Do back-of-envelope estimates for traffic, storage and bandwidth
- Apply a repeatable 5-step framework to any design problem
- Recognise the standard building blocks and what each one is for
On this page
"Design a news feed" is a vague sentence. Does it serve ten users or ten million? Must a new post appear instantly, or is a minute of delay fine? System design is the skill of turning vague goals like that into concrete decisions you can defend, and it starts long before you pick a database.
What system design actually is
System design is deciding how the parts of a software system (clients, servers, databases, caches, queues) are arranged so that the whole meets its goals at the expected scale. There is rarely one correct answer. There are only designs that fit particular requirements, and each one gives something up. A design that is perfect for a hobby blog is wrong for a payments platform, and the reverse is also true.
That is why good designers talk about trade-offs constantly: speed versus consistency, cost versus availability, simplicity versus flexibility. If a design has no downsides in your explanation, you probably have not found them yet.
Functional vs non-functional requirements
Functional requirements describe what the system does: users can post, follow others, see a feed, receive notifications. Non-functional requirements (NFRs) describe how well it does it: how fast, how available, how consistent, how durable, how large. Beginners spend all their time on the first kind, but the second kind is what actually drives architecture.
| Non-functional requirement | Question to ask | Design pressure it creates |
|---|---|---|
| Scalability | How many users, requests per second, data volume? | Horizontal scaling, partitioning, caching |
| Latency | What response time feels right (e.g. under 200 ms)? | Caches, CDNs, precomputation, nearby regions |
| Availability | How much downtime is acceptable? | Redundancy, failover, no single point of failure |
| Consistency | Can users see slightly stale data? | Replication strategy, consistency model |
| Durability | Is losing a write ever acceptable? | Replication, backups, write-ahead logs |
| Cost | What is the budget per month? | Right-sizing, tiered storage, build vs buy |
Back-of-envelope estimation
Estimation is not about being exact. It is about knowing whether you need one server or a hundred, a single database or a sharded cluster. Use round numbers, write your assumptions down and state them out loud. A useful shortcut is that a day has about 86,400 seconds, which you can treat as roughly 100,000 for quick math.
Here is an example for a small social app. These are illustrative assumptions, chosen to practise the method.
| Quantity | Assumption / calculation | Result |
|---|---|---|
| Daily active users (DAU) | Assume 10 million | 10M |
| Feed views per user per day | Assume 5 | 50M views/day |
| Average read rate | 50M / 86,400 seconds | about 580 requests/s |
| Peak read rate | Assume peak is 3x average | about 1,700 requests/s |
| New posts per day | Assume 1M posts at about 1 KB each | about 1 GB/day |
| Storage per year | 1 GB x 365 | about 365 GB (text only) |
Even this rough sheet is informative. About 1,700 requests per second at peak is manageable with a handful of ordinary servers, and text storage of a few hundred GB per year fits comfortably in a single database node at first. If photos or videos were involved, storage and bandwidth would dominate instead, and the design would change to include object storage and a CDN. A few orders of magnitude are worth remembering: reading from memory takes on the order of 100 nanoseconds, an SSD read on the order of 100 microseconds, a network round trip inside one data center around half a millisecond, and a trip across continents on the order of 100 milliseconds or more. These are rough figures, but they explain why caches and nearby regions matter.
A repeatable 5-step framework
When you face a blank whiteboard, a framework stops you from jumping to favourite tools. Follow these steps in order, and revisit earlier steps when something new appears.
- Clarify requirements and scope. List functional features, then NFRs. Decide what is out of scope (for example, ignore analytics for now).
- Estimate scale. Traffic per second, read to write ratio, storage per year, bandwidth. Note which number is the biggest constraint.
- Define the API and data model. Write the key endpoints and the main entities with their relationships. This reveals access patterns that later drive database choice.
- Draw the high-level design. Start with one simple path (client, server, database), then add components only where a requirement or estimate demands them.
- Deep dive on bottlenecks and trade-offs. Pick the riskiest parts (hot data, single points of failure, consistency) and explain alternatives, what each costs, and why you chose one.
The standard building blocks
Most designs combine the same handful of components. Knowing what each one is for lets you recognise where it belongs. Each of these gets its own lesson in this tutorial.
Clients (web, mobile)
|
v
+-----------------+
| Load balancer |
+-----------------+
| |
v v
+---------+ +---------+
| App #1 | | App #2 | (stateless)
+---------+ +---------+
| | | |
| +---+---+ |
| | |
v v v
+----------+ +-------+
| Cache | | Queue |--> Workers
+----------+ +-------+
|
v
+----------+
| Database |
+----------+| Component | What it is for | Lesson |
|---|---|---|
| Load balancer | Spreads requests across servers and hides failures | Scalability and Load Balancing |
| Cache | Serves hot data from memory to cut latency and database load | Caching |
| Database | Durable storage; choice of SQL or NoSQL, replication, sharding | Databases |
| Queue and workers | Moves slow or bursty work off the request path | Used in the URL shortener lesson |
| CDN | Serves static content from locations near users | Caching |
Common mistakes
- Jumping to tools before requirements. Saying "we will use Kafka and Cassandra" in the first minute. Symptom: you cannot justify the choice when asked what problem it solves, and you may over-engineer a system that needs one database.
- Skipping estimation. Symptom: you shard a database that would have fit on one machine, or you ignore a read rate that needs a cache.
- Ignoring failure modes. Drawing only the happy path. Ask what happens when each box dies, and where the single points of failure are.
- Designing for the maximum from day one. Planning for a billion users when you have a thousand adds cost and complexity. Design for the next order of magnitude and know how you would grow beyond it.
- Presenting one option as obviously right. Always name at least one alternative and what it would cost you.
How this shows up in interviews and real projects
In interviews, the framework above is essentially the expected structure of a good answer, and interviewers care more about your reasoning and trade-offs than a final diagram. At work, the same habits appear in design documents: a short list of requirements, rough numbers, a diagram and a section on alternatives considered. For a preparation plan, read the system design interview prep guide, and for the wider picture of interview loops see how to crack FAANG interviews.
Try it yourself
Pick a product you use daily (for example a food-delivery app). Write five functional requirements and five non-functional requirements for it, then do a back-of-envelope estimate: assume a number of daily users and orders, and compute requests per second at average and at peak.
Show a hint
Divide daily requests by 86,400 for the average, and multiply by 2 to 5 for the peak. Write each assumption next to the number so you can change it later.
Key takeaways
- Requirements come first: functional features say what to build, non-functional requirements drive the architecture.
- Back-of-envelope math with stated assumptions tells you which constraint matters; it does not need to be exact.
- Follow the 5 steps: clarify, estimate, API and data model, high-level design, deep dive on trade-offs.
- Add components only when a requirement or estimate justifies them, and always consider how each one can fail.
Test yourself
A trick from this lesson's ride: Features are the menu; non-functional requirements are how fast and how hot it arrives. Four more tricks like it wait along the route, each followed by a question.
Frequently asked questions
What is system design?
System design is the process of deciding how the components of a software system, such as servers, databases, caches and queues, are arranged so that it meets its requirements for scale, speed, reliability and cost. It always involves trade-offs rather than one correct answer.
What is the difference between functional and non-functional requirements?
Functional requirements describe what the system does, such as posting a message or searching for a job. Non-functional requirements describe qualities like latency, availability, consistency and scalability. The non-functional ones usually determine the architecture.
How do I start a system design interview answer?
Start by asking clarifying questions about features, users and scale, then state your assumptions and do a quick estimate. Only after that sketch a simple high-level design and expand the parts that matter most. Interviewers want to see structured reasoning, not an instant list of technologies.