A style of programming in which the complete program is decomposed into a set of components, termed modules, each of which is of manageable size, has a well-defined purpose, and has a well-defined interface for use by other modules. Since the only alternative — that of completely monolithic programs — is untenable, the point is not whether programs should be modular but rather what criteria should be employed for their decomposition into modules. This was raised by David Parnas, who proposed that one major criterion should be that of information hiding. Prior to this, decomposition had typically been performed on an ad-hoc basis, or sometimes on the basis of “stages” of the overall processing to be carried out by the program, and only minor benefits had been gained. More recently there has been great emphasis on decomposition based on the use of abstract data types and on the use of objects or object orientation; such a decomposition can remain consistent with the principles of information hiding.