# How to approach a system design interview question

> From [The System Design Primer](https://github.com/donnemartin/system-design-primer) by Donne Martin, licensed under CC BY 4.0, arranged into chapters for this site. Part of "Start here". Web page: https://system.tangentbyte.com/learn/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](https://system.tangentbyte.com/#system-design) 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://system.tangentbyte.com/learn/design-pastebin), discuss:

- Generating and storing a hash of the full url

  - [MD5](https://system.tangentbyte.com/learn/design-pastebin) and [Base62](https://system.tangentbyte.com/learn/design-pastebin)
  - 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](https://system.tangentbyte.com/).

### Back-of-the-envelope calculations

You might be asked to do some estimates by hand. Refer to the [Appendix](https://system.tangentbyte.com/learn/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](https://system.tangentbyte.com/learn/appendix#powers-of-two-table)
- [Latency numbers every programmer should know](https://system.tangentbyte.com/learn/appendix#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://web.archive.org/web/20210505130322/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)
- [System design template](https://leetcode.com/discuss/career/229177/My-System-Design-Template)
