system-design Step 1: Constraints and use cases Step 2: Abstract design (High Level Design) Step 3: Understanding bottlenecks Step 4: Scaling your abstract design (Low Level Design)