What Is System Design?

System Design is the process of defining components and their integration, APIs, and data models to build large-scale systems that meet a specified set of functional and non-functional requirements. This discipline aims to develop large-scale, effective, and maintainable systems.

System Design has gone from being virtually unheard of to becoming an in-demand skill for many tech professionals. As distributed systems become increasingly essential to our everyday lives, being able to understand and hold discussions about them has become indispensable.

System Design primarily borrows concepts from distributed systems. Distributed systems are computing systems that constitute a web service, with elements housed across different networked devices. There are various elements used in a distributed system, such as:

  • Load balancers—A load balancer fairly divides all clients’ requests among the pool of available servers, which helps prevent server overload.

  • Storage—Storage in distributed systems refers to the process of storing data across multiple nodes in a network rather than on a single centralized server. This allows for improved scalability, fault tolerance, and performance in handling large amounts of data.

  • Front-end servers—A front-end server, or web server, serves static content and responds to client requests on the World Wide Web (WWW). These servers are responsible for handling clients’ HTTP requests.

  • Cache—A cache refers to a temporary storage location that is used to store frequently accessed data closer to the point of use in order to improve performance and reduce the amount of network traffic.

System Design employs these components, as well as others, to orchestrate numerous large-scale distributed systems. These components are also known as the building blocks of System Design. We’ll discuss them later in the course, but selecting the right building blocks and integrating them so that they achieve a common goal is a key aspect of System Design.

Press + to interact
Modern systems are designed using fundamental building blocks
Modern systems are designed using fundamental building blocks

Note: Even though distributed systems are vital to System Design concepts, other disciplines like computer networking, operating systems, programming, and security are equally important to the domain of System Design.

Goal of System Design

The goal of System Design is to design distributed systems that are:

  • Reliable—They can handle faults and errors.

  • Effective—They can meet user needs and business requirements.

  • Maintainable—They can scale easily and are flexible when there are changes to requirements and constraints.

Designing distributed systems is complex. Thankfully, today’s System Design discipline is mature and well-defined. We can draw from best practices of System Design to effectively build large-scale systems that can scale for the future.

That said, System Design is a creative process. There can be many ways to solve a particular problem.

As with all design processes, System Design is iterative. Improvements can and should be made to the design over time (just as circumstances are likely to change over time). For example, if we design a service that can host 1,000 users today, we should be prepared to adapt this system if the number of users grows drastically to reach billions in a year.

Knowing System Design gives you immense perspective. We can picture the difference between knowing and not knowing System Design through the comparison of being a line cook or head chef of a restaurant. The head chef has a broader perspective on the kitchen (system) as a whole. They know each staff member’s role and operations and how they depend on each other. They’re prepared to have backups take over if one person can’t complete their duties. Because it’s not required of them, a line cook usually lacks this vision of the big picture to which they contribute.

Press + to interact
Line cook vs. Head chef
Line cook vs. Head chef

Why learn System Design?

Distributed systems are becoming increasingly commonplace in modern software, so most developers will have to deal with them at some point in their careers. Understanding System Design gives you a broader perspective, which will help you land better jobs, advance your career, negotiate for higher salaries, and be more effective as a senior leader, project manager, or engineer.

Even if advancing into a higher role isn’t your goal, every developer should learn System Design. Distributed systems permeate most of our crucial technologies today. As a developer, you’ll most likely make an application that has to interact with a distributed system, and understanding System Design fundamentals will help you make a more effective application.

Here are a few benefits you can gain by learning System Design.

Avoid down-leveling

Most top tech companies organize their engineering teams into skill-based levels so that they can effectively coordinate, train, and scale their teams.

While each company is different, here’s a quick breakdown:

  • SWE I (Junior)—Handles small tasks and limited features under the mentorship of senior engineers.

  • SWE II (Mid)—Handles larger tasks and works on multiple features with more independence.

  • Senior Engineer—Performs several engineering tasks simultaneously and leads teams.

  • Staff Engineer—Leads engineering teams and oversees product lifecycle.

  • Principal/Distinguished Engineer—Leads several teams, aligning teams to company strategy.

Press + to interact
Job levels based on skillset in different tech companies
Job levels based on skillset in different tech companies

When interviewing, a mismatch between a role’s required skills and a candidate’s proficiency can result in two cases:

  • Down-leveling—When a company offers a candidate a job at a level lower than the role to which they applied.

  • Up-leveling—When a company offers a candidate a job at a level higher than the role to which they applied.

Down-leveling happens to many experienced engineers, regardless of their years of experience. This is because levels are ultimately skill-based. While down-leveling is unfortunate, it’s necessary for companies to maintain their team’s organization. Often, the pitfall that down-levels engineers is a lack of proficiency in System Design. (In fact, each level will be expected to have a different approach and perspective during the System Design Interview, which we’ll discuss in this course.)

To avoid down-leveling and to advance into your desired roles, you’ll need to get proficient in System Design (and subsequently, the System Design Interview).

It’s never too early to learn

Even if you’re new to software development, don’t assume you can procrastinate on learning System Design. Some companies are putting even junior engineers through System Design Interviews. Some might find this unfair or unreasonable for engineers early in their careers. But a company might do this for many reasons—and we can likely expect the trend to continue.

Given that many universities and colleges are teaching distributed systems and System Design as part of their curriculums, it’s reasonable for companies to expect this knowledge from junior engineers. Some companies expose junior engineers to working with distributed systems, and coming into such a role with some System Design knowledge can be especially helpful if a company isn’t able to provide extensive on-the-job training.

Hopefully, you can see how upskilling in System Design pays dividends in your interviews and long-term career growth.

Q

Which of the following system requirements do we aim for in System Design?

A)

Reliability

B)

Maintainability

C)

Effectiveness

D)

All of the above