Programming is an interesting job, because it goes in continual cycles. Each part of the cycle has its own emotion that goes with it, too.
When starting off a new project, there's a learning curve that goes with it. You're spinning up, reading code, reading technical papers, trying to figure out what the hell you're going to do. The main emotion here is puzzlement -- how is this thing going to work? What's the interface? What's the feature set? What the heck is going ON?
After that comes early implementation. In this phase, the main emotion is nervousness. You think you know how it's going to work, but there's nothing really there yet. So you're hacking madly away, trying to get enough of a skeleton in place that you can start to make it dance. Forget about getting flesh on the bones, you're just trying to come up with something that can stand up! Since you don't really know what you're doing yet, it could all still fall apart on you.
Once you're out of those woods, you're into late implementation. Here, the main emotion is adrenalin. You're charging on all cylinders, driving at full throttle. The bones are rapidly becoming enfleshinated, and you're in the zone. This is in some ways the most satisfying part of the whole cycle, because now you start to see some real results from what you've been working on.
The last phase is debugging. Here, the emotion swings wildly between frustration and relief. You're almost done... except you're not! There's a bug! Fix it, fast! OK... and on to the next test... and WHAMO, another weird bug! Grrrr. OK, got that one done... YES! IT WORKS!!! Ship it!
And then the whole cycle starts over again.
So that's my job: puzzlement, nervousness, adrenalin, frustration, and relief. Of course sometimes you take a few steps back. For example, right now I made it all the way to relief, but I'm about to backslide into nervousness. The best-case scenario, though, is when you make it to relief and then you can keep building on the code you just finished... then you have a kind of secure happy foundation under you, reassuring you that even if your current layer falls to bits in a welter of recrimination, at least you know the relief -- that fantastic sense of accomplishment that comes with writing a software machine from thin air, that has real value and usefulness -- is still out there, in the future, waiting for you.
That's what software is, to me: the promise of progress, of building on what's come before, making it better. And this emotional cycle is what it takes to make that happen. So I'll close with a word that sums it all up for me: