modularity
Most software in this list are modular. This means that each of their components, or modules, can operate independently of each other. Each part can (and must) communicate with other parts through properly specified interfaces.
advantages
Breaking down a system into simpler modules can reduce complexity while improving maintainability, flexibility, reusability and scalability. For example, a properly designed modular environment allows to:
replace, add or remove some modules without impacting the system as a whole ;
manage a workload that varies (and often increases) over time;
make analysis and bug fixes easier, and improves the general testability of the system;
create new systems, derived from existing ones, more efficiently.
Because it enables software to be adapted to a variety of contexts (technological, functional and human), software modularity is an essential condition for its sustainability.
challenges
However, modularity is not achieved without effort.
At first glance, a modular system may seem more complex. However, if each module is properly documented, it is easier to understand the system gradually, one module after the other. This allows the system to be understood both as a whole and in detail, and avoids the “black box” effect.
Coordination between modules can also be a problem. It is essential to properly manage interface changes, dependencies, configurations and versions, to ensure (backwards) compatibility, etc.
techniques
There is no silver bullet, and even less a single way of achieving all the benefits of modularity, while avoiding all the risks. Nonetheless, the following good practices can generally be used:
decompose the system in a way that is appropriate to its desired features;
define clear, consistent interfaces that are future-proof;
avoid coupling; adopt an appropriate level of redundancy;
avoid compatibility breaks at all costs, and if necessary, anticipate and document them;
write exhaustive and up to date documentation;
test exhaustively, continuously and incrementally;
be future-proof: in other words, make sure that everything you’ve forgotten is thought of anyway.
In short, you need experience and discipline, both towards yourself and towards the users of the system.