System Design 101: Getting Started

Vikas Tomar
4 min readMar 9, 2020

--

Photo by Jamie Street on Unsplash

Hey Everyone!
After ignoring this topic for long and finally getting rejected because of this, I’ve decided to go through the various popular concepts of system design from the perspective of a job interview. I’m a final year Computer Science undergrad and have given few interviews to know that having a knowledge of System Design gives you an upper hand in job interviews.

Now the problem with learning to design a system from an interview perspective is that it’s difficult to find everything at one place in a consolidated manner. I tried looking for them on Medium but didn’t find them. So I’ve decided to write this series of articles on System Design so that everything can be found in one place if anyone, eps. a fresher, in future, would like to refer it. I’ll try to post 1 article on a new topic as I’ll go on learning them. We can have a discussion on it in the comment section if you want to.

Disclaimer: This article is completely based on my understanding of the subject from the various resources that I read from. I cannot guarantee that it is always going to be right.

What are System Design Interviews?

In any typical system design interview, the candidate is required to show their ability to develop a high-level architecture of a large system. What high-level architecture mean is that you have to outline the main components of the system and how things are going to flow among them while keeping in mind the various problems that you might face and how will you solve them. Problems may include consistency, load balancing, traffic, availability etc. We’ll cover these topics in detail in further articles.
These interviews usually last for 30–40mins and you have to answer open-ended questions like, “How to design a cloud storage system like Dropbox” or “Design a URL Shortner” etc.
Unlike the coding interviews where problem-solving abilities of the candidate is evaluated, design interviews consist of complicated and fuzzy questions which aim at testing the candidate’s ability to analyze a vague and complicated problem with building large scale systems and how do they present their solution. Such interviews will also access one on their competence in guiding and moving the conversation forward.

How to give a System Design Interview?

To be honest there isn’t any specific or defined way to solve these system design problem and that is what makes them interesting. Along with this, there are so many things which are left unclear in the question itself so that interviewer could see what all things will you take into consideration while designing a system. And hence, you need to clarify at least a few of them in the beginning so that you could get started with your solution. Any candidate who does not realize this ends up falling into the trap of jumping onto finding solutions.

Spend a few minutes questioning the interviewer to comprehend the full scope of the solution. Never assume things. For example, in the “URL Shortner”, it could be serving just a few thousand users, but each could be sharing millions or URLs. It could also mean to handle millions of requests to shorten the URL. Both are a different problem, the first one involves managing the huge database and making the querying efficient and consistent, while the later one wants you to manage the traffic.
All in all, you need to scale the breadth and depth of the problem statement before jumping onto the solution.

Lead the conversation: It’s not the ultimate solution to the problem, rather the discussion process itself that is important, in the interview. And it is the candidate who should lead the conversation going. If you’re most of the time the interviewer will try to give you hint by questioning you, answer to which might form your further approach to the problem. Hence, take the interviewer along with you during the course of solving the problem by communicating with him/her step by step as you move along.

Solving by breaking down: Design question at first might look complex and intimidating. But whatever the complexity level of the problem, a top-down and modularization approach can help a lot in solving the problem. Therefore, breaking down the problem into smaller subproblem is the best approach to go by. This also makes the design much clearer.

Dealing with bottlenecks: Bottleneck is a situation when the performance of the system is limited by a single component. You got to use the fundamentals of System design over here to overcome these situations. If you feel stuck somewhere, you can ask for a hint so that you may keep going. Keep in mind that each solution is a kind of trade-off; hence, changing something may worsen something else.

Summary

Solving system design questions could be broken down into three steps:
1. Scoping the problem: Don’t make assumptions: ask clarifying questions to understand the constraints and use cases.

2. Sketching up an abstract design: Illustrating the building blocks of the system and the relationships between them.

3. Identifying and addressing the bottlenecks by using the fundamental principles of scalable system design.

Feel free to drop suggestions in the comment section. I’d really appreciate if you can share resources.
Have a nice day.

--

--

Vikas Tomar

Enthusiastic Android Developer | An UI/UX Design Dilettante |Data Science Beginner