Building an application (especiallly from scratch) can be painful for the developer. There are many problems to face, from finding workarounds for unsupported operations, to making sure the wishes of the customer have been satisfied.
But the development process can also be painful for the customer himself. On mid-to-long term projects (ie more than a couple of days’ worth of code), he might see unfinished versions that crash all the time (or do nothing useful), be asked questions that are either unintelligible or plain stupid (from his point of view), and wait for the Creation to emerge from a coder’s brain, a subspecies known for being cahotic and unfathomable.
The reason why we know we will be victorious lies in the fact that we have an in-depth understanding of the computer and its innards, or should I say we have an understanding with the computer. Having worked a bit on Larry Yaeger’s Polyworld, I have a certainty : the computer has a very strong will for a so-called “machine” ;)
Writing a computer program is a lot like teaching a trick to some intelligent animal : once the trick has been assimilated, there’s a 99% chance that it will be performed spotlessly. However, change the context, the way the order is given, or the things it eats, and you might have unsuspected results.
However, the good thing about a computer, as opposed to an animal, is that we know a lot of things about the context. We can even control it in some ways, or make sure the context is always roughly the same. That is why we are pretty confident in our skills.
Yes, we do seem overconfident. And yes, we create programs that we are sure will work, within certain parameters. Otherwise, it’s no use trying.
So don’t worry. It will work, for a given value of “work”. If you want it to work backwards, while playing the flute, and underwater, you’d better say it upfront. Defining the context and the goals is your job. Ours is to make sure the computer complies.