-- Thomas Edison.
I love programming - the act of creating a working piece of great code out of nothing.
Sometimes it's easy. No matter how hard the problem is you can see how to solve it, and you can intuitively construct a beautiful solution. It's like the problem just solves itself in front of you. Wonderful.
Often it's not that simple, and you have to work at the problem. That's when it gets really rewarding. You have to tax your mental faculties and stretch your abilities. There are some hard tradeoffs to make and some tricky design decisions. But, eventually you emerge out of the dark tunnel with a functioning piece of software and a warm fuzzy feeling. And you've learnt some interesting stuff on the journey, ready for next time.
However, sometimes it's not mere hard sailing. It's downright disastrous. The world conspires against you. You have to wrestle with problems outside of your control. Or, worse, multiple problems outside your control. It hurts. This might be rewarding work, too, but at the time it feels like your reward will be in heaven.
That's just where we've been recently. We've been fighting with a software release for a new piece of hardware. We didn't expect it to be a quick job, but we had no idea how nasty the release would turn out. We've been wrestling with non-functioning hardware, buggy drivers, bad operating system protocol stacks, you name it. Just when we thought we'd be really unlucky to hit another bug, along came another tedious (and hard to track) problem. Really, really painful stuff.
The interesting thing is that our main application software was blameless. We have rigourous unit tests and good coding practices that have ensured that it works pretty well. So unit tests are annoying: they remove all of the easy-to-fix problems, and force you to waste your time banging your head against really nasty things instead.
I hope that we finally have got it sorted now, as I'm off to Uganda tomorrow. But that's another story...