I had been tasked with managing a project which was outsourced to some Ukrainian developers.
The company hired them through Elance at a fixed price. At that point my boss left me alone to handle them and get the work done. I created a detailed specification of the complete thing that needed to be done.
The project involved dealing with such things as XMPP, RabbitMQ, and Database. In my first meeting with them (always IM) I explained thoroughly what they needed to do. They seemed to understand it -- and they were very confident that it would be done easily.
So far so good. But after one week, when we met again, they were full of misunderstandings about what needed to be done. When I asked one of the developers if he knew XMPP, he said he was working with it for the first time. At our first meeting I'd very specifically mentioned the complexity of the project and the technologies involved. Plus, I had repeatedly asked them to write a functional specification of exactly HOW they would do it. But they said NO, and insisted that they would rather write the code. I said OK.
The project completed after 3 weeks and they delivered what was needed. At that point I started to review the code. It was okay for the most part, but there ware some important problems:
- they hard-coded some of the things that needed to be separated out into a config file
- there were multiple config files that I needed to be consolidated in one
- they wrote absolutely NO documentation
- some other minor changes
I asked them to make these changes (except documentation) -- And, we had an argument.
They said, since the price was fixed, I was being unfair in asking them to make any changes once they completed the working code. That they had worked for unreasonable amount of time on the project and now it was completely wrong to ask for anything.
Finally now they have made the changes, and the project is over. But it leaves some questions in my mind...
They did what was needed but I needed it properly done, and hence the changes. was I really unfair?
Why did I agree on letting them code without having a functional specification?
Why did I not make sure that they understood everything the first time?
Does anyone find themself in the same position? Do you think there is a better way to manage outsourced projects?
-- UPDATE --
Thanks for all the opinions -- after reflecting upon entire experience, I can conclude...
Although I wasn't vague in the specifications from my side, I certainly didn't make them ironclad as suggested. So the take away is: always be as much specific as possible -- read your specs from their perspective too and see if you missed something. Repeat it at least three times.
Just specifying what the code should do it not enough. You must specify what the code is supposed to look like. What the directory structure will be; even the file names if possible. This will save you from lot of annoyance later. Strictly specify the coding guidelines, variable naming conventions, internal documentation format, etc. See to it that they abide by those guidelines, and if not, scream.
Demand a functional specification from their side -- insist that it be written before any code. This will get a lot of confusions and misunderstandings out of the way.
Review the code as it is being developed so that you identify the anomalies earlier and get them corrected. Talk to them at least once every other day.
Lastly, try to make a good rapport with them. Make them feel that you appreciate their work. Don't push them exaggeratedly to fit your guidelines -- instead request them to do so and tell them that it would make maintaining the code so much easier for you once they complete the project.