Add how to approach a system design interview question section
parent
37990f0aa1
commit
c0bbd9d912
68
README.md
68
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 [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 |
|
| 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 |
|
| 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)
|
||||||
|
|
Loading…
Reference in New Issue