What does software engineering mean? It sure isn't computer science, since the theoretic departments there are not concerned with practical implementation. It isn't real engineering, since nothing physical comes out of the process. Telling what it is not is no definition, though. How can it be defined?

One of the early pioneers is Barry W. Boehm. He wrote the book on software engineering and his definition goes like this:

The practical application of scientific knowledge in the design and construction of computer programs and the associated documentation required to develop, operate, and maintain them. ―Boehm

Design and construction of programs is essential, since it is about software engineering. I don't think documentation is a goal of software engineering though, but a tool to get the job done more effectively. This definition also lacks the human aspect of the process.

Another definition by David Parnas, who developed the concept of information hiding module design which is the foundation of object oriented programming today:

Software engineering is programming under at least one of the following two conditions (a) More than one person is involved in the construction and/or use of the programs and (b) more than one version of the program will be produced ―Parnas

This just rules out the development of one-off scripts, so pretty much everything programming is software engineering by this definition, which seems a little bit too general to me. Some program, which were developed under curcumstances that fit Parnas' description, don't look engineered at all.

There there is Richard E. Fairley.

Software engineering is the technological and managerial discipline concerned with the systematic production and maintenance of software products that are developed and modified on time and within cost estimates. ―Fairley

This includes managerial tasks and shifts the focus a little to the people doing the engineering. The biggest problem of creating programs is that humans make mistakes or are not intelligent enough. Most of the tools, like version control or IDEs, are needed because of our inabilities. Programmers love simplicity in their tools; sometimes even more than power. So human nature is an important aspect of software engineering.

I conclude that the core question of software engineering is how humans can develop the right software fast, cheap and in high-quality? This question has five components:

To conclude this musing i present my definition:

Software engineering is about how humans can develop the right software fast, cheap and in high-quality.

© 2009-01-17