Outline use cases, constraints, and assumptions
Gather requirements and scope the problem. Ask questions to clarify use cases and constraints. Discuss assumptions.Key questions to ask:
- 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?
Create a high level design
Outline a high level design with all important components.What to include:
- Sketch the main components and connections
- Justify your ideas
Design core components
Dive into details for each core component. For example, if you were asked to design a URL shortening service, discuss:Example considerations:
- Generating and storing a hash of the full URL
- MD5 and Base62 encoding
- Hash collisions
- SQL or NoSQL
- Database schema
- Translating a hashed URL to the full URL
- Database lookup
- API and object-oriented design
Scale the design
Identify and address bottlenecks, given the constraints. For example, do you need the following to address scalability issues?Common scaling solutions:
- Load balancer
- Horizontal scaling
- Caching
- Database sharding
