To my way of thinking, the are three essential characteristics of “a rugged, stable package”: - It is thoroughly documented, and thoroughly tested against that documentation. Documentation is a form of “contract” too – a social contract between two developers ... who will never meet, although one has now chosen to utterly rely upon the work of the other. To put the whole thing another way, the package is designed, built, and deployed as a true, industrial-strength product, that has been “purchased” even if no money has changed hands.
-
The package presents opaque objects that do not obligate you to be concerned about how they work. (Just as you do not have to be concerned if they work.) There is, in other words, “an implied warranty of merchantability and fitness to a particular purpose,” in a social sense even if not (expressly not... usually...) in a legal sense.
-
The package nevertheless provides thoughtfully-considered opportunities for subclassing and augmenting its existing functionality. In other words, the designer anticipated places where his or her predecessors might reasonably need to extend, augment, or even replace some well-definable characteristic of what “this otherwise-opaque thing” is doing... or of how it is doing it.
“Being nice to the next guy” is definitely a learned habit. When you design something that is good-enough for what you are doing now, and you deploy that to CPAN, then, “well, thank you!” But, if you design something that is really well-documented, has well-placed “user exits” where the function of the component can easily be enhanced or tweaked, and that is still well-tested in spite of that ... I guess you become a legend when you do that.
| [reply] |
Thanks for the interesting comments. Just one clarification - 'stable' in the nomenclature used in the article does not mean that something is so good that it does not need to be changed it only means that something cannot be easily changed (because so many things rely on it).
| [reply] |