I always like to play Devil's Advocate whenever a group of coders gets in an uproar like in this thread. I was a PM in a former life, so yes, I recognize the importance of spelling out every last little fucking detail to a coder. I will also say how extremely fucking difficult it is to work with programmers sometimes. It's cool. I realize that there are a wide range of jobs available for you as a coder. You don't need my money, etc.
That being said, the coder also has a responsibility to set client expectations throughout the project. If you are working with someone who is obviously new or does not have technical expertise, it is your job to inform them what it is going to take to get the job done. Give a reasonable estimate on costs and time, and then follow up on that estimate throughout the project. There is something called contingency- you should bake into your estimate extra hours for dealing with the customer or adding new things. If the scope isn't clearly defined by the customer at the beginning, either don't accept the job, or help them define the scope. Or, tell them that any additional work outside of the scope will cost $X/hour. If the client can't deal with that, tell them to fuck off and don't accept the project.
I have been on the hiring side many times, and while I have thought before that I spelled out every possible detail on an SOW, I may have overlooked something once in a while. It happens. It's not because I'm a fucking retard and expect you to do this work for free.
Communication is key, and I find that it is something that a lot of developers simply don't do well.
#realtalk