CSMN - 658 - 1131: Software Reliability and Reuse

Implementing Software Reuse


David R. Mapes


Developing software is a complex, time consuming, difficult, and risky process. The complexity stems from several factors that combine to make the process one of the more difficult things humans do. These factors include the problems involved in identifying and defining the required functionality of a system in a way that allows the developer to proceed to design and coding on the one hand, and on the other from the fact that any software is either an attempt to model a human activity in a conceptual language that the computer can interpret, or it is an attempt to model some behavior that humans would never otherwise be able to accomplish. Whether the problem consisted of automating an inventory system or creating a laser targeting system, the computer code that embodies the identified requirements is merely a plan the computer can follow in attempting to accomplish its assigned task, and like any plan, the code seldom survives contact with the "enemy" (i.e. the real world) completely unscathed. Most real world systems have variables and exceptions that are difficult even for domain experts to identify and when a software professional tries to identify or elicit requirements for a system it is seldom from that perspective. For this reason it is wise even from the outset to identify and reuse the applicable products of previous development efforts. Reuse of previously developed components helps to reduce the perceived complexity, shorten development time, and reduce the risk of failure by bringing more known elements to the development process. In the author's experience these benefits can accrue even in an ad hoc environment with little formal support from management, process or tools.

Reuse has great potential to enhance the development process because it helps address and simplify some of the central problems of software development. In his article No silver bullet: Essence and accidents of software engineering Brooks lists four essential elements that conspire to make developing software difficult: