- Understand the problem you're solving.
- Create a basic method with the correct structure.
- Design tests to check the functionality of your method (ideally, include positive and negative scenarios).
- Confirm that the tests accurately assess your understanding.
- Develop the method to make the tests pass.
- Improve the method's performance by refactoring it.
- Start simple, single server setup
- Vertical scaling vs horizontal scaling
- Load Balancer
- Database; which one to use?
- DB Replication
- Cache
- Consistent hashing?
- Content delivery network
- Statelessness - NoSQL / Cache
- Data centers / Availability
- Sync / Async communication
- Logging, metrics, automation
- DB Scaling - Vertical / Horizontal
- Don't go into details until high level architecture is agreed upon.
- Who is going to use the system, and how?
- Constraints? traffic / data handling constraints at scale.
- Scale of the system such as requests per second, requests types, QPS.
- Sketch the important components and connections between them, but no details.
- Database schema design if there is time, ONLY if there is time - but try to push it.
- Identifying and solving bottlenecks.