Of a computer program:
the notion that its functionality
(and hence, the code implementing it)
is partitioned into distinct functions or modules which can be independently written, understood, and worked on.
Humans can only keep track of so many details at once,
so breaking large programs up into modules is the only way of keeping them tractable.
Ideally, modules are not mere subsets of the whole, but subsets which are partitioned and defined in some useful way. A well-defined module will perform some distinct function and have a minimum of interconnections with other modules.
(The reason for keeping the number of interconnections small is so that the module will acheive its goal of being an independently-understandable part of the whole.
The more interconnections there are with the rest of the larger whole,
the more of the larger whole must be understood and kept in mind while working with the module.)
Modules connect to and communicate with other modules through interfaces; a nicely simple set of interconnections is also referred to as a "narrow interface" or "loose coupling".