In the design of a large product or complex piece of software, the process of breaking down the design into major components, modules, or subassemblies, then dividing each component, module, or subassembly into smaller parts, and continuing the process until the smallest module needed is allocated to an individual or group to design.