About a year ago my team has done a site MyActivityMatch.
One can use it to find who to play sports with.
The system has a rather complex search algorythm - it takes into account geographic location, distance, date, time (hours or a day part like "morning"), time zone, sport type, skill.
I underestimated the complexity, defined the lower price then it deserves, and entrusted the developement to an employee of mine, a good person and a good programmer, but not too experienced with the complex solutions at that time.
After a while it came out that the system works slowlier then expected.
Some bottlenecks were fixed close after launch and the site continued to work.
Some time ago the customer ordered the modification of the system.
Being knowledgeable about the complexity I took the work myself and started to solve each of the problems I saw, one after another.
Couple of days ago, after several months of fighting with problems, I faced an unexpected issue - the database contains many duplicating records. ID of the records are different, but the data is the same.
It's not a bug, it does not break anything. It just makes the system slowlier.
I call it a system design error. The developer did not foresee the interactivity of elements and modules. He coded the solution per specification - and did it good!
Whose fault is it, who is responsible? Me and the customer are.
Me - because I incorrectly positioned the project and provided the solution with a logical issue. Now I have to waste time to rewrite parts of it from sketch.
Yes, I kept the budget and fulfilled the contract per specification.
But is it what the customer wants?
Customer - cause actually everything in the project is his responsibility.
He did not provide any requirements for the performance and inner structure, never discussed anything, ignored any offers and was just holding the idea to get the cheap solution of the complex project.
A consequence I made for myself: Do not avoid system design, as you don't avoid the layout design, accept it's value and cost.
There are thousands of people ready to help a customer spend his money, but I want to do something valuable besides cash.
I hope I won't get into such pitfalls in the future.
At least during last year I havn't - I set the adequate price for my work and provide the really good solutions.
One can't make a million dollars by paying a couple of thousands, doing nothing and expecting a cool programmer will code something great. I don't even understand why so many people expect this :)