This was a tedious process and results were not always good. When writing functional specifications, you can never assume the person reading it fully understands all the small nuances which means you need to detail out every small thing. If you don’t do this, you will end up with a product that’s just different from what you wanted to have in the first place. Because in this case, I couldn’t interact directly with the offshore developer, we would usually go through multiple development and test cycles to reach a product which in many cases was barely acceptable.
In my view integration is either a 0 or a 1, it works, or it doesn’t. If an integration doesn’t work, it’s better to still do the manual work. The amount of errors and mess it creates is just not worth the effort.
A way of working that did work for me was working with an onshore developer. We would basically become a team with the two of us, where there was a direct link between what I envisioned and what this developer would build. This resulted in proper working integrations, but I was always dependent on a developer.
At a certain point, the onshore developer would go away (usually when the project was done) and the cycle would continue with an offshore developer which would have to maintain code written by someone else, resulting in a vicious cycle with a lot of disappointment with all parties involved.