James Gosling recently described 2 types of development tasks. I like the description. I couldn't see any way to link directly to the post, so I'll drop it in here as an excerpt.
I've had conversations with several folks in the last couple of days about the craft of software engineering. There are all sorts of ways to slice it up, but one that I find useful in some situations is to divide programming tasks rather crudely into two categories: mud slinging and diamond cutting.
Mud slinging is where what to do is pretty clear. You just wade in and start shoveling. You don't have to think to hard and you get to feel real productive because lots of motion is happening. I often feel like most of what I do is in this category. It's not too hard, it needs to get done, Just Do It. I find that it has a personally satisfying rhythm. Relaxing, low stress, regular progress. Lots of lines of code cranked out.
Then there's diamond cutting. This is where you stare and stare at a problem, and then whack! it breaks open. Not much coding gets done. I find it really frustrating. Why can't I figure it out? Why? What? How? Sorting socks would be more fun. High stress. But then, it hits me. A dozen quick lines of code and poof, hard problem solved. It's a real rush. High dynamic range in emotional state.
Of course, it's impossible to tell the difference between true diamond cutting and generic cluelessness.