I recently finished reading Understanding Distributed Systems by Roberto Vitillo. I was quite impressed by the quality of the book. It is one of the best computer science books I’ve read so far. A handful of others classify as such in my eyes.
But what makes this book so good, especially compared to other books in this genre – System Design?
Learning from first principles
If you google System Design, you’ll get a plethora or resources on the subject – videos, books, online courses, etc. It definitely feels like there’s a saturation of resources on the topic, given its importance for big tech interviews.
Although you can find lots of resources, most of them follow a similar pattern. Giving you the quick route of memorising how to implement particular types of distributed systems:
- How to design Facebook News Feed
- How to design Uber
- How to design Zoom
This does look appealing for preparing for your system design interview. But from my experience, it can only get you so far.
Regardless of how well you memorise the “Design Instagram” problem, a good interviewer will always manage to sniff out your shallow understanding of the matter.
In order to go beyond an average performance, you’ll need to also:
- Gain practical experience working with common distributed system tools
- Understanding first principles
I’m yet to see a resource which effectively covers the first problem. You can only rely on practical experience from your job here.
For the latter, this book will give you a thorough understanding of the principles behind the tools we use every day – caches, message queues, databases, etc and also the concepts which are often mentioned, but rarely explained thoroughly – high availability, fault tolerance, latency, etc.
In fact, I think that if you want to start studying system design, you should start from “Understanding Distributed Systems”. Once you go through it, you’ll be able to much more easily pick up other courses/books which are widely available and you’ll also understand them much more clearly.
Ease of reading
When I say that a book teaches from “first principles”, you might assume that the book is filled with mathy jargon, deep dives into theoretical waters, proofs, etc.
Although you’ll find a bit of that, I’d say the author has kept it quite approachable to anyone, regardless of their background.
Actually, although the book ambitiously tackles concepts, which others tactically skip due to their complexity, I think you’ll find that it’s easier to read than most literature in this space.
Recently, I was leading an advanced backend bootcamp, where students had to deal with building a distributed system although they didn’t even know what a REST API is before starting the course.
To help them better understand the topics taught in class, I assigned them some of the chapters in the book as supplemental reading.
By the end of the course, students were able to reason about write-through vs. write-back caching, at-least-once vs. at-most-once message delivery guarantees, among other subjects they learnt.
Hence, despite its ambitious scope, the book remains quite approachable even to people with very little experience in programming, not to mention distributed systems.
The book does a great job of teaching you the first principles behind building distributed systems. But it doesn’t attempt to widen its scope beyond this singular goal.
Therefore, although I think this is one of the best books about system design, it doesn’t aim to be a batteries-included alternative to other literature in the space. It aims to be a very effective supplement instead.
In fact, in the final pages, it actively praises & recommends books about system design by other authors where you ought to continue your studies, namely:
- Designing Data-Intensive Applications by Martin Kleppmann
- System Design Interview vol. 1 & 2 by Alex Xu and Sahn Lam
The former will teach you the very deep details of system design concepts. The latter will give you the knowledge about how to apply what you’ve learnt for building actual distributed systems.
Regardless of that trio’s synergy, there is still some vacuum waiting to be filled in the system design learning materials.
I’m yet to see a course (or book) which attempts to give you any practical experience using the tools & techniques all other books cover.
A course on putting everything learnt into practice by actually building a distributed system which is highly available & fault tolerant. Currently, the only way to gain that is by working on a project with sufficient scale and learn on the job.
Hopefully, we’ll see someone bridge that gap some day.
Understanding Distributed Systems is great for learning the first principles behind building scalable distributed systems. It’s appropriate for most backend engineers, regardless of their experience level.
If you’re looking for a quick summary or reference to its contents, you can check out my booknotes. I still recommend purchasing the book and using the notes as supplement or reference while reading it.
Follow me on twitter for more book reviews & thoughts on system design and backend engineering.