Common System Design Interview Mistakes

By Oleksandr Andrushchenko — Published on
0 Likes
0 Dislikes
Common System Design Interview Mistakes
Common System Design Interview Mistakes

System design interviews are rarely failed because a candidate has never heard of caching, load balancing, replication, queues, or database sharding. More often, the problem is how those concepts are applied: designing before understanding requirements, estimating numbers that never influence the architecture, adding distributed components without justification, ignoring failure scenarios, or presenting decisions without explaining their trade-offs.

A strong interview is not about producing the most sophisticated diagram. It is about demonstrating a structured engineering process: understand the problem, quantify the workload, identify the critical paths, build the simplest architecture that satisfies the requirements, and explain how the design behaves as constraints change. Recent interview guidance consistently emphasizes requirements, estimation, bottlenecks, trade-offs, failure modes, and clear communication as the core of a strong system design discussion. :contentReference[oaicite:0]{index=0}

Table of Contents

Designing Before Understanding the Problem

One of the most damaging mistakes is immediately drawing load balancers, databases, caches, and queues after hearing the question.


Interviewer:
"Design a chat application."

Candidate:
"First, there is an API Gateway,
then Kafka, Redis, Cassandra..."

The architecture has started before the actual system has been defined.

"Design a chat application" could describe very different products:

  • one-to-one messaging only;
  • small private groups;
  • groups with hundreds of thousands of members;
  • persistent message history;
  • ephemeral messages;
  • one device per user;
  • multiple synchronized devices;
  • 10,000 concurrent users;
  • 100 million concurrent users.

Each variation changes the architecture.

A better opening is to establish functional requirements:


Functional requirements

- Send direct messages?
- Group conversations?
- Message history?
- Read receipts?
- Attachments?
- Multiple devices?

Then establish non-functional requirements:


Non-functional requirements

- Expected users?
- Peak throughput?
- Latency target?
- Availability target?
- Ordering requirements?
- Durability requirements?

Finally, explicitly define what will not be covered:


In scope:
- direct messages
- small groups
- message history
- multi-device synchronization

Out of scope:
- voice/video
- search
- large public channels

This prevents the interview from expanding into an impossible attempt to design every feature of a mature product.

The broader interview framework is covered in System Design Interviews Explained: What Companies Actually Expect.

Using Capacity Estimates Incorrectly

Capacity estimation is useful only when it changes a design decision. A common mistake is calculating several large numbers and then ignoring them.

For example:


100 million DAU
50 requests/user/day

5 billion requests/day

≈ 58,000 requests/sec average
≈ 230,000 requests/sec peak

Then the candidate draws:


Client
  |
  v
Server
  |
  v
Database

The calculation has not influenced the architecture.

Instead, every important estimate should answer an architectural question.

Estimate Question It Should Influence
Peak requests/sec How much application capacity is required?
Read/write ratio Would caching or read replicas materially help?
Writes/sec Can one database handle the workload?
Storage/year Will partitioning, archival, or object storage be required?
Bandwidth Should large content bypass application servers?
Concurrent connections How many connection servers are required?

Suppose a URL shortener receives:


Writes:   1,000/sec
Reads:  100,000/sec

The 100:1 ratio immediately suggests that optimizing the read path deserves more attention than optimizing URL creation:


Client
  |
  v
Load Balancer
  |
  v
Redirect Service
  |
  v
Cache
 /   \
HIT  MISS
 |     |
 |     v
 |   Database
 +-----+

The estimate has now produced a design decision.

Another common mistake is false precision:


Expected peak:
83,472 requests/sec

Interview estimates are based on assumptions. An order-of-magnitude statement is usually more useful:


Average ≈ 25K/sec
Assume 4× peak
Peak ≈ 100K/sec

The goal is not forecasting exact production traffic. It is determining whether the architecture is dealing with tens, thousands, hundreds of thousands, or millions of operations per second.

For a complete estimation process, see Estimating Scale and Capacity Planning.

Overengineering the Architecture

System design interviews encourage scalable thinking, but scalability does not mean adding every distributed-systems component immediately. Overengineering is repeatedly identified as a common interview mistake because components are often introduced without a constraint that requires them. :contentReference[oaicite:1]{index=1}

Consider a system serving 1,000 requests per second:


                   API Gateway
                        |
              +---------+---------+
              |                   |
          Service A           Service B
              |                   |
            Kafka               Kafka
              |                   |
           Workers             Workers
              |                   |
          Cassandra            Redis
              |
         Elasticsearch

This architecture may be possible, but that is not a justification for building it.

A simpler starting point could be:


             Load Balancer
                  |
             API Servers
                  |
              Database

Then identify actual bottlenecks.

If reads dominate:


             API Servers
                  |
                Cache
                  |
              Database

If slow asynchronous work begins blocking requests:


             API Servers
               /      \
              v        v
         Database     Queue
                       |
                       v
                    Workers

If database write capacity becomes the limiting factor, partitioning can be discussed.

The important progression is:


Requirement
    |
    v
Constraint
    |
    v
Bottleneck
    |
    v
Architecture decision

not:


Technology remembered from another interview
                  |
                  v
            Add it somewhere

