What the interview is really measuring
There is no single correct answer to design a chat app; the problem is deliberately open-ended. What the interviewer is gathering is evidence about how you would behave as a colleague on a real design: whether you ask good questions before committing, whether you can reason about trade-offs, whether you communicate clearly, and whether you take feedback well. Technical depth matters, but it is weighed alongside these collaborative signals.
Interviewers also watch for red flags. Over-engineering (adding Kafka, Kubernetes and five databases to a problem that needs one) suggests poor judgment about cost. Narrow-mindedness and stubbornness suggest you would be hard to work with. Silence suggests the interviewer cannot evaluate you at all.
- Ability to turn ambiguity into concrete requirements.
- Sound trade-off reasoning, not buzzword collection.
- Clear communication and responsiveness to hints.
- Depth in at least one or two components.
Step 1: Understand the problem and establish scope
Resist the urge to start drawing. Spend the first few minutes asking questions that narrow the problem: which features matter most, how many users, how fast traffic is expected to grow, what the read/write mix looks like, which platforms are supported, and what existing infrastructure you can lean on. Write down the answers as functional and non-functional requirements, and if the interviewer says to assume something, record the assumption.
This step is where junior candidates lose the most points. Jumping into a solution without clarifying is like coding before reading the spec; you may solve the wrong problem beautifully. A quick back-of-the-envelope estimate belongs here too, because scale determines whether simple or distributed solutions are appropriate.
- What specific features are we building?
- How many users, and what is the expected growth?
- What are latency, availability and consistency expectations?
- What is out of scope?
Step 2: Propose a high-level design and get buy-in
Sketch a blueprint with the main boxes: clients, APIs, web servers, data stores, cache, CDN, queues. Define the core API endpoints and, if relevant, the data model. Walk through one or two concrete use cases end to end over the diagram, because tracing a request reveals missing components and edge cases early.
Treat the interviewer as a teammate and explicitly ask for feedback: does this match what you had in mind, is there an area you would like to go deeper on? Getting buy-in here prevents spending twenty minutes deep-diving into a component the interviewer does not care about. Do capacity estimates if they shape the diagram, but confirm first that the interviewer wants them.
Step 3: Design deep dive
By now you and the interviewer agree on the overall shape and goals. The deep dive is where you demonstrate depth, and the right topic depends on the problem and the interviewer's signals. For a URL shortener it might be the hash function and collision handling; for a chat system, how to keep connections and deliver messages with low latency and track presence; for a news feed, fan-out strategy and the celebrity problem.
Prioritize. Pick the components that are hardest, most interesting or most likely to break at scale, and explain the trade-offs among a few options before choosing. Avoid sinking time into details that add little signal, like the exact algorithm a library uses internally, unless asked. Time management is part of the assessment.
Step 4: Wrap up
Use the final minutes to step back. Identify bottlenecks and how you would address them; no design is perfect, and claiming yours is invites skepticism. Give a short recap of the design, especially if several options were discussed, so the interviewer leaves with a clear picture.
Good wrap-up topics include error cases (server failure, network partition, data loss), operational concerns (monitoring, metrics, alerts, rollouts), and the next scaling step: what changes at 10x the current load. Each shows that you think about systems over their lifetime, not just their first deployment.
Time budget for a 45-minute session
A typical interview gives about 45 minutes of design time after introductions. A rough budget keeps you from running out of time halfway through the deep dive. Spend 3 to 10 minutes on scope, 10 to 15 on the high-level design, 10 to 25 on the deep dive, and 3 to 5 on wrap-up. The ranges flex based on the problem; a familiar problem may need less scoping and more depth.
Glance at the clock at transitions. If 25 minutes have passed and you have no complete high-level design, simplify and finish it, because an end-to-end sketch with shallow depth scores better than a beautiful single component with no surrounding system.
Dos and don'ts
The habits below sound obvious, but under pressure most candidates violate at least one. The common thread is to think out loud and keep the interviewer involved; the conversation itself is the work product.
- Do ask for clarification rather than assuming your interpretation is correct.
- Do state requirements and assumptions explicitly and revisit them when they change.
- Do suggest multiple approaches and compare them before committing.
- Do design the most critical components first, after agreeing on the blueprint.
- Do bounce ideas off the interviewer and welcome hints.
- Don't arrive unprepared for common problems like feeds, chat and rate limiters.
- Don't go deep into one component before the high-level design exists.
- Don't stay silent when stuck; say what you are weighing and ask for a nudge.
- Don't consider yourself done until the interviewer says so; volunteer improvements.
Key numbers
Key terms
- Functional requirements
- The features the system must provide, such as posting or searching.
- Non-functional requirements
- Quality targets like latency, availability, consistency and scale.
- Buy-in
- Explicit agreement from the interviewer on the high-level design before diving deeper.
- Deep dive
- Focused, detailed design of the most critical or interesting components.
- Bottleneck
- The component that limits throughput or latency first as load grows.
- Over-engineering
- Adding complexity or components that the stated requirements do not justify.
Common mistakes
- Drawing boxes in the first minute without asking a single clarifying question.
- Spending half the interview on one component and never finishing the end-to-end design.
- Listing technologies by name without explaining why each one is needed.
- Defending a choice stubbornly after the interviewer points out a flaw.
- Going silent while thinking, leaving the interviewer nothing to evaluate.
- Claiming the design has no bottlenecks or failure modes.
Further study
- Designing Data-Intensive Applications (Martin Kleppmann)
- The System Design Primer (GitHub repository)
- Google SRE book