A program which is dividied into self-contained modules which can be further subdivided into smaller modules. They can be written and tested individually.
Advantages are: Can be reused in other programs. Can be shared between different programmers. Reduced development time. Easier to mantain and debug.