...
By refactoring our monolithic application into isolated "modules" of independent functionality we are able to greatly reduce its complexity. This reduction in complexity comes in many forms, but one of the more obvious reductions comes from simply reducing the number of considerations which must be dealt with at the same time. Just as with Objects in Object Oriented Programming we apply the Single Responsibility Principle to our modules. By working with the higher level of abstraction, we are able to more effectively manage our codebase.
Reduced Number of bugs
The reduction in the number of bugs is achieved simply because a modular system is safer in than a monolithic application due to the reduced complexity. There is a reduced cognitive load involved in making changes, adding new features, or fixing existing bugs.
...
The efforts we have made and continue to make to modularize the IGB code base have the incredibly beneficial side effect of leading to a software system which is already pluggable/extendible in a huge variety of ways. The reason why a plugin API is the natural organic output of this refactoring effort is obvious. Each time we find existing functionality in code which is being isolated into a module we must evolve our APIs to allow for extensibility to accomodate. If for example, we find some code which is adding a menu option into the main IGB toolbar, then we must then create mechanisms in the plugin API to allow for the addition of menus to this toolbar (e.g. the addtion of an interface to implement). These mechanisms are then available to all future module developers to leverage which when writing their own extensions to IGB.
...