Skip to main content
PProfileMatch

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

  1. What system design actually is
  2. Functional vs non-functional requirements
  3. Back-of-envelope estimation
  4. A repeatable 5-step framework
  5. The standard building blocks
  6. Common mistakes
  7. How this shows up in interviews and real projects

"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 requirementQuestion to askDesign pressure it creates
ScalabilityHow many users, requests per second, data volume?Horizontal scaling, partitioning, caching
LatencyWhat response time feels right (e.g. under 200 ms)?Caches, CDNs, precomputation, nearby regions
AvailabilityHow much downtime is acceptable?Redundancy, failover, no single point of failure
ConsistencyCan users see slightly stale data?Replication strategy, consistency model
DurabilityIs losing a write ever acceptable?Replication, backups, write-ahead logs
CostWhat 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.

QuantityAssumption / calculationResult
Daily active users (DAU)Assume 10 million10M
Feed views per user per dayAssume 550M views/day
Average read rate50M / 86,400 secondsabout 580 requests/s
Peak read rateAssume peak is 3x averageabout 1,700 requests/s
New posts per dayAssume 1M posts at about 1 KB eachabout 1 GB/day
Storage per year1 GB x 365about 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.

  1. Clarify requirements and scope. List functional features, then NFRs. Decide what is out of scope (for example, ignore analytics for now).
  2. Estimate scale. Traffic per second, read to write ratio, storage per year, bandwidth. Note which number is the biggest constraint.
  3. 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.
  4. Draw the high-level design. Start with one simple path (client, server, database), then add components only where a requirement or estimate demands them.
  5. 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.

A typical web-scale layout
 Clients (web, mobile)
          |
          v
 +-----------------+
 |  Load balancer  |
 +-----------------+
      |        |
      v        v
 +---------+ +---------+
 | App  #1 | | App  #2 |  (stateless)
 +---------+ +---------+
      |  |       |  |
      |  +---+---+  |
      |      |      |
      v      v      v
 +----------+  +-------+
 |  Cache   |  | Queue |--> Workers
 +----------+  +-------+
      |
      v
 +----------+
 | Database |
 +----------+
ComponentWhat it is forLesson
Load balancerSpreads requests across servers and hides failuresScalability and Load Balancing
CacheServes hot data from memory to cut latency and database loadCaching
DatabaseDurable storage; choice of SQL or NoSQL, replication, shardingDatabases
Queue and workersMoves slow or bursty work off the request pathUsed in the URL shortener lesson
CDNServes static content from locations near usersCaching

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.

Ride this lesson

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.