InterviewLegend

Requirements & Estimation

Alex Chen20 min read
In this lesson
  • Write clear, scoped functional requirements that demonstrate prioritization
  • Define non-functional requirements that actually drive architecture decisions
  • Know when capacity estimation matters, and when it's a waste of time
  • Perform quick, defensible back-of-envelope calculations

The Delivery Framework tells you to start with requirements and estimation. But knowing *that* you should do it and knowing *how* to do it well are very different things. Most candidates either rush through requirements in 60 seconds or spend 15 minutes producing a grocery list that doesn't guide any design decisions.

This lesson teaches you how to do both steps well. You'll learn to scope a problem so your design has clear boundaries, and to estimate only when the numbers change what you build.

Functional Requirements

Functional requirements define what the system does, the user-facing capabilities. In an interview, you're not trying to capture every feature. You're trying to identify the 3-4 core capabilities that define the system and scope your design.

How to Frame Them

Always use the format: "Users should be able to..." This keeps requirements grounded in user actions rather than implementation details. "Users should be able to post short text messages" is a functional requirement. "The system uses a write-ahead log for tweet ingestion" is not. That's an implementation detail masquerading as a requirement.

Discuss requirements conversationally with the interviewer, as a back-and-forth rather than a monologue. Ask scoping questions as you go: "Should users be able to edit tweets after posting?" "Do we need to support media attachments or just text?" Each question shows you're thinking about product trade-offs alongside the technical ones.

Prioritize Ruthlessly

The single biggest mistake in requirements gathering is listing too many. Every requirement you add is a commitment to design, explain, and defend. Four focused requirements are far better than eight vague ones.

Do

  • 3-4 core capabilities that define the system
  • Requirements that create interesting design challenges
  • Scoping questions that narrow the problem

Don't

  • A laundry list of 8+ features
  • Obviously implied features (user login, error handling)
  • Requirements you can't design for in the time remaining

How do you choose which 3-4 to focus on? Pick the ones that make this system this system and not something generic. For a URL shortener, the interesting requirements are shortening, redirecting, and maybe analytics. User authentication isn't one of them. For a chat app, it's real-time messaging, group conversations, and delivery receipts, never profile editing.

Worked Example

Consider "Design Dropbox." Notice how the strong version focuses on what makes Dropbox unique, rather than listing everything a file storage app could do.

Weak Requirements (8 items)

  • Sign up and log in
  • Upload files
  • Download files
  • Share files
  • Delete files
  • Organize files into folders
  • Search for files
  • See version history

Strong Requirements (3 items)

  • Upload and download files (up to several GB)
  • Sync files across multiple devices automatically
  • Share files/folders with other users

The weak version lists eight features but fails to identify what makes Dropbox *Dropbox*: large file handling, multi-device sync, and sharing. The strong version scopes the problem to three capabilities that drive every major architecture decision.

Non-Functional Requirements

Non-functional requirements (NFRs) define the qualities your system must have: performance, reliability, consistency, scale. These are the constraints that shape your architecture. Frame them as "The system should..." statements.

Here's the key difference between weak and strong NFRs. Weak NFRs are generic ("the system should be scalable"), while strong NFRs are specific to this problem and directly influence a design choice.

Every non-functional requirement you state should eventually trigger a design decision. If an NFR doesn't change what you build, it's not worth mentioning. "The system should be available" adds nothing. "The system should prioritize availability over consistency, since users can tolerate seeing a slightly stale feed" changes your database choice, replication strategy, and caching approach.

The NFR Categories That Matter

Not all NFR categories apply to every problem. Pick the 2-3 that create the most architectural tension for your specific system.

1

Consistency vs Availability

Which side of the CAP trade-off does this system favor? A banking system needs strong consistency. A social feed can tolerate eventual consistency. This single decision ripples through your entire design.

2

Scale & Traffic Shape

How many users? What's the read-to-write ratio? Is traffic bursty or steady? "100M DAU, 1000:1 read-write ratio" tells you to optimize reads aggressively. "Event-driven spikes" tells you to think about queue-based architectures.

3

Latency

What response times do users expect? A search autocomplete needs sub-100ms. A batch analytics pipeline can take hours. Latency targets determine whether you cache, precompute, or process inline.

4

Durability & Data Loss

How catastrophic is losing data? A financial ledger cannot lose a single transaction. A view counter can tolerate some loss. This drives your replication and persistence strategy.

Worked Example

"Design Dropbox" Non-Functional Requirements:

• The system should support files up to 5GB → drives chunked upload design
• Consistency comes first, so users never see a corrupt or partially synced file → drives conflict resolution strategy
• Bandwidth usage should stay minimal, so a small change doesn't re-upload an entire file → drives delta sync / deduplication design

Each NFR creates a specific design challenge. Compare that to "The system should be fast, reliable, and scalable," which tells you nothing about what to build.

Capacity Estimation

Capacity estimation, also called "back-of-envelope math," is the most over-practiced and misunderstood part of the system design interview. Candidates spend valuable minutes calculating exact QPS, storage requirements, and bandwidth numbers, then never reference those numbers again.

When to Estimate

Estimate only when a number changes a design decision. If the answer is "we need a database" regardless of whether you have 1M or 100M users, the estimation adds no value.