Choosing Technologies Before Identifying Problems

A related mistake is answering architecture questions primarily with product names.


"We'll use Redis."

"We'll use Kafka."

"We'll use Cassandra."

"We'll deploy Kubernetes."

None of these statements explains the architecture.

A stronger explanation begins with the required property:


"The workload is approximately 100:1 reads to writes,
and the same small set of objects receives most traffic.

A distributed cache can remove those hot reads from
the database."

Only then does a concrete technology become useful:


"Redis would be one reasonable implementation."

The distinction matters because technologies are interchangeable only within limits. What interviewers need to evaluate is whether the candidate understands the underlying requirement.

Instead of:


Kafka because high scale.

explain:


The API should not wait for image processing.

A durable queue decouples ingestion from processing,
absorbs bursts, and allows workers to scale separately.

Kafka could implement that log if replay and
high-throughput event consumption are required.

This reasoning also makes it easier to adapt when the interviewer changes a requirement.

Ignoring Trade-Offs and Consistency

There is rarely one universally correct system design decision. Interviewers therefore care about the reasoning behind a choice rather than only the component selected. Trade-off discussion is consistently highlighted as a major evaluation signal in current interview guidance. :contentReference[oaicite:2]{index=2}

A weak answer says:


"We'll cache the data."

A stronger answer says:


"We'll cache these reads because they dominate traffic.

This reduces database load and latency, but cached
values can become stale.

For this feature, several seconds of staleness is
acceptable, so eventual consistency is a reasonable
trade-off."

That explanation covers:

  • why the component exists;
  • what benefit it provides;
  • what cost it introduces;
  • why the cost is acceptable.

Treating Every Operation as Equally Consistent

Different operations within the same system can require different consistency guarantees.

Consider a social application:

Operation Possible Requirement
Account balance Strong consistency
Username uniqueness Strong coordination during assignment
Like count Eventual consistency may be acceptable
Analytics dashboard Delayed aggregation may be acceptable
Recommendation updates Eventual consistency often acceptable

Saying "the system needs strong consistency" is often too broad. A better design identifies the consistency requirement of each critical operation.

A Simple Trade-Off Pattern

For every major architecture decision, use this mental model:


Decision
   |
   +--> Why?
   |
   +--> Benefit?
   |
   +--> Cost?
   |
   +--> Alternative?
   |
   +--> Why is this trade-off acceptable?

For example:


Decision:
Use asynchronous processing for notifications.

Why:
External providers are slow and unreliable.

Benefit:
API latency and availability are isolated from providers.

Cost:
Notification delivery becomes eventually consistent.

Alternative:
Call providers synchronously.

Why acceptable:
The API only needs to guarantee that the notification
was accepted, not delivered before returning.

This style demonstrates engineering judgment rather than architecture memorization.

Designing Only the Happy Path

A diagram where every component works perfectly is incomplete. Reliability and failure scenarios are another area frequently called out in system design interview guidance. :contentReference[oaicite:3]{index=3}

Suppose the architecture is:


Client
  |
  v
API
  |
  v
Cache
  |
  v
Database

The next questions should include:

  • What happens when the API instance crashes?
  • What happens when the cache becomes unavailable?
  • What happens when the database primary fails?
  • What happens during a network partition?
  • What happens when traffic suddenly increases 10×?

Cache failure is a good example because a component designed to improve performance can become a reliability problem.

Normal operation:


100K reads/sec

95K --> Cache
 5K --> Database

After cache failure:


100K reads/sec
       |
       v
    Database

The database suddenly receives 20 times its normal read traffic.

The design discussion should therefore include degraded behavior:


Cache unavailable
      |
      v
Limit fallback concurrency
      |
      +--> database reads
      |
      +--> reject/load shed excess traffic

This shows awareness that failure recovery itself can generate overload.

Ignoring Queue Backlogs

Adding a queue does not automatically solve overload.

Suppose:


Incoming:
20,000 events/sec

Worker capacity:
15,000 events/sec

The backlog grows by:


5,000 events/sec

= 300,000/minute
= 18 million/hour

After an hour, increasing worker capacity to exactly 20,000/sec still does not clear the backlog.

Recovery requires:


processing capacity
>
new incoming traffic

This is why queue depth, oldest-message age, consumer lag, retry rates, and recovery capacity matter in production designs.

Poor Communication and Time Management

A technically strong architecture can still produce a weak interview if the reasoning is difficult to follow. Current interview frameworks consistently describe system design as a structured technical conversation rather than a memorized presentation. :contentReference[oaicite:4]{index=4}

A common failure pattern is spending too much time on one early detail:


0-5 min     Requirements

5-30 min    Database schema

30-35 min   Architecture

35-45 min   Interview ends

Important topics never appear:

  • critical request flow;
  • scaling;
  • caching;
  • partitioning;
  • failures;
  • trade-offs.

A better approximate allocation for a 45-minute discussion is:


Requirements       5 min
Estimation         5 min
High-level design 10 min
Deep dives        15 min
Failures/tradeoffs 7 min
Wrap-up            3 min

