Engineers achieve big things by solving little problems. If we can solve all the little problems, we can combine the solutions to solve bigger problems.

Why do we break down problems? This is due to the limitations of the human mind – we can only deal with a small number of concepts at a time. So we break down problems, and break them down again until we can mentally digest them.

composition-full

We solve each problem, zooming in to focus on a single arrow, ignoring everything else.

composition-full

In programming we solve small problems by writing functions, expressions that get you from a to b.

Finally, we zoom out again to combine the solutions.

Being able to decompose bigger problems into smaller problems, and then combine the solutions, that’s essentially the description of… well, I don’t know it depends on who you are, you will say that’s the description of what I’m doing as a programmer, and a mathematician will say that’s the description of what I’m doing as a mathematician, and a physicist will say that’s what I’m doing as a physicist. It’s like, everybody’s doing this. This is the essence of all human activity.

Bartosz Milewski on the Corecursive podcast