From my perspective as a software tester, fag packet specs are most of the problem.
As systems get more complex, you can't just let a programmer sit down, devise a system and then write it how they want to, because programmers are not the best people to decide things like this - they certainly are'nt going to be able to sit down with a customer, and work out exactly what and how the system is going to do its task, and they are almost all shit at documenting what they produce (many write stuff in such a way that its indecipherable, because they figure that it safeguards their job if no-one can understand what they produce)
A lot of the old skool programmers bitch and moan about this, because their creativity is being stifled and they are having to work from specs that tell them exactly what to do.
Developers can continue to moan about the fact that they are having to work within some kind of organisation structure and do things a certain way, but these things are there to try and produce a solution that the client wants, not what a programmer thought they wanted

Saying that, I find working in IT soulless and massively dissatisfying, compare to doing stuff like carework (which I did before I got into IT). At least with carework I felt like I was doing some good, and making a difference in peoples lives.
However, IT pays much more and has better working hours, so I shall stick with being miserable and in a soul destroying job, knowing I can waltz out of there at 5.30 each week day and not have to think about anything but how to spend my money (or how my missus will spend my money anyway)