Alan Cooper has published and excellent article on why the results of software projects are so unpredictable. His point is that there are two types of programmers -- design engineers who like to design elegant solutions to problems and production engineers who want to develop code that is rock solid and able to be used by the wider public.
The problem, as Cooper sees it, is that both 'engineers' use the same medium for expression -- source code. This is different than other disciplines, like bridge building, where designers use paper and computers and production folk use iron, bricks, concrete, etc. When you use the same medium it's tough to differentiate whether you're doing design or production work, which leads to problems.
The article is part 1 of 2, so I hope part 2 talks about how to better split up the roles, because I think he's made a really good point. I've certainly been in situations when we thought we were done the 'production engineering' when in reality we had only really completed the design (in working code form.) We just launched it anyway and were surprised when the results were less than expected.
If any Agile Programmers are reading this -- how does Cooper's article line up with your experience?