It works on many levels in programming. You decide the algorithm, how to break down the problem in smaller parts, the method names, the variable names, the layout etc. There is a lot of freedom, and you get to create things almost every day. In addition, what you create is actually useful to somebody else. Plus, you get to see how all the moving parts (figuratively) interact and execute when the program runs (in a debugger, or following log statements or similar). Quite a thrill. That's why I still love programming after all these years (http://henrikwarne.com/2012/06/02/why-i-love-coding/).