|laziness, impatience, and hubris|
I had to go with other because there was no all of the above.
Programming is much like engineering - as you design your project you need to be aware of the real world applications and limitations while striving for the theoretical best.
Programming is much like Carpentry/Masonry - You build according to plan except where the plan does not account for limitations imposed by the materials, site, tools or abilities.
Programming is much like Gardening - you have grown your system to maturity and enjoy it, but you also see the things you need to do better next year(next time).
Programming is much like Cooking - You follow the recipe but when opportunity is available substitutions can be made that will improve the end product (ok and some times you need to toss out that batch of soup)
Programming is much like Painting/Drawing - There are moments of divine inspiration that make everything PERFECT! And if it doesn't you can erase/overpaint (sigh)
Programming is much like sculpting - sometimes the base medium has a flaw or characteristic that makes it less than ideal for the given application, but we somehow almost always seem to make things work out.
Programming is like Knitting/Weaving/Sewing - each thread we add to our tapestry has an effect on each of the others. Adding a bad thread in the wrong place can cause failure in unforeseen places.
Programming is like rocket science - the more familiar you become with programming the less like rocket science it seems. But there is a point where sometimes while thinking about a program we do not realize how stupid we look sitting out in the rain (it WAS sunny when we started thinking).
Programming is like Brain surgery - We do everything in our power to keep mistakes out of what we do but sometimes - rarely (we hope) - somebody dies :(
So depending on the time, application, language, programmer, company, weather and all other things that affect us - programming can indeed be more like each of the above than any of the others.