One of the challenging part of any software design is to manage complexity. By managing complexity effectively we can respond to change quickly, improve time to market, reduce cost of change and also improve stability of the system. Modularity is useful for managing quality and complexity in software systems.
Modularity is the concept of breaking down a complex problem into smaller, simpler and more manageable problems.
In software design, modularity refers to the extent to which a software application may be divided into smaller modules. The goals of structuring an application or system in modules is to be able to develop, test and deploy them separately. Modularity also enforces separation of concerns by vertically or horizontally partitioning a system. It keeps a clear separation between business functionality and data/information.
One way to achieve modularity is functional decomposition which basically means that each module or sub-system has a clear domain responsibility and is part of a larger eco-system. Each sub-system may consist of one or more independent modules.
Benefits of functional decomposition:
- Increase quality and reduce complexity
- Parallel development and roll-outs
- Horizontal load balancing of functionality
- Reduced dependencies between different functional areas
- Functional areas can scale separately and on demand
- Asynchronous workflows that increase availability and evenly balance out peak loads
- Smaller modules most of the time brings smaller data sets. This helps to reduce database size, database server workloads and simplified ORM mappings.
Also it is really difficult to become agile or apply agile methodologies without a modular system. A modular system helps you to replace, upgrade or throw away certain part of the system without affecting much the rest of the system.