Interview Checklist¶
The one-page scan. Read this on the way into the interview. It's the 20-step framework compressed to what you can hold in your head.
The 6 questions that must be answered in the first 8 minutes¶
- What are we building — and what are we explicitly not building?
- Read-heavy or write-heavy? What's the read:write ratio?
- Scale — order of magnitude of DAU, peak RPS, storage/year?
- What needs strong consistency; what tolerates eventual?
- What's synchronous (user waits) vs asynchronous?
- What's the dominant NFR (latency? durability? availability? cost?)
If you can answer these six, the architecture almost designs itself.
The flow (glance, don't recite)¶
FRAME 1 clarify → 2 functional (must vs nice) → 3 NFRs (quantified)
4 assumptions → 5 estimate (peak RPS, storage, bandwidth)
MODEL 6 entities → 7 APIs → 8 data model (access patterns FIRST → DB choice)
DESIGN 9 simplest architecture (justify every box) → 10 walk read/write/async/failure flows
SCALE 11 rank bottlenecks (why/detect/metric/fix) → 12 scale each (cache→replicas→shard)
HARDEN 13 reliability → 14 consistency → 15 failure scenarios
16 security → 17 observability → 18 cost
CLOSE 19 trade-offs (both sides) → 20 evolution (stage 1→4, name each trigger)
Don't reach for these unless a requirement forces it¶
Kafka · Kubernetes · Cassandra · sharding · microservices · multi-region
For each one you do add, say: "why do we need this, and what does it solve that the simpler design can't?"
Scaling ladder (cheapest first — always in this order)¶
1. Vertical scale / tune queries + indexes (cheapest, often enough)
2. Stateless app tier + load balancer + autoscale
3. Cache the read path (cache-aside)
4. Read replicas
5. Async: move slow work to queue + workers
6. Partition
7. Shard ← last resort: hot shards, resharding, cross-shard queries
8. Multi-region ← only if RTO/RPO/latency demands it
Say it: "Before sharding I'd first exhaust indexing, caching, and read replicas."
The failure sweep (walk these proactively)¶
| Component | What happens | Mitigation |
|---|---|---|
| API server dies | LB routes around it | stateless + health checks |
| Worker dies mid-job | job redelivered | idempotent consumer, visibility timeout |
| DB primary fails | brief write pause | failover, reads from replicas |
| Cache dies | load hits DB | degrade gracefully, stampede guard |
| Queue unavailable | producers block | bounded buffer, backpressure, shed load |
| Downstream slow (200ms→10s) | threads pile up | timeout + circuit breaker + bulkhead |
| AZ fails | lose capacity | multi-AZ |
| Region fails | lose region | multi-region (if justified) |
| Bad deploy | errors spike | canary, rollback, backward-compatible schema |
Reliability toolkit (name-drop with intent)¶
timeout · retry + exponential backoff + jitter · idempotency key · circuit breaker · bulkhead ·
DLQ · backpressure / load shedding · graceful degradation · transactional outbox
Mantra: at-least-once delivery + idempotent consumers. Never promise end-to-end exactly-once.
Observability (what to measure & alert on)¶
- Metrics: RPS · p50/p95/p99 · error rate · cache hit ratio · queue depth · consumer lag · oldest-message age · DLQ count
- Alert on: p99 breaching SLA · error-rate spike · oldest-message age · DLQ growth (symptoms, not just resources)
- Also: structured logs · distributed tracing (trace/span IDs) · RED (services) / USE (resources)
Trade-offs you should be able to argue both sides of¶
SQL ↔ NoSQL · Kafka ↔ SQS ↔ RabbitMQ · sync ↔ async · push ↔ pull · fan-out-on-write ↔ on-read · strong ↔ eventual consistency · cache ↔ DB · monolith ↔ microservices · precompute ↔ compute-on-read · WebSocket ↔ SSE ↔ polling · single-region ↔ multi-region · active-active ↔ active-passive
Never declare a winner without naming the trade and tying it to the dominant requirement.
Final self-check (before you say "I'm done")¶
Can I answer, for this design:
- [ ] What are we building, who uses it, at what scale?
- [ ] Read/write pattern, and what data we store?
- [ ] What needs strong vs eventual consistency?
- [ ] What's sync vs async?
- [ ] What bottlenecks first, and how I scale it?
- [ ] What happens when each part fails?
- [ ] How I observe it and secure it?
- [ ] What it costs, and what I'd simplify?
- [ ] What changes at 10× and 100×?
Anti-patterns that cost staff-level points¶
- Drawing boxes before clarifying requirements
- Adding components you can't justify ("resume-driven design")
- Designing only the happy path
- Promising exactly-once delivery
- Precision theatre in estimates (5 sig figs of a guessed input)
- Declaring a tech "better" without a trade-off
- Sharding / microservices / multi-region by reflex
- Going silent — think out loud
← Back to The framework