Estimation Adds Value

  • "Can we fit all trending topics in memory on a single machine?" → determines whether you need distributed state
  • "What's the QPS for this rate limiter?" → determines whether a single Redis instance handles the load
  • "How much storage per day?" → determines whether you need a retention policy or can keep everything

Estimation Is Theater

  • Calculating exact bytes per tweet when storage is cheap and the design doesn't change either way
  • Computing bandwidth to prove you need a CDN, which you obviously do for any media-heavy app
  • Deriving QPS to three significant figures when the design only changes at order-of-magnitude boundaries

When you do estimate, tell the interviewer why: "Let me check whether a single machine can handle this workload, because it changes whether I need to shard." That framing shows mature engineering judgment rather than rote calculation.

How to Estimate Quickly

When estimation is warranted, keep it fast. You're looking for order-of-magnitude answers. Round aggressively and state your assumptions out loud.

A reliable formula for traffic estimation: start with DAU, estimate the percentage that performs the relevant action, and convert to per-second rates. For storage: estimate the average size of one record, multiply by the number of records per day, then extrapolate.

Example: Twitter write QPS
• 100M DAU
• ~10% tweet per day → 10M tweets/day
• 10M / 100K seconds per day ≈ 100 tweets/sec

That took 15 seconds. And the useful takeaway is that 100 QPS is easily handled by a single database. No need for write sharding yet.

Notice the shortcut: instead of dividing by 86,400 seconds in a day, use 100K (10⁵). This is close enough for interview math and much easier to compute mentally. Similarly, use 1M seconds per ~10 days, and 30M seconds per month.

Useful Numbers to Memorize

You don't need to memorize a giant table of latencies and throughput numbers. A handful of reference points make estimation dramatically faster.

  • ~100K Seconds per day. Actually 86,400; round up.
  • ~1 KB Avg text record. A tweet, comment, or short message.
  • ~1 MB Avg image. After compression (JPEG).
  • ~10 MB Avg video minute. Compressed, standard quality.
  • ~10K SQL reads/sec. Single PostgreSQL instance.
  • ~100K Redis ops/sec. Single Redis instance.

These are ballpark figures. The exact numbers depend on hardware, configuration, and query complexity. But they give you enough precision to make design decisions, which is all that matters.

The "Defer" Strategy

Here's the approach that top candidates use: during the requirements phase, state your scale assumptions ("I'll assume 100M DAU, read-heavy workload") but don't do the math yet. Instead, say: "I'll estimate specific numbers when they become relevant to a design decision."

Then, during high-level design or deep dives, when you reach a decision point, pull out the estimation: "Should I precompute the feed or generate it on demand? Let me estimate the fanout..." This approach uses your time far more efficiently and makes your estimations feel purposeful rather than performative.

One exception: if the interviewer explicitly asks you to do a capacity estimation upfront, do it. Don't argue methodology with your interviewer. Adapt to their expectations, but keep it brief, 2 minutes max.

Putting It All Together

Here's what the first five minutes of a well-executed system design interview looks like, applied to "Design a URL Shortener."

0:00, Clarifying Questions

"Should URLs expire, or are they permanent?" "Do we need analytics like click counts and referrer tracking?" "Is this a public service or internal to an organization?"

0:02, Functional Requirements

• Users should be able to create a shortened URL from a long URL • Users should be able to be redirected to the original URL when visiting the short link • Users should be able to view basic analytics (click count) for their links

0:03, Non-Functional Requirements

• The system should support 100M shortened URLs created per month • Redirects should have very low latency (< 100ms p99), since this is the hot path • The system should prioritize availability, because a failed redirect is worse than a slightly stale click count • Short URLs should be unique and not guessable

0:05, Scale Acknowledgment (Deferred)

"Given 100M URLs/month, reads will vastly outnumber writes since each URL gets clicked many times. I'll estimate exact QPS when I reach the redirect path design."

Total time: five minutes. The interviewer now knows exactly what system you're building, what constraints you're designing for, and that you have a plan for when to dive into numbers. You've demonstrated problem navigation without wasting a minute on unnecessary math.

Common Mistakes

"The system should be scalable, reliable, and fast." Those are not non-functional requirements. They're adjectives. Every system should be all three. Your NFRs need to specify *how* scalable, *how* reliable, and *how* fast, and *why* those targets matter for this particular system.

Listing requirements you won't design for. If you say "users should be able to search tweets" but then never design a search component, the requirement just highlighted a gap. Only state requirements you intend to address.

Spending 5 minutes on capacity estimation at the start. Unless a number changes your design, those 5 minutes are better spent on high-level architecture. Most interviewers would rather see a complete design than precise QPS figures.

Not involving the interviewer. Requirements should be a conversation. If you spend three minutes in a monologue listing requirements, you've missed the chance to demonstrate collaboration and to get the interviewer's guidance on what they care about most.

Key Takeaways

  • ✓Functional requirements: 3-4 capabilities framed as "Users should be able to...". Pick the ones that make this system unique.
  • ✓Non-functional requirements: specific, quantified constraints that directly drive design decisions. If an NFR doesn't change what you build, cut it.
  • ✓Capacity estimation: only when a number changes a design decision. Defer the math to when it's relevant.
  • ✓Keep the entire requirements phase to 5 minutes. Discuss interactively with the interviewer.
  • ✓Memorize a few reference numbers (seconds/day, record sizes, DB throughput) so you can estimate quickly when needed.