Problem solving
I like the moment when a messy problem starts to reveal its shape. Programming gives that process somewhere to go: names, boundaries, tests, tools, interfaces, and eventually something that works. The code matters, but so does the thinking that gets you there.
Practical guidance to developing systems.