Learn which thought processes and actions to take during the interview process, while minimizing errors
What stands between you and your dream job — especially if your dream is to work at one of the big 4 — is the long — and tiring — interview process. Designing large-scale distributed systems has become standard in software engineering interviews, primarily for senior roles, which means that once you pass the phone screening, and the coding interview, you’re going to have to endure — and pass, the ever-feared system design interview (SDI).
Unlike coding problems, the unstructured nature of system design interviews makes them harder to prepare for. Even programmers who have some experience building large systems aren’t comfortable with these interviews, primarily because of the open-ended nature of design problems that don’t have a standard answer.
Not sure how to design a large scale distributed system during a face-to-face interview? Fear not. Here’s everything you need to know about acing SDIs seamlessly and effortlessly. Or, at least that’s what you’ll feel.
Think you know what a system design interview is — think again
While system design questions have become a standard part of the software engineering interview process, a SDI extends beyond the scope of testing traditional coding, technical and analytical skills. The principal aim of a systems design interview is to give the candidate an opportunity to demonstrate their knowledge and see how they work in dynamic, unpredictable situations and face somewhat tricky questions. You will not be presented with a coding question that can be run or compiled. You will often be asked open questions involving designing a new, large-scale distributed system, such as YouTube, another social platform, a URL shortening service or the like, capable of solving an open-ended problem, similar to the type of planning and structuring you will be expected to do if you are brought on as a software engineer.
What interviewers are looking for during a SDI
During the SDI process, it is critical that lines of communication remain open at all times. This is because interviewers are looking to see how your handle dynamic, open-ended engineering situations, as they unfold. As such, performance in these interviews is assessed according to the following main factors:
- Your knowledge — learned and practical
- Your ability to convey your thoughts — lead the conversation and discuss high-level components, details, design pros and cons, and other relevant information with the interviewer. More on thought processes later.
- Your operational efficiency — do you work according to best practice steps, such as:
A. Requirement gathering: Clarify ambiguities and determine system end-goals to assess the exact scope of the problem or task at hand.
B. System interface definition: Identify and define any expected system APIs.
C. System scale estimation: Ensure you know the scope of your system.
D. Data model definition: to clarify how data will flow between different system components and enable better data partitioning and management.
E. High-level design: Identify the components needed to solve the SDI problem from end-to-end, first, on a basic level, then on a deeper level.
F. Identification and resolution of bottlenecks: to determine how to mitigate their effects best.
- Your ability to iterate and improve — once you’ve designed the system, how will you continuously work to make it better?
Your interviewer may also be looking to see if you possess the following skills and abilities: abstraction, databasing, networking, concurrency, estimation, availability, and reliability.
Most commonly asked questions during a SDI
Now that you know what your interviewer will be looking for, you can better prepare your answers to some of the most commonly asked SDI questions:
- Given a (typically) long URL, how would you design a TinyURL or bit.ly (a URL shortening service), the unique ID for a shortened form of the same web address?
- Design a social network, such as Facebook, Quora or Reddit, on which users can view and post messages, comments, and links.
- Design a global chat service, such as WhatsApp or Messenger, that is both user-friendly and secure.
- Design a global video streaming service, like YouTube, including essential features, such as data recording and social commenting.
- Design a global file storage and sharing service, optimized for simultaneous use by multiple users.
- Design a search engine or related services such as a web crawler or type ahead.
How to employ critical thinking during a SDI
As mentioned above, the interviewer is just as interested in the thought processes you employ and how you articulate yourself, as he is in your final system design result. In fact, your thought processes are the interview’s main area of focus. This means you will need to work out loud and in plain sight, asking critical and clarifying questions that will guide you towards structuring the most efficient system, sketching diagrams on the board, and brainstorming with your interviewer if only to show him how your brain ticks. Keep your own notes, but make sure you share important contents. And be sure you understand both the questions you ask AND the answers you receive. Otherwise, you might wind up designing a system that drastically differs from the one you envision.
Practice makes perfect
Honestly, system design interviews are not the easiest to prepare for on your own; as design interviews are highly dynamic and similar to actual design sessions, there’s no standard answer for any given scenario. It helps to brainstorm, communicate and work through potential scenarios with a peer, preferably an experienced engineer, just like you would during an actual interview. In other words, hold a mock interview and practice, practice, practice.
There are many resources out there where you can find system design questions, but it can’t be a replacement to an actual brainstorming session, that requires you to articulate your thought process out loud. You may want to check Pramp, a peer-to-peer mock interview platform.
Using Pramp to practice your system design interview skills is a great way prep for actual SDIs and future design sessions. Mock interviews, and specifically unstructured interview types such as system design, can help you hone your skills and acquire new ones (for interviewing purposes), so you can ace your next SDI like a pro.