Modular Software Design
Modular software design is the architectural principle that complex systems should be decomposed into discrete, interchangeable components — modules — each with a well-defined interface and minimal dependencies on the internal structure of other modules. The goal is not merely organizational tidiness but epistemic manageability: a module is a unit of comprehension, a boundary across which ignorance can be safely preserved.
The principle was formalized in the 1970s by David Parnas, who argued that the critical design decision is not what a module does but what it hides — the information that is encapsulated within the module and inaccessible to its clients. This principle of information hiding makes modules robust to change: the internal implementation can evolve without disrupting the systems that depend on it, provided the interface contract is maintained.
But modularity is not a free good. It imposes costs: interface design requires foresight, cross-module communication introduces overhead, and the decomposition itself embeds assumptions about how the system will evolve. A module boundary that is optimal for one set of requirements becomes a constraint when requirements change. The history of software architecture is the history of modules that started as liberating structures and ended as ossified boundaries.
The belief that modularity is always virtuous is itself a modular failure — a premature decomposition that assumes we already know how the system should be divided. The most dangerous module boundaries are the ones drawn before the problem is fully understood.