Once you have articulated the high-level design, it's time to discuss the core components of your system. This allows you to showcase your technical knowledge and demonstrate your ability to break down complex systems into manageable, comprehensible parts. This section will vary significantly from interview to interview, depending on the system you are designing. Here are some high-level guidelines to help you think through this phase of the interview:
Identifying Core Components
Core components are essentially the fundamental building blocks of your system. Identifying them involves a deep understanding of the system's functional requirements and the high-level design. These components can be entities like databases, caching systems, clients, servers, interfaces, or algorithms, depending on the system you are designing.
For a blogging site like Twitter, for instance, the core components could include the timeline generation service and the search component. Isolate the core, novel components of your design. These are the ones you'll spend the most time detailing.
At this point in the interview, it's important to check in with your interviewer to give them a chance to guide you and discuss the components that interest them the most. For example, you could say, "I'd love to go into detail about the fanout service, but before I do, is there another part of the system that you would prefer I spend some time explaining?"
Discussing Core Components
Once you've identified the core components, it's time to discuss them in detail. Here's how you might approach this:
- Detail Each Component: Describe each core component in detail, explaining its role, behavior, and how it contributes to the overall functionality of the system.
- Define Interactions: Clarify how each component interacts with others in the system. Defining these interactions gives a clear picture of the system's data flow and can also highlight potential areas of concern such as bottlenecks or single points of failure.
- Talk about Technology Choices: Discuss any technology or framework choices you've made for each component, explaining why these choices are a good fit for your system design. The higher your seniority, the more you are expected to have the ability to discuss specific technologies. For instance, you should be capable of justifying your preference for Cassandra over DynamoDB, rather than simply opting for NoSQL in general.