My intro CS prof always told us that "The first rule of programming is.... the user is an idiot."
He's wrong. Totally, 180 degrees, wrong.
Users know what they want. They may not know all the of steps to get there, and they usually don't know all of the implications and side-effects of those steps. But they do know where they want to end up. It's the software's job to help them get there, in fact that is the one and only job of software. When a user screws up the root cause is a failure of the software to help them take the correct steps to accomplish their goals.
One might argue that there is no practical difference between a user that makes a mistake because they are an idiot and a user that makes a mistake because the application didn't help them enough. But there is a huge difference - you can't fix an idiot, but you can fix your software.
I'm not saying it's easy, in fact user interface stuff is really hard. Which, I think is one of the reasons a lot of developers take the attitude of your prof -- it is so much easier to put the responsibility somewhere else because then the developer is only responsible for "idiot-proofing" their software rather than the much harder job of designing it to enable the user.
No, the user is an idiot. I have lost track of how many times I have given the user exactly what they asked for and them say "Well, this isn't going to work at all. This isn't what I wanted". Then I reply "Yea, yea it is. In fact, here are the notes from our meetings and here is where I told you that I didn't think that this was what you wanted or needed. At that point you can see right here is where you said, and I quote "I know what I want and need, you just do what I am asking." At that point I insist on payment for the project and run to their bank to cash it.
One man's constant is another man's variable. -- A.J. Perlis