System Design Interviews
At the system design interview, you are usually given a very vague design problem like "Design Twitter", and you need to share your approach in about 45 minutes. The purpose of these interviews is to test your experience working with real software systems, and how much you know about these systems in general.
You usually don't code much during these rounds, but simply show your design and considerations on the whiteboard, and discuss your approach with the interviewer.
System design rounds are more common for senior and more experienced candidates, and interns and new grads usually don't have them. But it's still important to keep them in mind.
First, it's important to understand how system design interviews are conducted, what is the format, and what needs to be done.
For an introduction to system design interviews, you can watch a great video by Jackson Gabbard below:
As with coding rounds, you can also try existing system design problems. Probably the most valuable thing from them is reading their solutions, seeing what you missed, and getting exposed to new concepts.
For a good collection of system design problems with solutions, you can check out a System design course on educative.io. It's not free, but well worth it. There are also several lessons available for free preview.
We will also cover some more good sources of system design problems in the materials below.
Perhaps the best thing you can do long term to prepare for system design interviews is to learn about real software systems and general principles in them. Even if you read about software systems for 1-2 months, you will be much better prepared for system design interviews, and will become a better software engineer too.
One of the best things you can read is a good book about software engineering and software systems. I highly recommend Designing Data-Intensive Applications as a great book about big distributed systems, and as one of the best technical books I've ever read.
Look below for more great materials you can read.
Perhaps one of the best ways to prepare for system design interviews is to expose yourself to as much information about designs of the real systems as possible. So, here are lots of links to the books, blog posts, articles, videos and papers I found useful.
- Intro to system design interviews with Jackson Gabbard – really helpful video on the topic.
- System design course on educative.io – good collection of solutions for common system design problems. It's not free, but well worth it. Several lessons are also available for free preview.
- Harvard lecture on scalability.
- Read at least several chapters in Designing Data-Intensive Applications.
- Building Microservices has nice chapters on security, deployment and other topics you may want to review.
- See books article on this website to learn about more great books.
Here are some videos that I found helpful:
- How We've Scaled Dropbox – fascinating story of Dropbox going from one server to massive infrastructure supporting millions of users.
- What I Wish I Had Known Before Scaling Uber to 1000 Services.
- Building Software Systems At Google and Lessons Learned by Jeff Dean.
- Facebook and memcached
- Oversubscribing Apache Spark Resource Usage for Fun and $$$
Everything else. It's roughly sorted down from the most recommended ones, but you can check and see what you like:
- Highscalability.com – a nice website with articles on the real scalable systems, though I found the quality of some of the articles to be quite mediocre.
- System design primer – huge collection of materials and links on system design.
- Nginx book on microservices.
- Gainlo has a nice blog on system design and generally interview preparation.
- Uber tech stack
- How Uber Engineers an Efficient Route
- A Look at WhatsApp: Engineering for Success at Scale
- How WhatsApp Reduced Spam for Over 1 Billion People
- One Year Designing at WhatsApp
- MySQL at Yelp
- Quizlet Tests Cloud Spanner
- Google book on SRE
- Command-line Tools can be 235x Faster than your Hadoop Cluster
- The biggest smallest website
- Why the Hell Would You Use Node.js
- How Twitter is fighting spam and malicious automation
- CAP Twelve Years Later: How the “Rules” Have Changed
- Spanner: Google’s Globally-Distributed Database
- Spanner, TrueTime & The CAP Theorem
- Big Data and Google's Three Papers I - GFS and MapReduce
- Designing Schemaless, Uber Engineering’s Scalable Datastore Using MySQL
- How does HTTPS actually work?
- Under the hood: MySQL Pool Scanner (MPS)
- (Re)Introducing Edgestore
- How We Partitioned Airbnb’s Main Database in Two Weeks
- Evernote migration to Google Cloud Platform
- Jepsen: On the perils of network partitions
- The Google Technical Interview. How to Get Your Dream Job
- Introducing "Testing on the Toilet"
- Tape Rescues Google in Lost Email Scare and Gmail back soon for everyone
- Google Project Zero
- How to Solve Google's Crazy Open-Ended Interview Questions
- Google’s Site Reliability Engineering Podcast with Todd Underwood
- The Design Interview From the Interviewer's Perspective
- Computer System Engineering MIT course
- Awesome public Google postmortem
- Java concurrent package
- What’s different about the new Google Docs: Conflict resolution
- Bunch of Wikipedia articles
- Some StackOverflow questions