System Design Starts With Requirements and Constraints

Turn a product problem into explicit use cases, boundaries, workload assumptions, and tradeoffs before choosing infrastructure.

On this page

The short answer

System design is the work of choosing how a system meets a particular set of needs. Start by stating what people must do, what quality they expect, what limits you must respect, and what lies inside the design. Only then compare technical options.

For a small link-sharing service, “create a short link” is a requirement. “Use five microservices” is a possible design, not a requirement. The right choice depends on traffic, reliability, cost, team capacity, and existing infrastructure. The Google Cloud Well-Architected Framework similarly connects architecture to use cases, tradeoffs, and operational simplicity.Its guidance is cloud-specific, but the questions are broadly useful.1

Mental model

Write a problem statement before drawing a solution: users and use cases → system boundary → quality goals and constraints → assumptions → candidate design → measured feedback. Revisit the earlier steps when evidence changes.
System traceA design begins with contextA user need and explicit constraints frame the system boundary. Candidate components are considered only after those inputs are clear; measurements then test the choice.
  1. Users and use casesWhat must happen?
  2. BoundaryWhat is inside, dependent, or out of scope?
  3. Qualities and constraintsHow well, under which limits?
  4. Candidate designChoose the simplest workable components.
  5. EvidenceMeasure behavior and revise assumptions.

What system design actually means

It connects product behavior to data, computation, communication, failure handling, and operations. A useful design can be one application and one database. A larger design is not automatically more mature. Google Cloud's architecture guidance explicitly recommends starting simply and resisting over-engineering.That is a provider's recommendation, not a rule that every system has identical needs.1

Begin with the problem

Who has a problem? What action must succeed? Which failure would matter most? For the illustrative link service, perhaps a person creates a short link and another person follows it. Decide whether usage statistics and disabling links are needed now, or merely possible later. A design for unconfirmed features is guesswork.

Functional requirements

Functional requirements say what the system does. A deliberately small version might create a short link, redirect it, disable it, and show basic usage information. Each action suggests an input, result, and error condition. These are behaviors, not product names or cloud services.

Nonfunctional requirements

These describe qualities or limits: expected response time, availability, durability, consistency, scale, security, privacy, operability, and cost. They can conflict. Extra redundancy can increase availability but also cost and operational work. Stronger consistency may constrain some distribution choices. Not every operation needs the same target.

An availability goal concerns whether the service can be used. Durability concerns whether accepted data survives. Low latency concerns how long an operation takes. Google SRE's service-level discussion separates these measures and recommends choosing indicators that matter to users.A numeric target needs a measurement definition; “fast” alone cannot be tested.3

Users and use cases

A visitor following a link and an owner disabling one may have different permission and performance needs. Identify the major actors and their important actions. “All users” can hide a critical distinction between a frequent read and a rare write.

System boundaries

The boundary says what you are designing. The browser, link API, and stored mappings might be in scope; an external identity service may be a dependency; billing or analytics might be out of scope. AWS Well-Architected's workload-and-scope guidance treats scope as an explicit review decision.A boundary is not necessarily a team boundary or repository boundary.2

Constraints

Constraints narrow viable choices. Examples: one development team, a fixed hosting budget, existing database expertise, a release deadline, or a legal data-handling requirement. Security and regulatory constraints must be verified for the actual project; this article does not invent any for the example.

Assumptions

When a number is unknown, label an assumption rather than disguising it as fact: “Assume redirects greatly outnumber link creations; verify after launch.” Record what decision depends on it and when to revisit it. An assumption is not a production measurement.

Traffic patterns

Ask about active users, average and peak requests per second, bursts, read-to-write ratio, request sizes, geography, and critical operations. A redirect-heavy service differs from one with frequent edits. Do not turn a daily-user count directly into server capacity; the next lesson shows how to make an explicit rough estimate.

Data characteristics

What must be stored? How much arrives, how long is it retained, and who may read or change it? For a short link, the mapping is essential; optional click analytics can have different volume and retention needs. A read-heavy mapping workload and a write-heavy event workload need not share one access strategy.

