Software Engineering - Layered Technology
Although various authors have developed personal definitions of software engineering, a definition given by Fritz Bauer at the seminal conference on the subject still provides a forum for discussion:
"Software engineering is the establishment and use of sound engineering principles so as to obtain economically software that is reliable and works efficiently on real machines. "
Every reader will be tempted to add further to this definition. It says very little about the technical aspects of software quality; it does not directly state the need for customer satisfaction or in-time product delivery; it omits mention of the significance of measurement and metrics; it does not tell the significance of a mature process. And yet, Bauer's definition gives us a baseline. What are the "sound engineering principles" that can be applied to computer software development? How do we "economically" construct software so that it is "reliable"? What is the requirement to develop computer programs that work "efficiently" on not one but various different "real machines"? These are the questions that persistently challenge software engineers.
The IEEE [IEE93] has developed a more complete definition when it states;
"Software Engineering (1) The application of a systematic, disciplined, quantifiable approach to the operation, development, and maintenance of software that is, the application of engineering to software. (2) The study of approaches as in (1) ".