This is the process of breaking down a problem into sections which become progressively smaller until each module can be written as a singular function. Each module can be tested separately or form part of a library routine. This makes the code reusable throughout the program or similar programs.