The terms software engineering, software engineer, and sometimes just engineer as in "full stack engineer" appear a lot in the software development field. Some people including myself find the use of the term "Software Engineering" to be somewhat dubious. I also feel that there are too many people calling themselves engineers who really shouldn’t be. As a result of my skepticism I have been trying to devise a way to determine exactly what is Software Engineering?
The happy path is to go to the web and search for it or just find a book. Both will lead to many answers. But that is really just getting someone else’s opinion. A little later we will look at other people’s opinions as there are very established authors who readily answer this question.
To get some perspective, let’s step back and ask a more basic question. What is engineering? For this I will rely on the ultimate oracle of our time. Some top responses from the Google are:
The Google dictionary definition:
the branch of science and technology concerned with the design, building, and use of engines, machines, and structures.
• the work done by, or the occupation of, an engineer.
• the action of working artfully to bring something about.
"if not for Keegan's shrewd engineering, the election would have been lost"
The Georgia Tech School of Engineering provides the following:
Engineering is the practical application of science and math to solve problems, and it is everywhere in the world around you. From the start to the end of each day, engineering technologies improve the ways that we communicate, work, travel, stay healthy, and entertain ourselves.
Engineering is the application of science and math to solve problems. Engineers figure out how things work and find practical uses for scientific discoveries.
Wikipedia: defines it as
Engineering (from Latin ingenium, meaning "cleverness" and ingeniare, meaning "to contrive, devise") is the application of scientific, economic, social, and practical knowledge in order to invent, design, build, maintain, research, and improve structures, machines, devices, systems, materials and processes.
So to summarize and synthesize the above for a working definition, we get:
Engineering is a branch of science and technology where mathematical, scientific, economic, and social knowledge are applied artfully, creatively, and efficiently to invent, design, build, maintain, research, and improve structures, machines, devices, systems, materials and processes.
Another aspect of engineering that should be considered is its diversity. Just searching around I came up with the following list of types of engineering, which should by no means be considered complete, they include: Aeronautical, Agricultural, Audio, Biomedical, Biomechanical, Building, Ceramics, Chemical, Civil, Computer, Electrical, Electronics, Environmental, Food, Geological, Industrial, Marine, Mechanical, Military, Mineral, Military, Nuclear, Optical, Petroleum, Photonics, Systems, and Textile.
Often discussions of software engineering draw parallels to construction and civil engineering and it is easy to see why, most people often see the results of these disciplines and even live in them. Not to trivialize these disciplines, but bricks and mortar, in addition to wood, glass, and rebar are things that support our lives and are physical thus somewhat easy to conceptualize. But all engineering disciplines now touch and perhaps run our lives in ways that we rarely think about. I previously posited that chemical engineering, prior to the software era, was probably the most pervasive engineering in our lives not to mention that the computer hardware we use wouldn’t exist without it. It serves as an interesting area to look at in regards to software engineering comparisons too, as it is a relatively recent discipline and has some parallels like the control of processes and "flows" in this case of materials. Perhaps the closest "relative" to software engineering might be industrial engineering. Like software it deals with human factors. It also deals with stochastic processes, something that is becoming increasingly more important in software systems.
Now that we have some general engineering perspective, let’s revisit the question "What is software engineering" by looking at what the established organizations and authors have to say.
Wikipedia gives the following definition:
Software engineering is the study and an application of engineering to the design, development, and maintenance of software.
Typical formal definitions of software engineering are:
- the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software
- an engineering discipline that is concerned with all aspects of software production
- the establishment and use of sound engineering principles in order to economically obtain software that is reliable and works efficiently on real machines.
K.K. Aggarwal provides us with a bit of history:
At the first conference on software engineering in 1968, Fritz Bauer defined software engineering as "The establishment and use of sound engineering principles in order to obtain economically developed software that is reliable and works efficiently on real machines".
Stephen Schach defined the same as "A discipline whose aim is the production of quality software, software that is delivered on time, within budget, and that satisfies its requirements".
The ACM weighs in with:
Software engineering (SE) is concerned with developing and maintaining software systems that behave reliably and efficiently, are affordable to develop and maintain, and satisfy all the requirements that customers have defined for them. It is important because of the impact of large, expensive software systems and the role of software in safety-critical applications. It integrates significant mathematics, computer science and practices whose origins are in engineering.
There are a number of books on software engineering which have an obligation to address the question.
The answer in Ian Sommerville’s 8th Edition of Software Engineering is:
Software engineering is an engineering discipline that is concerned with all aspects of software production from the early stages of system specification to maintaining the system after it has gone into use. In this definition, there are two key phrases:
1. Engineering discipline Engineers make things work. They apply theories, methods and tools where these are appropriate,. but they use them selectively and always try to discover solutions to problems even when there are no applicable theories and methods. Engineers also recognise that they must work to organisational and financial constraints, so they look for solutions within these constraints.
2. All aspects of software production Software engineering is not just concerned with the technical processes of software development but also with activities such as software project management and with the development of tools, methods and theories to support software production.
What Every Engineer Should Know about Software Engineering by Philip A. Laplante offers the following:
Software engineering is "a systematic approach to the analysis, design, assessment, implementation, test, maintenance, and reengineering of software, that is, the application of engineering to software. In the software engineering approach, several models for the software life cycle are defined, and many methodologies for the definition and assessment of the different phases of a life-cycle model" [Laplante 2001]
In Software Engineering A Practitioner's Approach 8th Edition Roger S. Pressman and Bruce R. Maxim provide a terse explanation:
Software Engineering encompasses a process, a collection of methods [practice] and an array of tools that allow professionals to build high-quality computer software.
Roger Y. Lee describes it in Software Engineering:A Hands-On Approach as:
Software engineering is the process of designing, developing and delivering software systems that meet a client’s requirements in an efficient and cost effective manner. To achieve this end, software engineers focus not only on the writing of a program, but on every aspect of the process, from clear initial communication with the client, through effective project management, to economical post-delivery maintenance practices. The IEEE Standard glossary of software engineering terminology defines software engineering as the application of a systematic, disciplined, quantifiable approach to the development, operation and maintenance of software (Ghezzi et al. 1991). As made clear by the above definition, software engineering came about in order to reverse early development practices by establishing a standard development method that could unify and normalize development operations, regardless of the people involved or the goals sought.
The laborious effort of wading through all of this erudition gives me the following distillation:
Software Engineering is:
- An engineering discipline
- Application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software"
- Software engineering (SE) is concerned with developing and maintaining software
- Software engineering is the process of designing, developing and delivering software systems
- A standard development method that can unify and normalize development operations, regardless of the people involved or the goals sought.
Software Engineering Includes:
- All aspects of software production from the early stages of system specification to maintaining
- The system after it has gone into use
- Non technical activities such as software project management and with the development of tools, methods and theories to support software production.
- The integration of significant mathematics, computer science and practices whose origins are in engineering.
- The application of theories, methods and tools where these are appropriate
- Many methodologies for the definition and assessment of the different phases of a life-cycle model
- Several models for the software life cycle
- A process, a collection of methods [practice] and an array of tools that allow professionals to build high-quality computer software.
- The application of sound engineering principles to the analysis, design, implementation (development), assessment, test, maintenance and reengineering of software that is reliable and works efficiently on real machines
Software Engineering Produces:
- Quality software
- Software that is delivered on time
- Cost effective production of software (within budget)
- Software that satisfies its requirements.
- Software systems that behave reliably and efficiently
- Software that is affordable to develop and maintain
- Solutions that conform to organizational and financial constraints
I tried to break the multitude of ideas into three categories, but they are admittedly a bit fuzzy and you could probably move some of these around. The point of the categorization exercise is to attempt to separate a definition from the broader idea of what the discipline encompasses and the attributes of the structures and systems that it produces, again things can get fuzzy here. In thinking about these and my own experience with software development I came up with a list of things that I feel should be defined to make software engineering a real discipline and they are:
- What is the definition of the engineering discipline we are describing?
- What are the produced artifacts, e.g. structures and processes that the discipline creates?
- What non-managerial processes and methodologies are used to create the produced artifacts?
- What types of documentation (descriptive artifacts) are used to describe the produced artifacts and the processes to create those produced artifacts?
- How does the underlying math and science support the engineering discipline and how do these foundational disciplines allow one to reason about the produced artifacts that the engineering discipline is trying to construct? How do these disciplines define and drive the descriptive artifacts?
- How does one organize and manage the effort including various roles people will play to actually carry out the work to bring the system or structure to fruition?
So coming back to the original purpose of this post, my answer to the question of what is software engineering, number one above, is:
Software engineering is the branch of science and technology where mathematical, computer science, linguistic, social knowledge and system relevant domain specific knowledge are applied artfully, creatively, and efficiently to invent, design, build, maintain, research, and improve software systems.
That’s the easy part. The hard part is what are the answers to the other five questions? I know that there a number of industry standard answers for these that include things like UML, Agile, Scrum, etc., but are those really valid and are they really working? I don’t think so, so maybe it’s time to look for other answers.