System Design Process

System Design is about finding technical solutions to abstract problems and can vary depending on problem we want to solve, therefore it is important to ask clarifying questions.

Clarify requirements

Clarify requirements early to determine the exact scope of the problem we want to solve.

Functional requirements

Base functionality that we need to provide to a user:

Non-functional requirements

Non-behavioral requirements: Maintainability, reliability, scalability:

Extended requirements

Nice to have's, might be out of scope:

Estimations and constraints

What is the scale of the system we are implementing? Ask questions:

That way we can think about how to scale such a system.

API design

To better define our expectations for our system, we can think of our API interfaces. KISS:

createUser(name: string, email: string): User

High-level component design

Design a basic diagram including system components like a Load Balancer and start discussing how the system will work from the client perspective.

Detailed Design

Get into more details and show expertise, present different approaches, use existing experience and give examples. Don't be opinionated.

Identify and resolve bottlenecks

Think about bottlenecks. Read your companies blog and find out about their tech stack to get a sense of the problems they are facing.