瀏覽代碼

Add how to approach a system design interview question section

Donne Martin 8 年之前
父節點
當前提交
c0bbd9d912
共有 1 個文件被更改,包括 68 次插入0 次删除
  1. 68 0
      README.md

+ 68 - 0
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)