http://www.amazon.com/gp/blog/post/PLNK2DYCU7ANMP5E6
This comment hit it on the nose:
"In my experience, the most challenging thing about programming is the need to switch my attention up and down the abstraction stack. Make sure the user interaction makes sense; make sure the OO design contracts are fulfilled; make sure the bytes flow smoothly at a low level; all at the same time.
Programmers who can't do this well have real trouble. I have trouble when I can't do this, either because of lack of knowledge or fatigue. And much of the art of software architecture is minimizing the number of levels that need to be tracked; that's one reason (for instance) programming languages without GC are on the decline."