The Requirement You Should Be Able to Answer Cold
coreadvancedThis is the exit test for the whole topic: one paragraph of requirements, and a complete design produced from it in an interview or a design session, with every service justified by something earlier in your own reasoning. Not a diagram you remember — a design you derive, where changing one requirement visibly changes the answer.
Think of it as
The requirement paragraph is a list of constraints in disguise. "High-concurrency" is a number you must ask for. "Asynchronous workers" means a second scaling dimension. "Disaster recovery" means an RPO and RTO nobody has stated yet. Read it as a set of questions first, and the design follows from the answers rather than from a template.
What we're doing: Answer the requirement paragraph out loud, in the order it should come.
- 1
- Asking for the numbers before drawing is the single strongest signal in this whole exercise, and it takes fifteen seconds.
- 6
- Accounts and network first, because every later component is placed inside decisions made here.
- 14
- Two services with two scaling signals is the detail that shows the "asynchronous workers" phrase was read as an architecture requirement rather than a feature.
- 30
- Presigned uploads keep large bodies out of the request path entirely, which removes a whole class of timeout and memory problems.
Why this works: The answer is judged on order and justification rather than completeness. Numbers before boxes, then containment (accounts, network), then the request path, then state, then identity, then how it is watched, delivered and recovered — and a closing statement of the trade-off with the condition that would reverse it. Every component named is traceable to something said earlier in the same answer.
Drawing the architecture before asking for a number
Wrong
Better
What you see: A complete and correct-sounding answer that cannot survive a follow-up, because nothing in it was chosen and so nothing in it can be defended.
Why: The paragraph is deliberately unquantified, and noticing that is part of what is being tested. Without the numbers, several architectures are equally defensible and none can be recommended — so an answer given without them is a recollection rather than a design, and the perturbation test exposes it immediately.
- Three columns: the requirement phrase, the question it forces, and the component that answers it.
- High-concurrency: ask for requests per second, payload size, growth and read-to-write ratio; answered by an ALB with an ECS service and target tracking.
- Django and PostgreSQL: ask how many connections per worker and how failover is handled; answered by RDS or Aurora with a standby, a connection pool sized against max_connections, and a proxy if needed.
- Redis: ask what is cached and what a miss costs; answered by ElastiCache for cache, sessions and rate limiting, never as the system of record.
- S3 file uploads: ask how large and who may read them; answered by presigned uploads direct to S3, with CloudFront for delivery.
- Asynchronous workers: ask what must not block a response; answered by SQS with a separate worker service scaling on queue depth.
- Authentication: ask whose identities and where sessions live; answered by an identity provider plus a shared session store.
- Production monitoring: ask which signals would page someone; answered by CloudWatch metrics, logs, alarms and traces.
- Autoscaling: ask which metric actually tracks load; answered by target tracking on request count for web and queue depth for workers.
- CI/CD: ask how a bad release is reversed; answered by a pipeline with gated migrations and a tested rollback.
- Disaster recovery: ask what RPO and RTO were agreed; answered by the strategy those two numbers permit.
The ten requirement phrases, the number or decision each hides, and what changes if the answer changes
Together
Remember: Ask for the numbers before drawing: peak rate, read-to-write ratio, payload size, growth, and the agreed RPO and RTO. Then work outward — accounts and network, request path, state, identity, observability, delivery, recovery — and finish with the trade-off you made and the condition that would reverse it. Then perturb it: change one requirement and say what moves.
See also: designing a system on aws · the reasoning progression · project 1 production django api · rpo and rto · mapping a backend to aws

