What?
System design is the process of defining the architecture, interfaces, and data and everything that is involved in putting it all together that satisfies particular requirements.
It involves a combination of multiple specialisations:
- computer networking
- distributed systems
- parallel computing
to create highly scalable and performant systems. Understanding the trade-offs of choosing distributed systems to build scalable solutions while embracing complexity is what System Design is about.
In essence, the goal is to design systems that are:
- Reliable: fault tolerant
- Effective: satisfies the business and customer needs
- Maintainable: flexible and easy to scale while also being easy to add new features
What are the building blocks of a system design process?
If you have worked in the software industry, you already know that all large scale systems that exist today were built iteratively. A reasonable design was proposed first, developed and released and tested for performance and scaled accordingly. However, in an interview scenario, you have limited time. Thus you may not be able to run through multiple iterations. Thus you can either do two iterations where you start the basic and then improve through discussion. Another way is to improvise as you go.
System design is not about following or applying a formula. There may be design or architectural patterns but you don’t go memorise some patterns and think that you can apply one of a set of formulae and solve every problem. Quite often something becomes a good design by trial and error, often experimenting under real load.
Scalability is just one part of the solution. In a system design interview or process in general, engineers must consider availability, maintainability, consistency and fault-tolerance.
Summary
Multiple disciplines are foundations of good system design.