System Design

System Design is the process of identifying and defining the various components of the system, their relationships, and the data flow.

When building a product or a feature there is no prize for guessing what happens if an individual or team entirely skips the design process or only design at a high level. Sooner or later, they will have to get back to the drawing board and design it again!

So, what is needed to design a good system? Although each system design process is very subjective to the system and the scale and complexity of the system, the following are some of the design fundamentals a system architect should have before venturing into system design.

System Design Fundamentals Mind-map of System Design Fundamentals

Foundational Knowledge Link to heading

Each individual who designs a system should have a basic knowledge of architectural design patterns. A simple example would be the client—server model. Based on this knowledge, a suitable pattern can be picked and the design can built on the same, one step at a time.

Key System Characteristics Link to heading

Depending on the system being designed certain characteristics that require more attention than others. It is based on the business and technical requirements of the system. E.g., availability, throughput, redundancy, etc.

If you consider Instagram feed, for example, the availability of a set of feeds when a user opens the app is a key characteristic of Instagram. If the user sees a blank feed or outlines of just 2–3 entries, the engagement drops soon. Likewise, each system has a set of key characteristics and the system designer should keep these in mind when designing the system.

Components of the system Link to heading

These are high-level components of the system being designed. Again based on the system, a load-balancer may be required or not. Other examples of components can be — proxies, cache, rate limiting, databases, messaging systems, etc.

Existing products and services Link to heading

An important skill is understanding of currently available systems and services — can be open-source or commercially available.

The person who created cupcakes, neither created cups nor cakes. She just took both of these and created something new! Similarly, when the system architects know already available products and services, it can greatly help create a new solution utilizing the existing products/services.

Some examples of components are Zookeeper, Redis, Kafka, Amazon S3, Azure AI service, etc.

These four are a few of the design fundamentals one needs to know to get started on system design. Additional knowledge is of course required as the system becomes more complex and scales up.

References: System Design by Systems Expert