[an error occurred while processing this directive]

The Nature of Software Engineering

To understand the nature of software engineering it is helpful to understand the nature of engineering in general. Engineering has its roots in two important human activities: sciences and crafts. The next two sections describe the nature of these activities. The section after that describes the nature of engineering in terms of its conceptual relationships with sciences and crafts. The last section discusses characteristics of software engineering that are not common to all engineering disciplines.


A science is a body of causal knowledge about a subject matter, organized into theories. The theories provide explanations of relationships between characteristics of objects covered by the subject matter and the behavior of those objects. Scientific understanding begins with an understanding how things behave. Later, a science focuses more on why they behave as they do. In some areas of science, this understanding can be used to predict behavior, leading to a utilitarian value for science. However, a well developed science has a core which is concerned with understanding for its own sake.

The human mind does not deal well with a large collection of facts. In order to serve human needs, the facts must be organized into theories, with a single theory encompassing and explaining a large number of facts. Often, a good explanation requires new concepts. Although our perception is the ultimate source of knowledge, the primitive perceptual concepts may be only indirect indications of factors that cause changes. New concepts identify those factors.

Most sciences attempt a quantification of the relevent concepts if it is practical. In some well-developed sciences, such as physics and chemistry, the quantification plays a central role, resulting in a methematical theory at the heart of the science. In some areas of science, such as evolutionary theory in biology, measurement is not always practical and the mathematical theory is not very well developed.

Practicing a science is a creative effort. Creativity is an important quality that distinguishes expert scientists from average scientists. It takes imagination to put facts together in a way that makes sense. It takes imagination to develop concepts that have explanatory power.


A craft is concened with the production of a type of product. In some cases, a craft is also concerned with maintenance of the products. Like a science, a craft involves a body of knowledge. In part the knowledge concerns the behavior of the products and their constituents.

In addition, a craft requires the development of tools and techniques involved in production. This implies a second type of knowledge. This is the "know how" of a craft - skills involved in the use of the tools and techniques.

Finally, a product is produced for its value. The value of a product may be asthetic - it is valued as an end itself, or it may be utilitarian - it is a means to another end. In either case, practicing a craft requires a knowledge of values and means for achieving them. However, knowledge by itself does not ensure achievement of value. Practice is needed to develop habits in the use of the tools and techniques. These habits partially automate the achievement of value, freeing the mind to deal with more complex issues that may arise. The knowledge of values together with the practiced habits make up the work ethics of a craft.

As in science, quantification may be important in a craft. The quantification of physical properties of raw materials may be essential in the construction of a finished product. However, a full-blown mathematical theory is usually not needed.

As in science, practicing a craft is a creative effort, and creativity is an important quality that distingushes expert practitioners from average practitioners. It takes imagination to put raw materials together in new ways to create a product of value. It takes imagination to use tools and techniques in new ways to enhance the value of the product.


Conceptually, engineering disciplines arise from crafts as their knowledge bases evolve into sciences. The reasons for and impact of this evolution are described in this section. The presentation is not intended to be historically correct. It is approximately correct for civil engineering, but other engineering disciplines vary considerable from the pattern. In spite of historical differences, different engineering disciplines deal with similar problems and those problems have a similar effect on the end result.

If a craft is producing a utilitarian product then there is a demand for greater functionality of the product, higher quality in the product, and greater quantities of the product. Meeting these demands results in more complexity in the product, or in the production process, or both. In order to deal with the increased demands and greater complexity, a craft must change in three important ways.

First of all, in the early stages of development of a craft, understanding how things behave is of primary importance; understanding why is of secondary importance. With more complex products and production processes, just knowing how things behave is not sufficient. There is also an increased need for understanding causal relationships - the answers to "why" questions. The answers to these questions often have predictive power that is essential for developing new techniques and methodologies of design and production. When the knowledge about the behavior of the product and it constituents is well-developed, it becomes a science.

Second, producing products with greater functionality or higher quality requires a greater understanding of values. This leads to a value theory that deals with factors involved in the quality of a product, means for quantifying the factors, concepts that identify controllable characteristics of a product that affect its quality, and principles that focus attention on important value-related product design issues. The work ethics deals with deeper causal issues: causes that affect value. When the work ethics of the craft is well-developed, it also becomes a science.

Third, production of complex products, large quantities of products, and more functional products all require a significant amount of planning. When the product is complex or the product has greater functionality, planning focuses on designing the product. When large quantities of a product are produced, the planning focuses on designing a production process. In some cases, a significant effort is needed for designing both the product and its production process. The magnitude of this effort may require that the people involved develop specialized skills. Some continue with the actual production, others are involved in the design of products and production processes. Those that are involved in the design become a part of a new discipline - an engineering discipline.

