diff --git a/README.md b/README.md index fa9e0ca..a6583a3 100644 --- a/README.md +++ b/README.md @@ -190,3 +190,71 @@ Start broad and go deeper in a few areas. It helps to know a little about vario | Work through [System design interview questions with solutions](#system-design-interview-questions-with-solutions) | Some | Many | Most | | Work through [Object-oriented design interview questions with solutions](#object-oriented-design-interview-questions-with-solutions) | Some | Many | Most | | Review [Additional system design interview questions](#additional-system-design-interview-questions) | Some | Many | Most | + +## How to approach a system design interview question + +> How to tackle a system design interview question. + +The system design interview is an **open-ended conversation**. You are expected to lead it. + +You can use the following steps to guide the discussion. To help solidify this process, work through the [System design interview questions with solutions](#system-design-interview-questions-with-solutions) section using the following steps. + +### Step 1: Outline use cases, constraints, and assumptions + +Gather requirements and scope the problem. Ask questions to clarify use cases and constraints. Discuss assumptions. + +* Who is going to use it? +* How are they going to use it? +* How many users are there? +* What does the system do? +* What are the inputs and outputs of the system? +* How much data do we expect to handle? +* How many requests per second do we expect? +* What is the expected read to write ratio? + +### Step 2: Create a high level design + +Outline a high level design with all important components. + +* Sketch the main components and connections +* Justify your ideas + +### Step 3: Design core components + +Dive into details for each core component. For example, if you were asked to [design a url shortening service](https://github.com/donnemartin/system-design/blob/master/solutions/system_design/pastebin/README.md), discuss: + +* Generating and storing a hash of the full url + * [MD5](https://github.com/donnemartin/system-design/blob/master/solutions/system_design/pastebin/README.md) and [Base62](https://github.com/donnemartin/system-design/blob/master/solutions/system_design/pastebin/README.md) + * Hash collisions + * SQL or NoSQL + * Database schema +* Translating a hashed url to the full url + * Database lookup +* API and object-oriented design + +### Step 4: Scale the design + +Identify and address bottlenecks, given the constraints. For example, do you need the following to address scalability issues? + +* Load balancer +* Horizontal scaling +* Caching +* Database sharding + +Discuss potential solutions and trade-offs. Everything is a trade-off. Address bottlenecks using [principles of scalable system design](#index-of-system-design-topics). + +### Back-of-the-envelope calculations + +You might be asked to do some estimates by hand. Refer to the [Appendix](#appendix) for the following resources: + +* [Use back of the envelope calculations](http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html) +* [Powers of two table](#powers-of-two-table) +* [Latency numbers every programmer should know](#latency-numbers-every-programmer-should-know) + +### Source(s) and further reading + +Check out the following links to get a better idea of what to expect: + +* [How to ace a systems design interview](https://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/) +* [The system design interview](http://www.hiredintech.com/system-design) +* [Intro to Architecture and Systems Design Interviews](https://www.youtube.com/watch?v=ZgdS0EUmn70)