Does "Modularization" ring a bell?
A well written, larger program should consist of essentially freestanding modules.
Modules can be created and saved as separate programs. They would not be expected to run although they might... however, they are just pieces of the puzzle.
The completed version of one particular program might contain modules "A-1", "B-1", "C-1",...
The completed version of a similar program might contain modules "A-1", "B-3", "C-2",...
"A-#", "B-#" and "C-#" represent modules controlling their respective components. "B-2" represents the second version of Module-B. By the way, you don't have to have a "B" module... you could just as easily have a system with "A-2", "C-3", "G-2",... that is, if the physical nature of the system will allow.
You build a program by pasting copies of the appropriate modules from your library of modules into your program. First you get your "A", then you get your "B",... etc.
"Flags" are used to connect the modules. These flags provide communication between the modules. There needs to be a Standard on what flags are needed, how they are used and by whom. To a large extent, this is determined by the "neighbor modules".
Then, as Tom indicated, you can develop an order from the list of modules and build to order. Of course, there is always a new module in the making for those special orders. Having made the new module for the special order, the new module simply becomes another module in the library.
It's an easy plan to describe... but, it is a hard plan to stick to without discipline.
But, when it comes to updating a program with a new module... piece of cake!
Block & Cut... remove the old module
Block & Copy... get a copy of the new module from the library
Paste... paste the new module in where the old module was.
Tidy up a few flags, update the module list for the particular machine and you are done.
If the new program looks like it's gonna be one of your mainstays, then give that particular list of modules a new part number. Now it's one of your "standard programs".
Maintain an updated list of customer systems containing the list of modules in each system.
You might then consider determining upgrade charges based on the difference between the existing system and the desired system. At least, knowing what the existing system is will give you a clue as to what it's gonna take to bring the system up to date.
There are a million ways to bring order into any system. However, there are only an infinite number of immutable forces that seem to prefer chaos over order.
BTW, regarding the Bug-Trap, I should have mentioned the counters. I have many of these installed for "bug-trapping"... mostly to keep the production-folk honest.
(225)