This project is about software system design problems and using interactive diagramming toolings to grow an intuition for the design decisions. Techniques such as Back-of-the-Envelope calculation for capacity estimation, and reasoning about a software system's design is a critical skill for effective technical leadership.
For each of the problem below, we will use the Google's NALSD format below to draw out the design:
1. Functional Requirements
2. Non-Functional Requirements
    - Define assumption
    - Define constraints
    - Define SLO's
3. High Level Design
    - Design APIs
        - Prefer simple, stateless services where possible
    - Follow the data
    - Data consistency - critical data
    - Data consistency - less critical data
    - Data storage considerations
    - Sharding data
4. Scaling the design
    - Scaling and Performance 
5. Monitoring
6. What could go wrong?
List of Software System to Design
- Web Crawler
- News Feed
- Uber
- Top-K YouTube Videos
- URL Shortener
- Video platform like YouTube
List of Machine Learning Software System to Design
- News Feed