Skip to content

Back-of-envelope estimation

An estimate is a decision tool. The window, the peak and the units change the answer; the third digit never does.

Predict first

Before you read: predict

On ExamHall's busiest day, 20,000 candidates each sit one exam, and each exam sends the proctor console's live feed 60 alerts on average (a tab switch, a face lost, a second voice). Exams run only between 08:00 and 16:00. Last term's logs put the busiest minute at 10 times the average rate while exams are running. Round as you like: the options are at least 2× apart.

About how many alerts a second must the feed accept in that busiest minute?

Pick one

The 30-second version

Estimate only what could change the design. A rate is users × actions ÷ the seconds they really spread over: often a window, not the 10^5-second day. Multiply by a peak factor to size rates, never storage. Storage is daily bytes × 365 × copies; bandwidth is peak rate × bytes × 8. Round hard: the order of magnitude decides.

An estimate is a decision tool. The window, the peak and the units change the answer; the third digit never does.

Step through the code

Trace of the opening question

Play options

Ready: press Play or step with Next frame

Row 1 of 4 · Quantity alerts in the day

Starting row · computed by comparing each row with the one before

  • Quantity: alerts in the day
  • Working: 20,000 × 60
  • Value: 1,200,000

Rule · step 2

A rate is users × actions per user ÷ the seconds those actions spread over. A day is 86,400 s, about 10^5.

Quantity
alerts in the day
Working
20,000 × 60
Value
1,200,000
Step
2
Trace of the opening question
QuantityWorkingValueStep
alerts in the day20,000 × 601,200,0002
seconds they spread over (changed)8 h × 3,600 s (changed)28,800 (changed)3
window average (changed)1,200,000 ÷ 28,800 (changed)about 42 a second (changed)2, 3
busiest minute (changed)42 × 10 (changed)about 420 a second (changed)4

Space plays or pauses · ←/→ one row · Home/End first/last

Rows come from the pack's own trace table.

How it works

Step 1 of 11

Start from the decision. Estimate only the numbers that could change it: one box, a handful of boxes, or a different design.
See it run

Not in this run

Analogy: A music festival organiser sizing the bars and skips

Before a single bar is built, the organiser works from the ticket count and how people behave.

At the festival In the estimate
40,000 ticket holders × 3 drinks each an evening users × actions (step 2)
the bars open 18:00–24:00, not all day the active window (step 3)
the changeover before the headline act, when the queues triple the peak factor (step 4)
the skips hold the weekend's rubbish; the rush does not make it bigger peak multiplies rates, not totals (step 6)
nobody counts cups to the unit round hard (step 10)
a trestle bar, a row of bars, or a separate bar field one box, ten boxes, a different design (step 11)

In real terms: a rate is a total divided by the seconds it really spans, multiplied by a peak factor; totals such as storage add up every day and ignore the peak.

Breaks down when: one drink is one purchase, but one web request can look up dozens of rows (step 9). The festival has nothing like that fan-out.

Contrasting case: staffing the bars as if all 40,000 people ordered in the same second. That is "everyone at once" (step 5), not a peak.

Examples, run for real

4.1 ExamHall: the proctor console live feed

EXH-1680: at the first exam start of a busy morning, the alert feed fell minutes behind. Its consumers were sized from the day's alert count spread over 24 hours, with no peak factor. MR !1880 sizes it from the exam-hours window and the busiest minute in last term's logs, and writes every input down with its source.

4.1 heartbeats: 2,400 candidates / 10 s = 240 messages/s, flat through the sitting (one sitting, so no peak factor)
4.1 alerts: 2,400 x 25 = 60,000 rows per sitting, 24 MB; each is read by the proctor's console and the room supervisor's: 2 reads per write
4.1 hook: 50,000 autosaving every 10 s = 5,000 writes/s; 50,000 starts in 10 min = 83.3/s average; half in the first minute = 417/s (5x the average)

ECON-201's feed is small: 240 messages a second is one box (steps 2, 11). The platform-wide start is the rate to watch. Its first minute runs at 5× the ten-minute average (step 4).

4.2 Proof domain, catalog: exact against rough

Two million products with 8 images of 300 KB, kept twice; 30 million searches a day, evening peak 3×; a search box handles 2,000 a second.

4.2 exact images 8.94 TiB · peak search 1,040/s -> 1 search box(es) at 2,000/s
4.2 rough images 10 TB  · peak search   900/s -> 1 search box(es) at 2,000/s
4.2 search responses at peak: 41.7 MB/s = 333 Mbit/s

Binary units and a 10^5-second day move each number by 10–15%. Neither moves the decision: about 10 TB of images and one search box (step 10). At 40 KB per result page, the peak's 41.7 MB/s is 333 Mbit/s on the wire (step 8).

4.3 The original: Jeff Dean's thumbnail page (LADIS 2009)

Dean's slide asks how long a results page of 30 thumbnails takes. The inputs are his cited figures: a disk seek of 10 ms, and reads at 30 MB/s.

