The systematic approach
Requirements clarifications
System design interview questions, by nature, are vague or abstract. Asking questions about the exact scope of the problem, and clarifying functional requirements early in the interview is essential.Usually, requirements are divided into three parts:
Functional requirements
These are the requirements that the end user specifically demands as basic functionalities that the system should offer. All these functionalities need to be necessarily incorporated into the system as part of the contract.For example:- “What are the features that we need to design for this system?”
- “What are the edge cases we need to consider, if any, in our design?”
Non-functional requirements
These are the quality constraints that the system must satisfy according to the project contract. The priority or extent to which these factors are implemented varies from one project to another. They are also called non-behavioral requirements. For example, portability, maintainability, reliability, scalability, security, etc.For example:- “Each request should be processed with the minimum latency”
- “System should be highly available”
Extended requirements
These are basically “nice to have” requirements that might be out of the scope of the system.For example:- “Our system should record metrics and analytics”
- “Service health and performance monitoring?”
Estimation and constraints
Estimate the scale of the system we’re going to design. It is important to ask questions such as:
- “What is the desired scale that this system will need to handle?”
- “What is the read/write ratio of our system?”
- “How many requests per second?”
- “How much storage will be needed?”
Data model design
Once we have the estimations, we can start with defining the database schema. Doing so in the early stages of the interview would help us to understand the data flow which is the core of every system. In this step, we basically define all the entities and relationships between them.
- “What are the different entities in the system?”
- “What are the relationships between these entities?”
- “How many tables do we need?”
- “Is NoSQL a better choice here?”
API design
Next, we can start designing APIs for the system. These APIs will help us define the expectations from the system explicitly. We don’t have to write any code, just a simple interface defining the API requirements such as parameters, functions, classes, types, entities, etc.For example:
High-level component design
Now we have established our data model and API design, it’s time to identify system components (such as Load Balancers, API Gateway, etc.) that are needed to solve our problem and draft the first design of our system.
- “Is it best to design a monolithic or a microservices architecture?”
- “What type of database should we use?”
Detailed design
Now it’s time to go into detail about the major components of the system we designed. As always discuss with the interviewer which component may need further improvements.Here is a good opportunity to demonstrate your experience in the areas of your expertise. Present different approaches, advantages, and disadvantages. Explain your design decisions, and back them up with examples. This is also a good time to discuss any additional features the system might be able to support, though this is optional.
- “How should we partition our data?”
- “What about load distribution?”
- “Should we use cache?”
- “How will we handle a sudden spike in traffic?”
Try not to be too opinionated about certain technologies. Statements like “I believe that NoSQL databases are just better, SQL databases are not scalable” reflect poorly. Be humble about what you know and what you do not. Use your existing knowledge with examples to navigate this part of the interview.
Identify and resolve bottlenecks
Finally, it’s time to discuss bottlenecks and approaches to mitigate them. Here are some important questions to ask:
- “Do we have enough database replicas?”
- “Is there any single point of failure?”
- “Is database sharding required?”
- “How can we make our system more robust?”
- “How to improve the availability of our cache?”
Key principles to remember
While following the structured approach above, keep these principles in mind:Start broad, then narrow down
Begin with high-level architecture and gradually drill down into specific components. Don’t get lost in implementation details too early.Communicate continuously
Think out loud and explain your reasoning. The interviewer wants to understand your thought process, not just see the final design.Consider trade-offs
For every design decision, discuss the alternatives and explain why you chose one approach over another. There are no perfect solutions, only appropriate ones given the constraints.Be adaptable
If the interviewer steers the conversation in a particular direction, follow their lead. They might be testing your knowledge in specific areas.Use concrete examples
When possible, reference real-world systems or your past experience to illustrate your points. This demonstrates practical knowledge.Remember that the goal is not to arrive at a perfect design, but to demonstrate your ability to think systematically about complex problems, make reasonable trade-offs, and communicate effectively.