Design review patterns
Every pattern Arqly recognizes. The shape of the mistake matters more than which interview you saw it in — write each one down so the same trap stops surprising you.
Clarifications
Ambiguity you would resolve with the interviewer: scope, scale, who uses it, what counts as done.
Started designing without asking clarifying questions.
clarification.skippedDid not ask about scale, traffic, or growth before designing.
clarification.missed-scaleDid not narrow scope; tried to solve everything.
clarification.missed-scope
Functional reqs
Bullets, not prose. One capability per line.
Functional requirements lack specificity or measurable outcome.
functional.vague-requirementDid not separate must-have from nice-to-have.
functional.missing-priority
Non-functional
Latency, availability, consistency, durability, security targets.
Did not specify p50/p99 latency targets.
non-functional.missing-latencyDid not specify SLO or availability target.
non-functional.missing-availabilityDid not commit to a consistency model.
non-functional.missing-consistencyDid not specify durability or RPO.
non-functional.missing-durability
Capacity estimation
QPS, storage, bandwidth, growth. Order of magnitude before boxes.
Did not estimate capacity before drawing components.
capacity.skippedDid not estimate write QPS, only read.
capacity.missing-write-qpsDid not estimate read QPS.
capacity.missing-read-qpsDid not estimate storage growth.
capacity.missing-storageDid not estimate egress or bandwidth.
capacity.missing-bandwidthEstimate is wrong by an order of magnitude.
capacity.math-errorPulled a number without grounding.
capacity.unjustified-assumption
API design
Endpoints, request/response shapes, protocols.
List endpoint without pagination.
api.missing-paginationMutation endpoint without idempotency key strategy.
api.missing-idempotencyAPI design did not specify authn/authz.
api.missing-authNo error codes, retry semantics, or partial-failure handling.
api.weak-error-modelPublic endpoint without rate limit.
api.missing-rate-limit
Data model
Schema, indexes, partition keys, database choice — and why.
Picked a database without defending the choice against access patterns.
data-model.db-without-defenseDid not specify partition or shard key for a sharded store.
data-model.no-partition-keyDid not name secondary indexes for query patterns.
data-model.missing-index-strategyPicked a DB family that does not match the access pattern.
data-model.wrong-family
Use-case breakdown
Walk one requirement at a time. Answer the hard question each one raises before you draw anything.
High-level design
Components, data flow, technologies — placed by drag or by keyboard, then defended.
Cache present but no plan for cache miss, cold start, or stampede.
hld.no-cache-failure-storyStateful component without replication or failover.
hld.no-replicationCritical component without redundancy.
hld.spofSlow or unreliable work done synchronously instead of via queue.
hld.no-async-boundaryComponent drawn but not connected to data flow.
hld.orphan-componentNo rate limit at gateway or edge for public traffic.
hld.missing-rate-limitMulti-instance service without LB or service discovery.
hld.missing-load-balancer
Deep dives
Problem-specific hard parts. Pick the worst failure modes.
Failure-mode discussion is generic, not specific to this design.
deep-dives.shallow-failure-modeDeep dive lacks back-of-envelope numbers.
deep-dives.no-back-of-envelope
Trade-offs
The failure story per component, and what you gave up to get here.
Did not address what breaks at 10× scale.
tradeoffs.missing-10x-storyDid not discuss cost trade-offs.
tradeoffs.no-cost-discussionDid not enumerate failure modes per component.
tradeoffs.no-failure-mode
Cross-stage
Patterns that span multiple stages of the design discussion.
A specific choice was made without naming the trade-off.
cross-stage.unjustified-choiceDesign choice contradicts a requirement the user stated earlier.
cross-stage.contradicts-requirementsAdded complexity that the requirements do not justify.
cross-stage.over-engineeredStage-4 capacity numbers say a drawn component is overloaded, but the HLD wasn't scaled to match.
cross-stage.capacity-ignored