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:
- humans - it's about making people do it right despite human nature. This includes things like version control, documentation, or project management.
- right - what to develop is no easy question, because it involves converting vague requirements into unambigious code. This includes stuff like requirements analysis and architecture.
- fast - time to market and design iteration speed are of great worth.
- cheap - it's a moral obligation to use resources responsible and clients always like saving money.
- high-quality - nobody likes crashing software or working around faults. This includes stuff like verification and unit tests.
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.