Thomas A. Alspaugh

Under Construction

Software is composed of modules, perhaps developed by the same person or team or (more probably) developed by several teams who may or may not coordinate their work. Each module's users know its interface but not its implementation. The modules are connected (through their interfaces) to each other in a specific configuration, the software's architecture. All of these can be changing: a module's implementation, a module's interface, and how it is connected to other modules. How does software evolve?


Figure 1. Evolution, represented by red arrows.

  1. A module's implementation can change or be replaced.
  2. A module's interface can change or be replaced.
  3. The module's connections to other modules can change.
  4. Two or more of the above can happen at once.
  1. A module's interface and implementation may evolve together or independently.
    1. The implementation may be refactored or otherwise changed to meet developmental quality goals, without changing the module interface.
    2. The interface may evolve in a way that the module implementer foresaw and prepared for, or that fortuitously is met by the existing implementation, so that the implementation does not change.
    3. Both the interface and the implementation may evolve.
  2. A system or subsystem's interface, module configuration, and its component modules may evolve together or independently.
    1. The (sub)system's interface may evolve in a way that doesn't require the implementation to change.
    2. The configuration in which its modules are connected together may evolve in a way that doesn't affect the subsystem interface.
    3. A module may be replaced by another with the same interface.
    4. A module may be replaced by another with a different interface.
    5. A module's interface and/or implementation may evolve as descxribed above.
    6. Some combination of these, or all of them, may occur together.

    Changes to a module's implementation that do not affect its interface have no effect on the modules connected to it or the subsystem in which it forms a part. Changes that affect a module's interface propagate outwards, affecting other modules and/or the configuration in which they are connected.

The typical case involves a change to the module's interface and the evolution of its implementation to match; or a change to the (sub)system's interface and some combination of module replacement, rearrangement of modules in a new configuration, and changes to a module's interface and implementation.


Figure 2. An increment in the evolution of a (sub)system.
Evolution of a single component follows the same pattern,
only without Rearrangement of components.

Figure 2 illustrates the possible paths from one development state of a system, subsystem, or module, to the next increment in its evolution.

flip bgunflip