Reliability expectations

Ask which failures are acceptable, for how long, and for whom. An internal reporting page and a public redirect endpoint may have different availability expectations. Define whether a successful write must survive process restarts. Reliability goals should be testable and proportionate, not automatically “five nines.”

Security and privacy requirements

Identify sensitive data, abuse risks, permissions, retention, and external sharing before selecting storage or logging. A public redirect service may need protection against malicious destinations or abuse, but this example does not prescribe a complete security design. Specific controls depend on the threat model.

Cost and operational constraints

The team must be able to deploy, monitor, repair, and pay for the system. Managed services may reduce some operational work but add pricing and provider tradeoffs. A more distributed design can create more failure boundaries. Include operational skill and on-call capacity in the choice.

What not to design yet

Do not choose a queue, cache, load balancer, database family, or microservice boundary just because it appears in an example diagram. First ask which requirement each component serves. The backend request lesson already covers the application flow; system design asks whether that flow meets the stated workload and failure goals.

A small design exercise

For the link service, write four functional actions, one boundary, and three unknowns. For example: are redirects far more frequent than edits; must a disabled link stop working immediately; and what outage duration is acceptable? Name the assumption behind each tentative answer. Do not draw infrastructure yet.

Common misconceptions

Technology names are requirements

“Use MongoDB” or “add Kafka” is usually a proposed solution. The requirement is a behavior or quality to achieve. Compare options after describing it.

Scale and speed are the same

Scalability concerns how behavior changes as demand grows. Performance describes behavior at a given workload. A system may be fast for a few users but hard to expand, or expandable while individual requests remain slow.

Design-review scenario

Review an oversized proposal

An AI proposes an API gateway, five microservices, Kafka, Redis, Kubernetes, and multiple databases for an internal app with 200 users, low request volume, and one development team. No independent-scaling or strict isolation need has been stated.

Ask which requirement justifies each added component and who will operate it. None of these technologies is inherently bad; the proposal is unsupported until it explains a concrete need, expected benefit, cost, and simpler alternative. A single application and database may be a better starting hypothesis, subject to the real security and reliability requirements.

Why this matters when reviewing AI-generated designs

An assistant does not know real traffic, budget, team size, sensitive data, or operational expertise unless given that context. A plausible diagram can hide invented assumptions. Ask it to separate known facts from assumptions, show the tradeoff of each component, and state what evidence would change the recommendation.

Knowledge check

Reflect, then reveal each answer.

  1. Is ‘use microservices’ a functional requirement?

    No. It is a design choice. A functional requirement names behavior the system must provide.

  2. How do availability and durability differ?

    Availability concerns whether a service can be used; durability concerns whether accepted data is retained over time.

  3. Why state the system boundary?

    It makes clear what is being designed, what it depends on, and what is out of scope, so decisions and failure responsibilities are understandable.

  4. What should you do when the read-to-write ratio is unknown?

    Record a labeled assumption, identify which decision depends on it, and plan to verify it with measurements.

  5. What question should precede adding a queue or cache?

    Which observed or required behavior calls for it, and what simpler design could meet the same need?

What to learn next

How this connects

  1. Latency, Throughput, Capacity, and Bottlenecks

    Turn workload questions into measured quantities and transparent estimates.

  2. Scaling, Load Balancing, and Stateless Services

    Later, use observed limits to decide whether more instances help.

  3. How a Backend Processes a Request

    Revisit the application boundary before drawing a larger system.

Key takeaway

A design is an answer to explicit needs and constraints. The diagram comes after the questions.

References & further reading

References & further reading3 sourcesPrimary standards and official documentation used for this lesson.
  1. Google Cloud Well-Architected Framework (opens in a new tab)

    Google Cloud

    Design tradeoffs, nonfunctional concerns, documentation, and starting simply

  2. Workload and scope (opens in a new tab)

    Amazon Web Services

    Defining workload boundaries and review scope

  3. Service Level Objectives (opens in a new tab)

    Google SRE

    Distinguishing availability, latency, throughput, and durability objectives

Return to the learning path