Designing a System on AWS, Worked Through
coreadvancedA senior design answer is not a diagram produced from memory. It is a short sequence: establish the requirements and the scale, derive the read and write shape from them, choose the data model, and only then pick services. Doing it in that order means every box on the final diagram has a reason, and the reasons are what is actually being assessed.
Think of it as
Numbers before boxes. Requests per second, object sizes, growth rate and read-to-write ratio narrow the service choice far more than any preference does — a hundred writes a second and a hundred thousand are different systems, and nothing about the diagram is decidable until you know which one you are drawing.
What we're doing: Design a URL shortener end to end, showing where each decision comes from.
- 1
- The staleness allowance in step 1 is what makes step 5 possible; without it the whole design changes.
- 7
- The ratio, not the raw count, is what tells you this is a caching problem rather than a throughput problem.
- 13
- Separating what blocks a user from what does not is the decision the rest of the design is built on.
- 20
- One dominant access pattern means one store and one key — resisting a richer model is part of the answer.
- 28
- Naming what would change the design is what turns a diagram into an argument, and it is what is actually being assessed.
Why this works: The finished diagram for a URL shortener is well known, which makes it a poor demonstration on its own. What is worth seeing is that every box is entailed by a number or a requirement stated earlier — and that changing one line in step 1 changes step 5. A design that cannot be perturbed like that was recalled, not derived.
Choosing services before doing the arithmetic
Wrong
Better
What you see: The design cannot answer "why not something simpler", because there is no derivation to point at — only a preference.
Why: Services chosen first become constraints that later requirements have to fit around, so the arithmetic ends up justifying the choice instead of driving it. Deriving the numbers first usually produces a simpler system, and always produces one whose choices can be defended when a requirement changes.
- Six numbered steps arranged as a descending staircase.
- Step 1: requirements — what must be true, and the latency, availability and consistency targets.
- Step 2: scale — requests per second, object sizes, growth, and the read-to-write ratio.
- Step 3: API — the operations, and which of them are on the critical path.
- Step 4: data model — access patterns first, then the store that serves them.
- Step 5: services — compute, cache, queue and network, chosen to fit steps 1 to 4.
- Step 6: failure and operations — what breaks, what the user sees, what is observable, and what it costs.
- A note reads: the arrow only runs downward, and a change at any step invalidates everything below it.
The six steps, and the question that unlocks each one
Together
Remember: Requirements, scale, API, data model, services, failure and operations — in that order, downward only. Do the arithmetic before naming a service, separate what blocks a user from what does not, state what may be eventually consistent, and finish with the trade-off you made and what would change it.
See also: the system shapes worth knowing · the design dimensions · serverless api · making tradeoffs explicit

