(Some ideas gleaned from 5 small specs that were outsourced to an overseas programmer)
1. Always keep an idea as to how much time it would take to do it yourself and make sure the time and effort it takes to write it down and discuss it is worth it.
Example: I outsourced a project because it shouldn't have taken that much time but I didn't have that time. When our O/S company told me they hadn't done it yet (see next point), I had to put the time in. As it turns out, it only took me an hour to fulfill the functionality. Now I have testing to do but it really only took a little bit of time. I easily wasted that hour with emails asking about its status. (Note: the hour to spec it was worthwhile because it ensures the functionality is documented)2. Only give away ONE task at a time. They might complain that there is a lag between the work but it's the only way to ensure prompt delivery of stuff.
Example: Our O/S company had a project spec for over 2 weeks yet when I asked where they were, they said "it's coming". Then I find out they hadn't even touched it yet. As a result, the client started screaming for it and I had to put in the time to do it myself.3. Be 100% specific. Be ready for the company to come back and say "it wasn't in the spec" as a way of getting out of completing stuff. Many companies are willing to make minor changes but changes that are more "creative" can sometimes lead to problems.4. Tell them how you plan on testing it. This gives a much better scope for their final work because it has to actually DO it when you test it.5. Put down a timeline. See #2 for reasoning but if you give them a timeline, you can actually hold back funds if they don't provide the work for you.