System Design is not a one-dimensional practice. It's a complex discipline that requires a high-level understanding of systems and the implementation of each system's components. If you're new to System Design, this can seem overwhelming. However, System Design is a highly sought-after area of knowledge. Whether you want to learn System Design to design distributed systems, or simply want to be a more well-rounded developer, we'll try to provide you with a clear starting point.
Every system has its own distinctive design and components. but there are a few characteristics of systems that you should be aware of before diving into the details of a system's implementation. In this introduction, we'll briefly discuss System Design components and design patterns, then will discuss some important terminology. Once you're familiar with these basics, you'll be much better equipped to continue your System Design education!
Let's get started with your first step into System Design!
We'll cover:
What is System Design?
The process of System Design, at its simplest, is defining the architecture, databases, and interfaces to meet the needs of a company. System Design is essentially constructing different parts of a system such that they work as a team to accomplish a single goal. It is the same as how the walls, ceiling, and structures of a building keep it functioning. Getting all of these building blocks to perform together on a large scale is the goal of a system designer. Don't worry about understanding all of these terms just yet, but have a look below to get an idea of what we mean by the components of System Design.
System Design components:
- Databases
- Key-value store
- Domain name system
- Distributed logging
- Distributed search
- Service monitoring
- Distributed caching
- Content delivery network
- Distributed messaging queue
- Rate limiter
- Blob store
- Load balancers
- Sequencer
- Sharded counters
- Distributed task scheduling
After this overview, feel free to check out this article from Educative that dives deeper into the specific components of System Design.
The core of System Design is integrating these building blocks with APIs and data models to all function together as a large-scale system. This collection of computers, software, and data centers working as one device for the end-user is referred to as a "distributed system."
Learning System Design requires knowledge of distributed systems design patterns and the individual components. Design patterns are proven methods of structuring a system for specific use cases. The design patterns provide an outline for how different nodes in a system communicate, complete tasks, and delegate roles. Having standard models of design patterns allows programmers to not have to start from scratch when designing a new system.
System Design characteristics
This section will act as your launch pad for your journey into the world of System Design. Before you're ready to dive headfirst into distributed design patterns and components, you must first understand the requirements. There are four general characteristics that every system should meet, to varying degrees.
A coherent system must have adequate:
- Scalability
- Maintainability
- Reliability
- Availability
Scalability in a system
Scalability is a system's ability to function under an increasing amount of work. The amount of "work" a system is handling can come from active users, cache requests, or sending and receiving data.
The three elements that impact scalability are:
Latency: The time it takes for a system to process the request of a user.
Network latency refers to how quickly data is sent from point A to point B in a system
Application latency refers to how long it takes an application to process a user's request
Bandwidth: This is the maximum processing threshold of a network over a specific time frame.
Throughput: The amount of data that can be successfully received and sent during a set time.
There are also different types of scalability for applications. Vertical scaling would be what is referred to as "scaling up". For instance, if a server has 16 gigs of RAM and is increased to 32 gigs of RAM, that single server has been vertically scaled. Since it is just the hardware of the server being augmented, no additional code refactoring is required to perform this upgrade.
When a single server can no longer reach the level of computing power necessary, other options have to be explored. This brings us to horizontal scaling. In the case of horizontal scaling (also known as "scaling out"), additional servers or databases are being added to the existing roster. While there is a limit to vertical scaling, there is essentially no limit to horizontal scaling. Hardware can continue to be added with little concerns of maxing it out.
Maintainability in a system
Ideal maintainability is achieved in a computing system when problems with the network can be solved painlessly. That may sound easier said than done, but there are three concepts that allow system designers to make certain that their system has the desired level of maintainability.
These core concepts are:
Operability: High operability aims to eliminate unplanned interventions or bugs. A system with good operability will anticipate errors through automated diagnostic testing. When the system can anticipate an error, the time and effort required to fix the issue drop dramatically.
Evolvability: Ideally, the inherent structure of a design will facilitate smooth transitions between older and newer generations of technologies. Designing a system that can withstand change will not only increase its lifespan but also save a fortune on system upgrades in the future.
Simplicity: FAANG companies such as Google and Apple rely heavily on this concept. Despite the complexity behind the scenes (or system), it is critical that the users be offered an interface that is simple to navigate. A new visitor to any website should be able to get from point A to point B in the interface without encountering any roadblocks. A satisfying user experience is a key to keeping up active visitors in any system.
Reliability in a system
A system that can complete all planned services and functions without crashing is considered reliable. Faults are errors that can arise in any component of a system. A common type of fault is a parsing error, which means the system is unable to process structured information, such as an XML file. A reliable system should ideally be classified as fault tolerant, meaning it can still process requests and functions in the event of a fault.
Availability in a system
In order to keep up with the requests of users, a high-functioning system must operate consistently at an optimal level. The expected level of performance is typically referred to as uptime. For instance, if we're designing an app like Twitter, we'll need high availability to ensure that a tweet can be posted with only a few seconds of delay. Systems that run in hospitals are particularly focused on optimizing uptime because a delay in services can potentially put a patient at risk.
Continue learning System Design
Now that you've familiarized yourself with the general concepts of System Design, the door is now open for you to dive even deeper! While this article covers nowhere near all of the elements and concepts of System Design, we believe it is important to provide a simple first step into learning. While learning System Design, it is also important for your retention to learn at your own pace. A career in System Design comes about after years of experience and proven knowledge, so there is no rush to learn everything.
If you want to practice the concepts listed above while also diving deeper, then check out our Grokking Modern System Design for Software Engineers & Managers course!
Check out our comprehensive System Design guide for 2022 to explore more system design concepts and practices!
Happy learning!
Continue reading about System Design on Educative
- System design primer: Learn the basics of System Design
- The Complete Toolkit for Grokking Modern System Design
- Software architecture diagramming and patterns
Start a discussion
Why do you want to learn System Design? Was this article helpful? Let us know in the comments below!