In 2022, I started to prepare for my first rounds of the system design interview for mid-level software engineering roles. This was during a time of massive hiring slowdowns and hiring freezes within the tech industry.
I had some prior experience with coding interview preparation (as an intern and entry-level software engineer) which eventually allowed me to obtain my prior job as a software engineer at Google, and I’m sure some people are wondering how preparing for coding interviews compares to preparing for system design interviews.
So, how is preparing for system design interviews vs. coding interviews? Are system design interviews harder to prepare for than coding interviews?
Assuming that you know how to code, the system design interview can arguably be considered harder to prepare for compared to coding interviews because of the breadth and depth of knowledge that’s required to build complete systems. The solution space for system design interviews is orders of magnitudes larger than coding interviews.
Why Are System Design Interviews Harder Than Coding Interviews?
As I mentioned before, the system design interview requires you to understand a large amount of breadth and depth of knowledge related to creating distributed systems. This includes understanding low-level computer details like bandwidth, memory, data read-write speeds, and computational limitations.
The knowledge required to excel at system design interviews also includes knowledge of different databases, messaging protocols, caching mechanisms, optimal storage use, consensus algorithms, distributed system resiliency, low-latency design, and more.
Coding interviews will typically have two or three main approaches for an optimal solution. In a coding interview, you’ll know when you’ve reached an optimal solution when the big-O of your program is as fast as possible and your program is provably correct.
Of course, soft skills like communication and collaboration are also evaluated during coding interviews, but coding interviews primarily cover programming, data structures, and algorithms. While these topics are tedious and time-consuming to review (especially if it’s your first coding interview preparation loop), it’s doable for the vast majority of software engineers who know how to code.
In the case of system design interviews, there isn’t a single correct design. There are good solutions and bad solutions. It’s important that you’re communicating with your interviewer to understand the requirements of your system to come to one of the best possible solutions possible.
The time it’ll take a typical software engineer to truly understand how to design systems at scale will typically take longer than a coding interview because the engineer will likely need to have real-world software engineering experience on large systems. Optimal solutions within system design interviews are subjective compared to concrete coding interviews (most of the time anyway).
Is System Design More Important Than Coding?
The way I like to describe system design compared to coding is through analogy. System design is about macro decisions whereas coding is about micro decisions.
So what does that say about system design compared to coding? Is system design more important than coding?
System design isn’t any more important than coding. Both system design and coding are equally as important in designing and implementing distributed systems at scale. Bad code will inhibit a well-designed system, and a poorly designed system will be limited by poorly performing code.
That said, the more senior a software engineer is, the more they are expected to be involved with system design than the actual code-related implementation details. Essentially, system design choices will typically have a greater impact because of the level of abstraction it is compared to the implementation details of code.
Do System Design Interviews Require Coding?
When I was studying for my system design interviews, I found out that there were two types of system design interviews. There are high-level design (HLD) and low-level design (LLD) system design interviews.
When people mention system design interviews, they’re typically referring to HLD interviews.
In high-level-design system design interviews that are given to more senior engineers, you typically aren’t expected to code anything. In low-level-design system design interviews that are given to more junior engineers, you’ll typically be expected to code a solution to a problem using classes and methods.
System design interviews (as in HLD) tend to cover topics on a broad level that coding shouldn’t come up. If you’re mentioning anything code-related within a system design interview, you’re probably too far into the implementation details.
Talking about algorithms is probably as far as you need to go when you talk about code. For instance, there are algorithms for routing requests to servers like round-robin and consistent hashing. These algorithms would be worth mentioning at a high level, but you’re not going to be expected to actually implement them (unless it was a low-level design interview).
If you are studying for LLD interviews, I recommend preparing for them the same way you prepare for LeetCode-style algorithm questions. While the LLD interview questions will be a lot more open-ended than LeetCode-style questions, you’ll still be expected to have a strong understanding and working use of a programming language and its associated common data structures.
I’ve been asked LLD interviews for internship positions and new-graduate positions, and I don’t think any of the LLD interview questions have been outside of what I thought would’ve been reasonable. I found it helpful to think to take extra time in LLD interviews (compared to standard LeetCode coding interviews) to think about the problem I was presented with before diving into a solution.
Why Coding Interviews Could Be Harder Than System Design?
I think that it’s important to mention that there could be a case for coding interviews being harder to prepare for than system design interviews. While personally I still lean on the side that system design is harder, I can make the case that coding interviews are harder to prepare for.
Coding interviews could be considered harder to prepare for than system design interviews because of the types of problems asked which aren’t practical or similar to what a real software engineer would see during their workday. System design interviews more accurately align with the problems that a software engineer will be solving in their day-to-day job.
Also, as I mentioned before, as a software engineer progresses the software engineering career ladder they might not code anymore. They might be taking on higher-level responsibilities like participating in design reviews of different systems within a company to have more impact compared to just coding.
If a higher-level software engineer doesn’t code on the job, then it could be difficult for them to re-ramp up to interview-level coding proficiency.