For me, a huge chunk of each project’s fun was planning. Going through my first two prototypes in Sketchup (rather than in real life) was a massive amount of fun. That part really was not so different to hacking code, really.
The physical work itself is then completely different to software engineering. Nothing is simple — every step of the project presents some unique problem that you have to work around carefully. Maybe you forgot to include the width of the saw in a measurement. Or your stock has a knot in exactly the wrong place. Or you didn’t plan the assembly in the best way to optimise for clamping. Or you drip glue awkwardly and have to clean the first of six benches up before oiling. Or you want to add a shamfer in an awkward place to a piece you’ve already partly assembled.
Imagine having to stop work every few hours to hone the edge on an IDE that’s gone blunt. Imagine running out of 8mm if-statements (dowels) and having to improvise some more so you can peg a project together.
There’s no homogeneity with a natural product. Everything is slow and methodical with few opportunities to hack / test / prototype. You have to think and solve problems that you never thought would happen in a new kind of way because you can’t roll back or undo.
Above all, there are many things you just cannot automate. Sanding up the frame of a pergola getting it ready for oiling is going to be O(n) at best, with only ever a single processor to throw at the problem which itself is hard bounded by mealtimes and hours-in-day.
I love it because it’s not like software.