This post is a follow-up to my earlier blog on Software Certification. Certification is a complex topic. Before getting too far into a discussion on certification, let’s look at the work we call software development.
World wide there are millions of individuals who develop software for a living and they go by many names: programmer, software developer, software craftsman and software engineer.
From a work content point of view, the work of software development appears similar to the work that engineers perform and there is a recent trend to call individuals who develop software, Software Engineers.
For the past 20 years, I have been a consultant to dozens of companies assisting them improve their business processes and improve their ability to develop software. During this time, I have taught Software Engineering as an adjunct at DePaul University in Chicago. This past Winter Quarter, I taught a Software Engineering Process class with a focus on Agile and Lean software engineering. After this class I felt that my old definition of Software Engineering was inadequate and felt the necessity to develop the current definition as follows:
Larry’s Current Definition of Software Engineering
“Software Engineering is a profession that uses sound engineering principles, processes and practices and a body of knowledge to propose, design, develop, deploy, operate, maintain and retire computer software solutions over their useful life that people will buy and use to solve real world problems.”
Within this definition the Software Engineer becomes responsible for the overall software solution from the initial idea through design, development, deployment, operation to retirement.
This definition also accommodates the various sub-specialties of Software Engineering that we see in practice today such as: Business Analyst, Data Base Engineer, Infrastructure Engineer, Network Engineer, Software Developer and Systems Administrator.
Why develop my own definition of Software Engineering?
For the last 20 years I had been using a definition of Software Engineering by Fritz Bauer from 1968 (see below). That definition was workable for a long time, but recently I felt that that it needed to be broadened to better encompass the full software development life cycle.
Before I wrote my own definition of software engineering, I researched several other definitions: one on Wikipedia and one defined in IEEE’s Software Engineering Body of Knowledge (see below). Neither of these definitions satisfied by current view of software engineering in terms of the breadth or depth required to “engineer” software in the real world situations that I saw every day in my consulting work.
Software development is a complex process. The software development process begins with an idea, continues with the design and development of a solution followed by operating the solution in production for a period of time and eventually retiring the solution as described below:
- Envision: The “engineering” of a software program begins when an individual, often called the “user” determines they have a need for something new or a “developer” envisions a new way to solve a problem.
- Propose: The “engineering” continues with a proposal to obtain funding for a project to develop the solution.
- Design: Once funding is obtained, “engineering” designs a solution to the problem.
- Development: Next, “engineering” develops a working version of the solution.
- Deploy: Once an initial version of the system has been developed, further “engineering” is usually needed to successfully deploy the solution into operation.
- Operation and Maintenance: As the solution operates and its use grows, there is a need to “engineer” refinements into the solution for it to continue to grow and satisfy changing conditions.
- Retirement: Eventually, the solution can not be cost effectively refined and it must be replaced by a “new” solution and the cycle continues. Even in this stage, there is a need to “engineer” the graceful retirement of the “old” solution.
Although this may seem like a linear life cycle, there is usually considerable iteration between the various stages. Throughout this life cycle, there is a need for a “software engineer” to formally or informally make use of a wide variety of principles, processes, and practices such as: requirements definition (or product backlog development), coding and coding standards, configuration management, testing and a mechanism of handling changes (Change Control or Iterations) to name a few.
Other Definitions of Software Engineering
Fritz Bauer’s Early Definition of Software Engineering
“The establishment and use of sound engineering principles in order to obtain economically software that is reliable and works efficiently on real machines.”
Fritz Bauer, 1968
Software engineering is a profession and field of study dedicated to designing, implementing, and modifying software so that it is of higher quality, more affordable, maintainable, and faster to build.
See http://en.wikipedia.org/wiki/Software_engineering for more details.
IEEE Computer Society
The IEEE Computer Society‘s Software Engineering Body of Knowledge defines “software engineering” as the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software, and the study of these approaches; that is, the application of engineering to software.
See http://www.computer.org/portal/web/swebok/html/ch1#Ref1 for more details.
Although the Wikipedia definition mentions design of software, it does not focus on the full life cycle and adds constraints such as “more affordable” that are extraneous. The IEEE SWBOK definition includes operation in the life cycle, but does not mention design. It also adds a statement around “quantifiable” which often can not be accomplished in the real world.
More posts on this topic in the future!