I have customers who ask “When will the software be finished?”. I have more experienced customers who ask “When will the software be ready to use?”. The previous posting was heading to the conclusion that software is very very rarely actually “finished”.
You need a bit of software. So it must be doing some kind of useful task. Parts of the software may very well be useful in the future (even as part of a solution to a completely different task).
It’s a failure for all concerned if software has to be consigned to the “Recycle Bin” because it has become “so tangled and uncontrolled that it is no longer maintainable or useful” . If you are investing your time (or your money to pay for someone elses time) you want your investment to be worth while. This is achieved by taking time out to plan how to avoid “case b)” and to design according to you plans.
Do use Unit Tests.
Do think about how you are going to test the overall software operation (and document this).
Do use sensible function and variable names
Do keep your documentation up to date.
Never to a quick fix “because the software is basically finished”. Never think software is finished.
I have customers who ask “When will the software be finished?”. I have more experienced customers who ask “When will the software be ready to use?”.
Having been writing software since the days of the Motorola M6800 (Motorola’s first microprocessor, programmed in assembly language) I have completed many contracts. As a business I have to also ask “When can we invoice for the software we have written?”. But I can’t think of many software projects that were genuinely “finished”.
Software seems to come to an end when either
a) The use for the system the software is running on disappears.
b) The development of the software has become so tangled and uncontrolled that it is no longer maintainable or useful.
If you take case a) this actually rarely means the software is “finished”. Even in those early 100% assembly code projects that I did later versions of Motorola microprocessors were assembly code compatible with earlier versions (most successful being the upgrade from the M6800 to the M6809 family). Even assembly language that is not of the same family can often be manually ported across to a different CPU if it was originally well written and well commented.
The key to good software is that it must be easy to re-use. You will find it very hard to stay in business if you try to write everything from scratch. If this goal can be achieved then case a) above becomes suprisingly rare. Trying to think of an example where an actual system disappears completely is hard. Perhaps, if the oil runs out and we can’t get any fuel for any internal combustion engine then all the engine management software out there might genuinely be “finished”…..
So that means that case b) is the most common reason for software being “finished”. Case b) must be avoidable in all cases (provided there is awareness of the need to avoid it).
More to follow in next posting.