Not necessary to follow at all times (exceptions differ on problem), example:
-
Making a payment system (using a 3rd party PSP):
- More focus on high level > low level data structures
-
Search engines
- low level understanding of data structures + systems
-
Define the Goal:
- Non technical requirements
- Given hypothesis / limitations of the problem
-
Functional Requirements:
- Technical requirements (Capacity, Read, Writes, etc)
-
Capacity Estimation:
-
Take the biggest problem and find capacity needed for that, can be:
- Read Complexity -> worst case TC / Payload size
- Write complexity -> worst case TC / Cache size
- other like max bandwidth, worse case latency, etc..
-
Usually depends on type of problem (from functional requirements)
-
A good shortcut for capacity (size) approximation:
-
-
Approaches
- Usually addressing the problems, and solving one by one, example:
- Data structures to be used for read / write?
- Processing: Stream / Batch?
- Connections? REST / GraphQL / RPC?
- low level estimation, iterate over and over again.
- Usually addressing the problems, and solving one by one, example:
-
System Components
- After solving problems, make system depending on that
- System Design (Diagram)
- Components Breakdown (optional - adding context)
- Simpler as possible -> think of scale as well, but main focus is solving the problem in hand.
- After solving problems, make system depending on that
-
Summary / Solution
- Overall, if multiple approaches are give, providing final suggestion
- Suggestion for scale / ways to improve, etc.