Simplifying change as a critical criterion for modularizing software.
Using "Information Hiding" as the criteria for modularization bodes better to Requirements Changes than "Flowchart-based componentization" i.e., conventional "Functional decomposition".
Using libraries to share common encapsulated modules.
Additional modularization best practices
Data structures are not shared/passed outside of the module.
The routine and its factory are encapsulated within the module.
Encapsulate "formats of control blocks" - i.e., API interfaces.
Modules should not rely on sequencing of operations.
Clean Decomposition is independent of Hierarchical structure
Lower-levels can be reused independently
Higher-levels are simplified by using lower-levels
Managing complexity and supporting evolution are fundamental problems with large-scale systems
Data abstraction allows easier change in design decisions about the representation of data structures, while tool abstraction allows easier change in system functions.
Using event-driven integration to implement functional composition on top of data-abstraction-based modularization.
Spreadsheets as an ideal example of this - with additive equations as event-driven control of function - orthogonal to the underlying data.