I begin by saying that there is no single answer to this question. But what I learnt from experiences of me and my friends is there are three basic areas you need to be good at.
- Clarifications – Asking for clarifications on the problem till the time you are pretty clear what the problem really is!
- Solid Background – Solid background really helps. Solid background comes into action when you get some answer based on your experience. If you have some experience in development, it might be the case that you may have got similar kind of requirement to build.
- Preparation – Most important. “How prepared are you?”. I am not saying that without preparation, you will not be able to crack it. It is just that “Preparation” acts like a catalyst.
Step 1: Clarification Questions
Such interviews are to give you a chance to demonstrate your real world knowledge. There is no right or wrong answer to the problems.
A good system design question always sounds very ambiguous, and the reason for that is it’s supposed to give you a chance to demonstrate the following:
- How you would think about the problem space
- How you think about bottlenecks
- What you can do to remove these bottlenecks.
Asking good clarification questions helps a lot in such interviews. Clarifications may be one of the several things:
- What is the scope of our application?
- What do you expect of the user behavior? Do you want me to make some assumptions?
- I am lost, can you help me with some direction to proceed?
- I think there will be a bottleneck in my solution? Should I
explainyou that, so that I may get a nod from you to go further?
You should always ask for clarifications to the problem. You are never being judged on whether you asked a particular question or not during the interview, but you are definitely being judged on how you think about the problem?
Use your background to your advantage
Your experience and background can vary widely from other candidates. You have a lot of things unique in you – set of values and expertise. That is what makes you valuable and irreplaceable. Regardless of what field you’re in, people care about what you can bring to the table.
Step 2: System interface definition
You should define what APIs are expected. This will help you establish the exact requirement of the software and also ensure that wen haven’t got anything wrong.
Step 3: Estimation
We should always estimate the scale of the system that we are designing. This will help us in focusing on scaling, load balancing and caching.
- What scale is expected from the system
- How much storage will we need?
- What network bandwidth usage are we expecting?
Step 4: Define Data model and make high level design
Defining the data model early will clarify how data will flow among different components of the system.
Draw a block diagram with 5-6 boxes representing the core components of our system. We should identify enough components that are needed to solve the actual problem from end-to-end.
Step 5: Detailed Design
Once we get our high level design, we can move on to detailed design of the components one by one.
I will be writing more blogs about specific problems and their solution along with the process of thinking and getting to the answer.