Programs typically carry out instructions step by step - procedurally - and in order to program a solution, this is something coders must understand well. Aspects of thinking procedurally include:
Using a procedure to complete a task, while hiding the details of how it works, for simplicity.
Breaking a task down into smaller sub-tasks, then breaking these down, and so on and so forth.
This utilises decomposition by decomposing the problem into simple tasks, solved using small, self-contained modules. This makes the code easier to write, maintain, and debug, as each modules can be isolated.
This is a result of top-down design, depicted as an upside-down tree, with the main problem as the 'root node' and all the subtasks that make it up branching off it: