Approach - rFronteddu/general_wiki GitHub Wiki
Typically, system requirements, constraints and bottlenecks should be well understood to shape the direction of both the interviewer and interviewee.
Requirements Clarifications - Clarify Ambiguities
- Design questions are often open-ended and they don't have ONE correct answer.
System Interface Definition
- Establish a contract for the system and gain visibility in how to satisfy the requirements.
Back-of-the-envelope estimation
- Estimate the scale of the system to guide decisions on scaling, partitioning, load-balancing and caching.
- Expected Scale of the system?
- Storage?
- Bandwidth?
Defining Data Model
- Clarify how data will flow among different components of the system and guide partitioning and management (storage, transportation, encryption, etc.) and which database to use.
High-level Design
- Draw a block diagram with 5-6 boxes representing the core components of our system that solve the problem end-to-end.
Detailed Design
- Dig deeper into two or three components, present different approaches, their pros and cons, and explain why we will prefer one approach on the other.
Identify and resolve bottlenecks
- Discuss bottlenecks and possible mitigation approaches:
- Is there any single point of failure?
- Do we have enough replicas of the data?
- Do we have enough copies of services running?
- How are we monitoring performance and system liveness?*