A Secondary Message: Software Engineering Versus Computer Science
Many software professionals like to refer to themselves as "software engineers." Unfortunately, simply wanting our work to be considered engineering and continually saying that it is doesn't make it so. In several U.S. states, including New York and Texas [TBPE98], the term "engineer" is actually a legally reserved word. Those who inappropriately, or even inadvertently, misuse the termsuch as calling themselves a software engineerwithout meeting legally defined criteria can be subject to civil or criminal penalties. Similarly, under the law in Canada no one can call himself or herself an engineer unless licensed as such by the provincial engineering societies.
Another message in this book is the relationship between software engineering and computer science. There has been a fair amount of debate over the similarities and differences between the two. Instead of endlessly discussing opinions, we can look at "first principles"what do scientists believe it means to be a scientist and what do engineers believe it means to be an engineer?
Science is defined as [Webster94]
a department of systematized knowledge as an object of study; knowledge or a system of knowledge covering general truths or the operation of general laws esp. as obtained and tested through scientific method.
The Accreditation Board of Engineering and Technology (ABET) is the recognized authority for accrediting engineering and technology degree programs at colleges and universities in the United States. ABET defines engineering as [ABET00]
the profession in which a knowledge of the mathematical and natural sciences gained by study, experience, and practice is applied with judgment to develop ways to utilize, economically, the materials and forces of nature for the benefit of mankind.
DeGarmo et al. [DeGarmo93] paraphrase the definition of engineering as
finding the balance between what is technically feasible and what is economically acceptable.
Arthur Wellington offers a somewhat more lighthearted description [Wellington1887]:
It would be well if engineering were less generally thought of, and even defined, as the art of constructing. In a certain sense it is rather the art of not constructing; or, to define it rudely but not inaptly, it is the art of doing that well with one dollar which any bungler can do with two.
Comparing and contrasting these definitions shows that science is the pursuit of knowledge and engineering is the application of that knowledge for the benefit of people. As an example, chemistry as a science is concerned with expanding our knowledge of chemical processes so we can better understand and explain phenomena observed in the universe. Chemical engineering, on the other hand, applies the knowledge derived from this "chemical science" to filling human needs. At the core of chemical engineering is an understanding of the body of chemical theory. In addition, chemical engineering calls upon the practical aspects of chemical processes, such as the design of pressure vessels and waste-heat removal mechanisms, together with the use of engineering economy as the basis for decisions.
The science branch and the engineering branch of a technical discipline are related but distinct. The science branch is concerned with expanding the body of theoretical knowledge about that discipline, whereas the engineering branch is concerned with the practical and economical application of that theoretical knowledge. The following equation is a simplified description of the general relationship between science and engineering:
Engineering = Scientific theory + Practice + Engineering economy
People who are recognized engineers (for instance, civil, mechanical, chemical, aeronautical) are usually required to take a course in engineering economy as part of their undergraduate education.
Based on the dictionary definition of science, above, computer science can be defined as
a department of systematized knowledge about computing as an object of study; a system of knowledge covering general truths or the operation of general laws of computing esp. as obtained and tested through scientific method.
Based on the ABET definition of engineering, software engineering can be defined as
the profession in which a knowledge of the mathematical and computing sciences gained by study, experience, and practice is applied with judgment to develop ways to utilize, economically, computing systems for the benefit of mankind.
So, from the equation above we can derive
Software engineering = Computer science + Practice + Engineering economy
Both computer science and software engineering deal with computers, computing, and software. The science of computing, as a body of knowledge, is at the core of both. Computer science is concerned with computers, computing, and software as a system of knowledge, together with expanding that knowledge. Software engineering, on the other hand, should be concerned with the application of computers, computing, and software to practical purposes, specifically the design, construction, and operation of efficient and economical computing systems.
The software industry as a whole has shown movement, albeit slow, toward becoming a legitimate engineering discipline: true software engineering. For that transition to fully take place, software professionals will need to learn aboutand useengineering economy as the basis for their technical decisions. This book is an engineering economy reference book for software professionals. It covers the same topics as would be found in its typical industrial engineering counterpart. Largely, only the examples have been translated into a software context.
Lack of engineering economy isn't the only issue preventing software from being generally recognized as a legitimate engineering discipline. For other perspectives on this topic see, for example, [Hooten90], [McConnell03], [Shaw90], and [SWEBOK01].
There will always be a need for qualified computer scientists to continue the advancement of computing theory. To be sure, every recognized engineering discipline has a corresponding science that is populated by dedicated researchers. The computer science curriculum is appropriate for meeting this need. But the software industry also has a distinct need for [Ford91]
a practitioner who will be able to rapidly assume a position of substantial responsibility in an organization.
Providing those qualified practitioners should be the primary goal of software engineering education.