I walk into a client not knowing their systems or their business and am expected to sit down and start writing programs. Now, sometimes this is easy sometimes it is not. If the client writes detailed specifications on what they want done and good directions on how to do that then I am fine. I can write the code, unit test and be done.
However, from time to time I get specifications that would fit on a post-it note. A former colleague at a former client put it like this, if I need more than a half sheet of paper than it is quicker and cheaper to write it on my own.
I find that to be a truism. Often time when I write spec.s I create a proof of concept program to test my design and usually just copy & paste my code (with the proviso of how my code is not a command but a suggestion and provided the coder knows what the code is supposed to do they are free to code in any way they want) into the spec. This is why a good amount of computer programming outsourcing is not going to be cost effective in the end.