Designing systems

There are many crucial aspects of designing software systems. An example is: beginning with a clean and well-defined set of components.

One needs to precisely define the functionality of each component, following the single responsibility principle. Then, the relationship between each other has to be clearly defined.