The fiercer the struggle, the more entangling the tar, and no beast is so strong or so skillful but that he ultimately sinks.
The Programming Systems Product
How do 2 programmers in a remodeled garage build an important program that surpasses the best efforts of large teams?
A Program
Garage duos typically build a program: complete in itself, ready to be run by the author on the system on which it was developed.
A Programming Product
A programming product is a program that can be run, tested, repaired, and extended by anybody:
- Usable in many operating environments, for many sets of data.
- The range and form of inputs are generalized as much as reasonably possible
- Thoroughly tested in order to be depended upon
- Thoroughly documented so that anyone may use it, fix it, and extend it.
Costs at least 3x a debugged program with the same function.
A Programming System
A program becomes a component in a programming system: a collection of interacting programs coordinated in function and disciplined in format
- Every input and output conforms in syntax and semantics with precisely defined interfaces.
- Uses only a prescribed budget of resources - memory space, input-output devices, computer time.
- Tested with other system components, in all expected combinations.
Costs at least 3x a stand-alone program of the same function.
A Programming Systems Product
Costs 9x as much. Is the truly useful object, the intended product of most system programming efforts.
The Joys of the Craft
- The sheer joy of making things.
- The pleasure of making things that are useful to other people.
- Fascination of orchestrating complex objects playing out design principles.
- Always learning from the nonrepeating nature of the task.
- Delight of working in such a tractable medium - producing visible outputs separate from the construct itself, e.g. printouts, pictures, sounds, robotic movement.
The Woes of the Craft
- One must perform perfectly, i.e. program the requirement to perfection.
- Other people set one’s objectives, provide one’s resources, and furnish one’s information.
- Dependence on other people’s programs, which are often maldesigned, poorly implemented, incompletely delivered (no source code or test cases), and poorly documented.
- While designing grand concepts is fun, finding nitty little bugs is just work.
- Testing drags on. The last difficult bugs take more time to find than the first.
- The product appears to be obsolete upon (or before) completion.
- The obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts.
- The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.