4.3 serial: 30 x 10 ms + 30 x 256K / 30 MB/s = 556 ms (slide: 560 ms)
4.3 parallel: 10 ms + 256K / 30 MB/s = 18.5 ms (slide: 18 ms)

A 30× gap, found before anything was built, picks the design (step 1). The latency figures are inputs from the slide, not something to recall.

Try it

Answer first, then check. Nothing is saved.

Question 1 of 5

A catalog serves 50 million product-page views a day, with no cache in front of its origin server. The busiest hour runs at 3 times the day's average rate, and each view downloads 1.5 MB from the origin. The options are at least 2× apart.

About how much uplink bandwidth does the origin need in the busiest hour?

Pick one

Question 2 of 5

A category page shows 48 products, and each product's price and stock come from its own record in the product store. The site serves 2 million category-page views a day. During a day, 100,000 products change price or stock, 4 times each on average.

What is the product store's ratio of reads to writes?

Pick one

Question 3 of 5

A card-payments API is sized from 40 million payments a day. The estimate divides by a day of 10^5 seconds, gets 400 payments a second and concludes that one server is enough, since a load test showed one server handles 500 a second. Refunds add 800,000 writes a day, and the payments log shows 12% of the day's payments falling in the lunchtime hour. The reviewer may ask for one correction before the server count is signed off.

Which one should it be?

Pick one

Question 4 of 5

A chat app's design doc sizes its message store from these inputs: 2 million daily users, 40 messages each a day, 250 bytes per stored message, an evening peak at 4 times the day's average rate, and 3 copies of every message. The doc's figures are estimates, rounded on purpose.

Which line, if any, is wrong?

Code for this question
1  messages a day        = 2,000,000 × 40                        = 80,000,0002  peak write rate       = 80,000,000 ÷ 10^5 s × 4               = 3,200 a second3  peak ingest           = 3,200 × 250 B = 800 KB/s              ≈ 6.4 Mbit/s4  one year of messages  = 80,000,000 × 250 B × 365 × 4          = 29.2 TB5  disk to buy           = 29.2 TB × 3 copies                    = 87.6 TB
Pick one

Question 5 of 5

A music-streaming service expects 60 million plays a day, and the evening peak runs at 4 times the day's average rate. Each play inserts a row into the listener's history and adds one to four counters: the track's, the album's, the artist's and the listener's monthly total. In a load test, one database primary sustained 5,000 writes a second. The team's rule: if the peak needs more than 10 primaries' worth of writes, they look for a different design.

Which plan does the estimate support?

Pick one

Go deeper

Pro tips
  1. Say each input aloud with its unit and its source, rounded to one figure, and name the decision it feeds. For example: "60 alerts per exam, from last term's logs; this decides whether the feed needs more than one consumer." When: the estimation minutes of any design round (step 1). Verify: Hello Interview's delivery framework says "perform calculations only if they will directly influence your design". Status: DOC.
  2. Measure a peak factor from an access log rather than guessing it. Take the busiest minute's request count and divide it by the average over the minutes that had traffic:
    awk '{print substr($4, 14, 5)}' access.log | sort | uniq -c | sort -rn | head -1
    When: before stating a peak factor (step 4). Verify: busiest minute: 2417 09:00 · active minutes: 480, requests: 14400, average per active minute: 30 · peak factor (busiest / average): 80. For a log in nginx's default format, $4 is [29/Sep/2026:09:00:17, so characters 14–18 are HH:MM.
Source
  • Jeff Dean, "Designs, Lessons and Advice from Building Large Distributed Systems", LADIS 2009 keynote: https://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf · fetched 2026-09-29. The slide "Back of the Envelope Calculations" works the thumbnail page: "30 seeks * 10 ms/seek + 30 * 256K / 30 MB/s = 560 ms" and, with parallel reads, "18 ms". It also says: "Back of the envelope helps identify most promising…". Valid as of 2026-09-29.
  • Hello Interview, "Delivery framework", section "3) Capacity Estimation": https://www.hellointerview.com/learn/system-design/in-a-hurry/delivery · fetched 2026-09-29. Quoted: "perform calculations only if they will directly influence your design", and its TopK example, where the count decides "whether you can use a single instance … or if you need to shard it across multiple instances". Supports step 1, step 11 and pro tip 1. Valid as of 2026-09-29.
  • Hello Interview, "Numbers to Know": https://www.hellointerview.com/learn/system-design/core-concepts/numbers-to-know · fetched 2026-09-29. The body is behind a paywall, so nothing in this lesson rests on it. Its point, that modern hardware handles more than old numbers suggest, belongs to scale-numbers-to-know (W9).
  • Arithmetic facts (86,400 s a day, 8 bits per byte, 1 TiB = 1,024^4 bytes) are definitions; the scripts compute with them.

Checked against the tools and docs as of 2026-09-29.