System Design Interview Checklist
How to say what the interviewer is waiting for me to say without making her wait
In two weeks I will have my first system design interview. I feel nervous, excited, and motivated to go through it successfully. As a junior developer I was part of developing big systems. As a senior to be, being able to look at the big picture of the design is a huge adventure for me. Getting to know the basics and the terminology was nothing but total fun.
Clarifying requirements
The first step of my interview will be discussing the system I will be designing, its main features and the expected load it should be able of dealing with.
Functional requirements
What will the system do? For example, WhatsApp: one on one chat, group chat and sending & reading verification. Another example: Netflix, streaming service and recommendations per user.
Business requirements
Here I will ask about the business model, which will help me understand what the user will pay for, or whether he’ll be paying at all. Maybe it’s going to be free and therefore the collected data will be the actual asset of the company?
Non-functional requirements
The terms in this category are about making the system meet the requirements all together. Scaling while keeping low latency, availability, consistency and reliability. Remembering the CAP theory, I will choose some features above the others, so it is important for me to understand which of them is crucial for the system expected behavior.
The Designing Process
In most cases I will start with a client, server and a database. Starting with the simpler approach but still keeping in mind (and also discussing with the interviewer) that later it will need to be scaled. e.g starting with a single in-memory host, then splitting it to many hosts.
Stating the main design issues I will deal with during the interview
- A lot of requests (and therefore, probably a lot of servers)
- A lot of users
- A lot of data
- Server failure
I wrote ‘a lot of’ but later on I would like to talk about the exact numbers or at least assumpations, as accurate as possible. Next I will get to the most important part of the interview for my opinion, discussing tradeoffs to consider during the design process.
Tools I would like to use
- Components like: Load Balancer, ZooKeeper, Database, Cache, CDN, Message Queue
2. Measurements: five nines availability, QPS, bandwidth estimation, storage size
Possible tradeoffs to discuss
SQL VS NoSQL
Latency VS Throughput
Availability VS Reliability
Caching VS Storing
Scaling VS Simplicity
Developing duration VS Complexity
Functionalitiy VS Efficiency
Specificity VS Generality
Summary
To summarize my preparation for the interview I will attach a note to have in front of me during the interview:
- Clarify requirements, both functional and non-functional
- Discuss tradeoffs
- Suggest a basic design
- Improve the design with necessary components
- Check if there are single points of failure
Appendix 1- Names of technologies
Load Balancer: Azure Application Gateway, Kemp LoadMaster, Citrix ADC, F5 BIG-IP Local Traffic Manager (LTM), Varnish Software, Nginx, Azure Traffic Manager, HAProxy
Relational Database: IBM DB2, Oracle DB, SingleStore, SAP HANA Cloud, Microsoft SQL server, PostgreSQL, MySQL
Non-Relational Database: MongoDB, Apache Cassandra, Apache HBase, Apache CouchDB, Neo4j, RavenDB, Redis, OrientDB, ScyllaDB, DynamoDB
(Types of NoSQL DBs: Key-Value like Redis, Wide column Cassandra, Document like Mongo, Graph like Neo4j)
Cache: Redis, Memcached, Apache Ignite, Couchebase server, Hazelcast IMDG, Mcrouter, Varnish Cache, Squid Caching Proxy
CDN: SatckPath, Sucuri, Cloudflare, KeyCDN, Rackspace, Google Cloud CDN, CacheFly, Amazon CloudFront
Service Discovery Software: ZooKeeper, HashiCorp Consul, Eureka, Docker, Traefik, etcd, GRPC, Hysterix, SkyDNS
Messaging: Apache Kafka, AWS Kinesis
Message Queue: AWS SQS, RabbitMQ
Appendix 2- Useful links
GitHub system design detailed guide
InterviewBit system design guide