An engineering discipline builds on the same knowledge bases as a craft, but they have matured into sciences. An engineering discipline also has tools and techniques as does a craft. However, these tools and techniques are developed within the engineering discipline more as aids to design rather than production. As in a craft, practice is needed to develop habits in their use. The partial automation of the achievement of values is of even greater importance because an engineer has more complex issues to deal with. The knowledge of values together with the practiced habits make up the work ethics of an engineering discipline.

Production of complex products adds another new dimension to the task of an engineer. Production of complex products requires the use of teams of engineers to do the design. When dealing with a lot of people, it is important to have a well-defined design process. It is also important to have a management structure to guide people through the process, identify risks involved, and allocate necessary resources. To manage effectively, the managers must themselves have an understanding of the engineering discipline. Managers of a design process are usually engineers with substantial experience in design. To prepare engineers for this role, management is an important part of engineering education.

Software Engineering

Part of the nature of software engineering is implied by its classification as an engineering discipline. This section discusses some of its unique characteristics and problems. Uniqueness here does not imply that the characteristics and problems cannot be found in other engineering disciplines. It only means that they are not common to all engineering disciplines, or significantly more important in software engineering.

The various engineering disciplines are distinguished by the type of product and/or the type of constituents that form the raw material for the product. Software engineering is characterized by its primary product, which is software - programs that direct a computer to perform some task. In software engineering, there is a well developed science, computer science, that covers, among other things, concepts of programming languages, algorithms, data structures, and important aspects of hardware systems and systems software. Many of the subject areas of computer science deal with software products. Because of this, the boundary between computer science and software engineering is difficult to define. In particular, the values of software engineering are an important element of computer science.

In some engineering disciplines where production in large quantities is an objective, the quantities introduce a great deal of complexity into the production process. Reproducing software is relatively easy, once it has been designed. The engineering problems that do arise are also of a very different nature than the software design problems. They are problems that are handled by other engineering disciplines. Software engineering is concerned almost exclusively with the design of the product and not the production process.

Although there is a clear-cut category that describes the product of software engineering, the functionality of that product is extremely broad. One indication of this is the fact that any engineering process could automated so that it becomes, in part, a software engineering project. More generally, software can be applied towards the automation of any human task. This has two important consequences.

First, there is no single domain of knowledge that covers the behavior of all software products. Software engineering does not have a single body of theory that tells us how to specify and measure the behavior of its products. Computer science deals with the components of software and some of the tools and techniques involved in its construction, but does not and cannot deal with all of the kinds of behavior exhibited by software.

Second, the values of software engineering are driven by customers who have an unlimited range of needs. A classification of the wide range of values is a virtually impossible task. Even where there are common values, they vary considerably in importance. A value that is unimportant in one software product may be crucial in another. For these reasons, the ethical and value-oriented side of software engineering takes on a more prominent role.

The extensive variety of software functionality and values can be dealt with in three ways. First, software engineers can specialize. To some extent this has already happened. There are some software development firms, for example, that specialize in business and accounting software. A more common mode of specialization is in-house software development. A firm that uses software extensively will often have a department dedicated to software development. The software engineers that work in that department will automatically develop a specialization tailored to the needs of the firm.

However, there are numerous areas where the demand does not warrant a specialization. A second option is that people that are trained in the application area develop programming skills. This is a workable option for relatively simple software. For more complex software, the loss in understanding of software construction may outweigh the advantage of familiarity with the application domain.

A more general solution to the problem is to modify the software development process. The basic idea is to allocate a significant amount of time early in the development on domain analysis. Domain analysis involves communicating with experts in the application area, noting important concepts and their relationships. During domain analysis, software developers build a domain model that can be readily converted into software. Another important process change involves building the product in stages and getting feedback from the customer about the preliminary versions.

Unlike other engineering disciplines, in software engineering, maintenance is not primarily concerned with the deterioration of a product over time. Instead, its objective is improving the software. There are three general types of software maintenance, defined by the types of improvements.

The low cost of software reproduction and installation makes it practical to develop software that is continuously upgraded while in use. It has been estimated that 80 percent of the software development effort is involved with maintenance. This figure reflects overall effort, including unsuccessful software. For successful software with a long history, the figure is nearer to 100 percent.

Since so much of successful development effort is involved in maintenance, the interests of developers weigh heavily in software values. Some of the effects are listed below.

One of the most important recent developments in software engineering concerns design patterns. Much of the effort in design patterns is analysis of reasons for change and patterns that reduce the impact of changes.

[an error occurred while processing this directive]