Software Engineering
Home Planning Requirements Writing Hazard Analysis Requirement Analysis Config Control Software Design Software Testing Software Standards Basic Logic

Software Design - Goals

  • Manage Complexity.
  • Maintainability.
  • Extensibility.
  • Reusability.
  • Portability.

The hardest part of building software is the specification, design, and testing of the conceptual construct – not the task of coding and testing the actual program.

The most expensive software defects occur during requirements and design, not coding.

- Conway's Law -

“Organizations which design systems are constrained to produce systems which are copies of the communication structures of those organizations.”

Program complexity is non-linear.

(Qtd in Brooks, Frederick P, Jr. The Mythical Man-Month.)

Source of Program Complexity

As more modules are added, the number of possible interactions and communication paths increases at a faster rate than the number of modules. Therefore, program complexity grows in a non-linear fashion. In a complex program, the behavior the user sees is determined more by the communication paths between modules (the integration) than by the functions of the modules themselves. The System's Analyst (or Software Architect) has to be responsible for the System interaction.

This is also why Object-Oriented Design works so well. It focuses on the interfaces and interactions between modules, making it possible to build more complex systems.

Conway's Law Happens

Most often, the task is partitioned among the available developers, using functional decomposition (e.g. "Joe likes to do user interfaces and Mary likes the database stuff."). Modules are designed to match the staffing, not to a conscious design. The design emerges, rather than being planned in advance, because the focus is on dividing the work among the team members - not on designing objects and interfaces. Module interfaces and communication grow to match the developers interfaces.