[1] The context switch: you are constantly switching between tasks (especially if programming is only one of the jobs you do). Each time you come back to your programming task, you have to remember what you were doing, how you were doing it and what you actually intended to do at the end of it.
[2] The library/control/feature you are trying to use doesn't work as advertised: You then have to spend time trawling blogs, forums, and yes, even documentation, to try and find out what magic word you forgot to incant!
[3] You have forgotten how you did it before: the thing design patterns were supposed to fix (ha!) but each time you implement that particular trick feature, you have forgotten how you did and worse still, where you did it last so that you can copy it.
[4] You are coding with someone else on the same project: so why did they set up that table in that way???
[5] Procrastination: each time you do [1],[2], [3] (and possibly each of the others) you get side-tracked on the web reading the news or finding out how to do some unrelated feature.
[6] To do the feature you want to add, you have to change the way everything else works: yes, I know, this was what design (and yes, don't make me laugh, UML) was supposed to fix - but as they say, you don't know until you find out.
[7] Ajax: everything has to work like gmail.
[8] Visual Studio/Windows: when it decides it has had enough and simply stops working or forces your computer to arrive at the same conclusion.
[9] Boredom: you have had enough of this particular project and wished you were back doing open source where there were no deadlines and no users complaining.
[10] The rest of life: meetings, writing reports, and yes, a little r & r.