I get asked this question a lot. I lost track of people I know that spend all their time brushing up on algorithmic puzzles and barely prepare for the system design round. I can’t blame them; it’s easy to find comfort reversing lists, finding shortest paths, and whatnot. The solutions of those problems can be checked for correctness or efficiency. But you can’t automatically check how good your mock designs are. It turns out system design is hard! There is no fail-proof recipe for it, there are no perfect solutions, and it’s all about trade-offs.
If you are a junior engineer, then you might be able to wing the design round and still get an offer.
If you are a senior engineer, then you need to be able to design complex systems and dive deep in any vertical. You can be a world champion in balancing trees, but if you fail the design round, you are out. If you just meet the bar, then don’t be surprised when your offer is well below what you were expecting.
I know what you are thinking. “How the heck am I supposed to get better at nailing design interviews if there is no recipe for it?” The best way to breeze through a system design round is to learn how to design actual real systems. Who would have thought, right? Unlike algorithmic puzzles, it’s not an “interview-only” skill. It requires hard work and experience. But if you approach it the right way, then you will add a powerful tool to your toolbelt. One that will make you stand out from the crowd.
When I say system design, I mean the distributed kind. It used to be that large scale system design questions were only asked by the likes of Amazon, Google, and Microsoft. But that’s no longer true. The reality is that nowadays we are all distributed systems engineers. And we need to understand the implications of building complex systems out of a networked mesh of simpler ones.
So how do you design real-world distributed systems? I recall how hard it was to find the right information when I first started. Some books on distributed systems were too theoretical to build real stuff. Some felt like marketing material for a technology stack that was going to be obsolete in a few years. All I wanted was something pragmatic like a timeless classic. Only whitepapers of real systems satisfied me. But without a solid grasp of the fundamentals, I spent hours trying to connect all the missing dots.
This is why I decided to write a book to teach the fundamentals of large scale distributed systems design. The book contains knowledge I have used over the years to solve concrete problems, the kind that needs to scale to millions of requests per second, and billions of devices. But no matter what scale you are working on today, the core principles are universal.
After reading the book, you are not going to look at network calls the same way. And you will start applying that knowledge from day one at your job and on personal projects. Armed with the core fundamentals, you will have the tools to understand technical whitepapers, build systems of your own, and nail interviews.
Interested? Check out the book’s homepage to find out more about it.