This is a guide rather than a rigid schedule. The interviewer may deliberately redirect the discussion toward one component.

Narrating Decisions

Do not silently draw:


Client --> CDN --> LB --> API --> Redis --> DB

Explain why the architecture evolves:


"The workload is read-heavy, so I want to remove
repeated reads from the database.

I'll introduce a cache here.

If the cache misses, the API reads from the database
and populates the cache.

The trade-off is stale data, which is acceptable for
this endpoint for up to 30 seconds."

Every box now has a reason to exist.

A Better Interview Approach

Instead of memorizing a different diagram for every possible interview question, use a repeatable decision process.


             Interview Question
                    |
                    v
             Clarify Scope
                    |
                    v
          Functional Requirements
                    |
                    v
        Non-Functional Requirements
                    |
                    v
             Estimate Scale
                    |
                    v
          Identify Critical Paths
                    |
                    v
        Build Simple Architecture
                    |
                    v
           Trace Data Flows
                    |
                    v
        Identify Bottlenecks
                    |
                    v
        Add Scaling Mechanisms
                    |
                    v
        Analyze Failure Modes
                    |
                    v
          Discuss Trade-Offs

Consider the prompt:


"Design a file storage service."

Step 1: Clarify the product.


Need:
- uploads
- downloads
- folders
- sharing
- file versions

Not covering:
- collaborative document editing
- full-text search

Step 2: Estimate scale.


40M uploads/day
Average size: 5 MB

≈ 200 TB new content/day

This estimate immediately suggests that application servers should not store files locally.

Step 3: Identify the critical paths.


Upload:
Client --> authorization --> object storage

Download:
Client --> authorization --> CDN/object storage

Step 4: Build the simplest architecture supporting those paths.


                     File Service
                    /            \
                   v              v
             Metadata DB      Object Storage

Step 5: Improve the expensive data path.


Client --> File Service --> signed URL

Client ====================> Object Storage
              file bytes

Step 6: Discuss failures.


What if:

- upload stops halfway?
- metadata commit fails?
- object exists but metadata does not?
- client retries completion?
- processing worker crashes?

Step 7: Discuss trade-offs.


Multipart uploads
+ resumability
+ parallel transfer
- more client complexity
- temporary parts need cleanup

CDN
+ lower latency
+ lower origin bandwidth
- cache invalidation complexity
- additional cost

Immutable versions
+ easy rollback
+ safer caching
- additional storage

This progression demonstrates substantially more system design ability than immediately drawing a sophisticated architecture.

Ready-to-Use Interview Framework

A compact framework can be applied to almost any problem:


1. REQUIREMENTS
   What must the system do?

2. SCALE
   How much traffic/data/concurrency?

3. DATA
   What is stored and how is it accessed?

4. CRITICAL PATH
   What request or workflow matters most?

5. HIGH-LEVEL DESIGN
   What is the simplest architecture that works?

6. BOTTLENECKS
   What fails or saturates first?

7. SCALE
   What component should be scaled or partitioned?

8. RELIABILITY
   What happens when dependencies fail?

9. TRADE-OFFS
   What does each important decision cost?

10. WRAP-UP
    What would be improved next?

The important part is not memorizing the labels. It is maintaining a progression from requirements → constraints → architecture → failure analysis → trade-offs.

Interview Checklist

  • Clarify requirements before drawing: establish the product being designed.
  • Define non-goals: avoid accidentally designing an entire mature platform.
  • Estimate meaningful quantities: throughput, storage, bandwidth, and concurrency should influence decisions.
  • Start simple: introduce distributed components only when requirements justify them.
  • Design around access patterns: understand how data is actually read and written.
  • Trace critical flows: explain what happens from request arrival to completion.
  • Identify bottlenecks: explain what reaches capacity first.
  • Explain every major component: avoid architecture built from unexplained technology names.
  • State consistency requirements: different operations can require different guarantees.
  • Discuss trade-offs: explain benefits, costs, alternatives, and why the choice is acceptable.
  • Design for failures: consider cache, database, queue, worker, network, and region failures where relevant.
  • Consider overload: explain rate limiting, backpressure, load shedding, or degraded operation.
  • Keep the discussion structured: do not spend most of the interview on one minor component.
  • Adapt to interviewer direction: go deeper where the discussion reveals uncertainty or interesting constraints.
  • Finish with limitations: identify what would need attention as traffic or requirements evolve.

Conclusion

Most system design interview mistakes come from weak reasoning structure rather than missing technology knowledge. Designing before clarifying requirements, estimating scale without using the results, overengineering, selecting technologies before identifying bottlenecks, ignoring trade-offs, and designing only the happy path all hide the engineering judgment the interview is intended to evaluate.

A stronger approach starts with the problem and allows the architecture to emerge from its constraints. Each important component should solve an identifiable problem, each estimate should influence a decision, and each major decision should have an explicit trade-off.

Key Takeaway

Do not try to impress an interviewer with the number of boxes in the architecture. Clarify the problem, quantify the workload, identify the critical path, start with the simplest viable design, add complexity only when a concrete bottleneck requires it, explain failure behavior, and make the reasoning behind every important trade-off visible.

Comments (0)