System design is foundational for building software architecture in relation to the system under consideration. For building distributed systems, the role of system design has been the key focus area starting with back-of-the-envelop calculations during the brainstorming phase.
Whether you are preparing for a system design interview or a workshop as part of distributed system’s planning phase, covering the broader spectrum of knowledge areas is essential from a software architecture perspective. This article’s focus is to provide pointers to respective subject areas in the form of a mind map considering the breadth & depth of system design.
While there are tips/suggestions to be effective in system design, a word of advice is to practice, practice & more practice.
As there is no such thing as perfect design or architecture, applying the approach below iteratively goes a long way:
- Ask clarifying questions — ensuring that you capture functional & non-functional requirements in terms of system availability (how many 9’s to support), security (think about zero-trust security and defense-in-depth), consistency (Eventual Consistency or ACID)
- Establish estimates for meeting the requirements — the compute, storage, and networking required to meet the stated requirements by applying back-of-the-envelop calculations. Click here to read about Google’s guide on the rule of thumb calculations.
- Demonstrate the process of applying system design — whether you are in an interview or in a workshop at the job, the key success formula is to outline the process of building the software architecture. Be practical — if you are trying to build the perfect system design in the early stage, the trust with the stakeholders will fade away as there is no such thing as the perfect design.
With the above concepts in consideration, below mind map helps to navigate through different paths during the system design (note that this is not the comprehensive list — think incremental approach):
To conclude, system design for distributed systems requires knowledge in diverse areas. You don’t need to know the in-depth of each subject area — you can rely on subject matter experts to detail it further. System design helps to build the software architecture incrementally and it is a continuous architecture as we progress through the journey of building a novel system.