System Design

Tap menu for chapters & tools

Chapter 13

System Design

How to frame, facilitate, and evaluate designs as a lead

21 min read

System design is how you turn product needs into a plan you can build: pieces, data flows, scale guesses, and what breaks first. You do not need to win every interview-style design prompt. You need design talks that end in shippable clarity.

A lead-friendly design sequence

  1. Clarify the problem: user journeys, non-goals, constraints, and success metrics.
  2. Estimate order of magnitude: QPS, data size, growth, read/write ratio, geography.
  3. Sketch a simple happy path before adding cleverness.
  4. Identify bottlenecks and single points of failure.
  5. Choose storage and consistency models on purpose (not by habit).
  6. Design APIs and events as product surfaces.
  7. Plan rollout: feature flags, migration, dual-write, backfill, rollback.
  8. Define SLOs and dashboards that prove the design in production.

Building blocks to keep in your mental kit

  • Load balancing, caching, CDNs, and rate limiting.
  • Queues and streams for async decoupling and spike absorption.
  • Relational vs document vs key-value vs search: pick for access patterns.
  • Partitioning/sharding, replication, and failover basics.
  • Idempotency, exactly-once illusions, and at-least-once reality.
  • Auth boundaries, multi-tenancy isolation, and audit trails.

Facilitate design reviews that teach

Your job in review is not to be the smartest person in the room. It is to surface missing requirements, risk, and ownership. Invite quieter engineers first. Separate preferences from constraints. Capture decisions live.

  • Start with the problem statement and constraints on one slide or doc section.
  • Require at least two viable options with trade-offs.
  • Time-box bikesheds; park aesthetic debates that do not move risk.
  • End with owners, open questions, and a follow-up date.
Interview vs production

Interview system design optimizes for signal in 45 minutes. Production system design optimizes for operability over years. Weight the latter when leading a team.

Common system design failure modes

  • Over-design for 100x scale when 3x is the real horizon.
  • Under-design for failure: no timeouts, retries, or poison-message plan.
  • Ignoring multi-region, compliance, or cost until launch week.
  • Designing the perfect service cut while the domain language is still mush.

Good system design is boring on purpose: clear flows, known limits, and failures that are cheap to understand.

API design as a product surface

Public and cross-team APIs outlive the code behind them. Treat contracts like product: stable names, clear errors, versioning, and a deprecation policy. Internal APIs still need owners and compatibility rules.

  • Resource modeling: nouns and actions that match domain language.
  • Idempotency keys for unsafe writes; pagination and filtering that scale.
  • Error model: machine-readable codes plus human messages.
  • Authn/z at the edge; never rely on callers are trusted forever.
  • Versioning strategy (URL, header, or additive fields) chosen on purpose.
  • Contract tests and consumer-driven checks where multiple teams meet.
  • Deprecation: announce, dual-run, measure, then remove with a date.
Review question

Can a new consumer integrate from the docs alone? If not, the API is under-specified, not just under-documented.

Diagrams for this topic

Visual models you can redraw on a whiteboard or in a design review.

Diagram

45-60 min interview / design loop
  1. 1Clarify requirements
  2. 2Estimate scale
  3. 3API + data model
  4. 4High-level boxes
  5. 5Deep dive 1-2 parts
  6. 6Failures & trade-offs

Diagram

Read-heavy vs write-heavy tactics

Read-heavy

  • CDN / cache
  • Replicas
  • Materialized views
  • CQRS-ish reads

Write-heavy

  • Partition keys
  • Async queues
  • Batch writes
  • Idempotency keys

Diagram

URL shortener sketch (components)

Path

  • Client → API
  • Key gen / hash
  • Primary store
  • Cache hot redirects
  • Analytics via queue

Classic practice problem: uniqueness, caching, and read amplification.

Worked examples

Concrete situations: what goes wrong, what to try instead, what changes.

Jumping to microservices

Setting. Design a notifications system in an interview / design review.

Common miss

Draw 12 services before requirements.

Stronger move

Clarify: channels, volume, delivery guarantees, latency. Estimate. Then 4-5 boxes with one deep dive on fan-out.

Outcome. You show process skill and trade-off judgment.

API contract freeze without consumers

Setting. A team wants to publish v1 of a shared API next week with no external consumer pilot.

Common miss

Ship the OpenAPI file and call it done.

Stronger move

Run a design review with two consumer teams, add idempotency and error model, and pilot with one client before freeze.

Outcome. Fewer breaking changes; API becomes a product surface.

Resources specific to this chapter

Go deeper with books, videos, and tools matched to this topic, not a generic dump.

Practice

End-of-chapter drill

Pick a system you own. Sketch happy path, top bottleneck, and one failure mode with mitigation.

Hint: Include timeouts and ownership of the page.

Design without failure modes is a wish.

Learn more on this topic

Full resource library