Design review patterns
The shapes Arqly looks for during critique.

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

3 patterns

Ambiguity you would resolve with the interviewer: scope, scale, who uses it, what counts as done.

  • Skipped clarifications
    clarification

    Started designing without asking clarifying questions.

    clarification.skipped
  • No scale question
    clarification

    Did not ask about scale, traffic, or growth before designing.

    clarification.missed-scale
  • Unbounded scope
    clarification

    Did not narrow scope; tried to solve everything.

    clarification.missed-scope

Functional reqs

2 patterns

Bullets, not prose. One capability per line.

  • Vague requirement
    functional

    Functional requirements lack specificity or measurable outcome.

    functional.vague-requirement
  • No prioritization
    functional

    Did not separate must-have from nice-to-have.

    functional.missing-priority

Non-functional

4 patterns

Latency, availability, consistency, durability, security targets.

  • No latency target
    non-functional

    Did not specify p50/p99 latency targets.

    non-functional.missing-latency
  • No availability target
    non-functional

    Did not specify SLO or availability target.

    non-functional.missing-availability
  • No consistency model
    non-functional

    Did not commit to a consistency model.

    non-functional.missing-consistency
  • No durability target
    non-functional

    Did not specify durability or RPO.

    non-functional.missing-durability

Capacity estimation

7 patterns

QPS, storage, bandwidth, growth. Order of magnitude before boxes.

  • Skipped capacity
    capacity

    Did not estimate capacity before drawing components.

    capacity.skipped
  • No write QPS
    capacity

    Did not estimate write QPS, only read.

    capacity.missing-write-qps
  • No read QPS
    capacity

    Did not estimate read QPS.

    capacity.missing-read-qps
  • No storage estimate
    capacity

    Did not estimate storage growth.

    capacity.missing-storage
  • No bandwidth estimate
    capacity

    Did not estimate egress or bandwidth.

    capacity.missing-bandwidth
  • Math error
    capacity

    Estimate is wrong by an order of magnitude.

    capacity.math-error
  • Unjustified assumption
    capacity

    Pulled a number without grounding.

    capacity.unjustified-assumption

API design

5 patterns

Endpoints, request/response shapes, protocols.

  • No pagination
    api

    List endpoint without pagination.

    api.missing-pagination
  • No idempotency
    api

    Mutation endpoint without idempotency key strategy.

    api.missing-idempotency
  • No auth model
    api

    API design did not specify authn/authz.

    api.missing-auth
  • Weak error model
    api

    No error codes, retry semantics, or partial-failure handling.

    api.weak-error-model
  • No rate limiting
    api

    Public endpoint without rate limit.

    api.missing-rate-limit

Data model

4 patterns

Schema, indexes, partition keys, database choice — and why.

  • DB without defense
    data-model

    Picked a database without defending the choice against access patterns.

    data-model.db-without-defense
  • No partition strategy
    data-model

    Did not specify partition or shard key for a sharded store.

    data-model.no-partition-key
  • No index strategy
    data-model

    Did not name secondary indexes for query patterns.

    data-model.missing-index-strategy
  • Wrong DB family
    data-model

    Picked a DB family that does not match the access pattern.

    data-model.wrong-family

Use-case breakdown

0 patterns

Walk one requirement at a time. Answer the hard question each one raises before you draw anything.

We haven't catalogued patterns for use-case breakdown yet.

High-level design

7 patterns

Components, data flow, technologies — placed by drag or by keyboard, then defended.

  • No cache failure story
    hld

    Cache present but no plan for cache miss, cold start, or stampede.

    hld.no-cache-failure-story
  • No replication
    hld

    Stateful component without replication or failover.

    hld.no-replication
  • Single point of failure
    hld

    Critical component without redundancy.

    hld.spof
  • No async boundary
    hld

    Slow or unreliable work done synchronously instead of via queue.

    hld.no-async-boundary
  • Orphan component
    hld

    Component drawn but not connected to data flow.

    hld.orphan-component
  • No rate limit at edge
    hld

    No rate limit at gateway or edge for public traffic.

    hld.missing-rate-limit
  • No load balancer
    hld

    Multi-instance service without LB or service discovery.

    hld.missing-load-balancer

Deep dives

2 patterns

Problem-specific hard parts. Pick the worst failure modes.

  • Shallow failure analysis
    deep-dives

    Failure-mode discussion is generic, not specific to this design.

    deep-dives.shallow-failure-mode
  • No numbers
    deep-dives

    Deep dive lacks back-of-envelope numbers.

    deep-dives.no-back-of-envelope

Trade-offs

3 patterns

The failure story per component, and what you gave up to get here.

  • No 10× story
    tradeoffs

    Did not address what breaks at 10× scale.

    tradeoffs.missing-10x-story
  • No cost discussion
    tradeoffs

    Did not discuss cost trade-offs.

    tradeoffs.no-cost-discussion
  • No failure modes
    tradeoffs

    Did not enumerate failure modes per component.

    tradeoffs.no-failure-mode

Cross-stage

4 patterns

Patterns that span multiple stages of the design discussion.

  • Unjustified choice
    cross-stage

    A specific choice was made without naming the trade-off.

    cross-stage.unjustified-choice
  • Contradicts requirements
    cross-stage

    Design choice contradicts a requirement the user stated earlier.

    cross-stage.contradicts-requirements
  • Over-engineered
    cross-stage

    Added complexity that the requirements do not justify.

    cross-stage.over-engineered
  • Capacity ignored
    cross-stage

    Stage-4 capacity numbers say a drawn component is overloaded, but the HLD wasn't scaled to match.

    cross-stage.capacity-ignored