In 1992 Jack Reeves published an essay What Is Software Design? in the C++ Journal.

His basic premise is: "that final source code is the real software design."

He goes on to explain…

"The final goal of any engineering activity is some type of documentation. When a design effort is complete, the design documentation is turned over to the manufacturing team. This is a completely different group with completely different skills from the design team. If the design documents truly represent a complete design, the manufacturing team can proceed to build the product. In fact, they can proceed to build lots of the product, all without any further intervention of the designers. After reviewing the software development life cycle as I understood it, I concluded that the only software documentation that actually seems to satisfy the criteria of an engineering design is the source code listings."

Before you respond prematurely, check out his follow up essay What Is Software Design: 13 Years Later

The venerable c2.com wiki also has some interesting insights and commentary from luminaries such as Ron Jeffries and Michael Feathers.

"Designing software is an exercise in managing complexity. The complexity exists within the software design itself, within the software organization of the company, and within the industry as a whole. Software design is very similar to systems design. It can span multiple technologies and often involves multiple sub-disciplines. Software specifications tend to be fluid, and change rapidly and often, usually while the design process is still going on. Software development teams also tend to be fluid, likewise often changing in the middle of the design process. In many ways, software bears more resemblance to complex social or organic systems than to hardware. All of this makes software design a difficult and error prone process. None of this is original thinking, but almost 30 years after the software engineering revolution began, software development is still seen as an undisciplined art compared to other engineering professions."

Michael Feathers breaks down the article into a great summary, from the c2.com wiki:

  • Software runs on computers. It is a sequence of ones and zeros. Software is not a program listing.
  • A program listing is a document that represents a software design. Compilers, linkers, and interpreters actually build (manufacture) software.
  • Software is very cheap to build. You just press a button.
  • Software is expensive to design because it is complicated and all phases of the development cycle are part of the design process.
  • Programming is a design activity; a good software design process recognizes this and does not hesitate to code when coding makes sense.
  • Coding actually makes sense more often than believed. Often the process of rendering the design in code will reveal oversights and the need for more design effort. The earlier this happens, the better.
  • Testing and debugging are design activities - they are the equivalents of design validation and refinement in other engineering disciplines. They can not be short changed.
  • Formal validation methods are not of much use because it is cheaper to build software and test it than to prove it.

Join the disccussion on Facebook in Programming Philosophy