Software engineering

Software engineering is the application of engineering to the design, development, implementation, testing and maintenance of software in a systematic method

Typical formal definitions of software engineering are:

  • “research, design, develop, and test operating systems-level software, compilers, and network distribution software for medical, industrial, military, communications, aerospace, business, scientific, and general computing applications.”
  • “the systematic application of scientific and technological knowledge, methods, and experience to the design, implementation, testing, and documentation of software”;
  • “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”;
  • and “the establishment and use of sound engineering principles in order to economically obtain software that is reliable and works efficiently on real machines.”

History of software engineering

When the first digital computers appeared in the early 1940s, the instructions to make them operate were wired into the machine. Practitioners quickly realized that this design was not flexible and came up with the “stored program architecture” or von Neumann architecture. Thus the division between “hardware” and “software” began with abstraction being used to deal with the complexity of computing.

Programming languages started to appear in the 1950s and this was also another major step in abstraction. Major languages such as Fortran, ALGOL, and COBOL were released in the late 1950s to deal with scientific, algorithmic, and business problems respectively. Edsger W. Dijkstra wrote his seminal paper, “Go To Statement Considered Harmful”, in 1968 and David Parnas introduced the key concept of modularity and information hiding in 1972 to help programmers deal with the ever increasing complexity of software systems.

The origins of the term “software engineering” have been attributed to different sources, but it was used in 1968 as a title for the world’s first conference on software engineering, sponsored and facilitated by NATO. The conference was attended by international experts on software who agreed on defining best practices for software grounded in the application of engineering. The result of the conference is a report that defines how software should be developed. The original report is publicly available.

The discipline of software engineering was created to address poor quality of software, get projects exceeding time and budget under control, and ensure that software is built systematically, rigorously, measurably, on time, on budget, and within specification.

Engineering already addresses all these issues, hence the same principles used in engineering can be applied to software. The widespread lack of best practices for software at the time was perceived as a “software crisis”.

Barry W. Boehm documented several key advances to the field in his 1981 book, ‘Software Engineering Economics’. These include his Constructive Cost Model (COCOMO), which relates software development effort for a program, in man-years T, to source lines of code (SLOC). T = k ∗ ( S L O C ) ( 1 + x ) {\displaystyle T=k*(SLOC)^{(1+x)}}

The book analyzes sixty-three software projects and concludes the cost of fixing errors escalates as the project moves toward field use. The book also asserts that the key driver of software cost is the capability of the software development team.

In 1984, the Software Engineering Institute (SEI) was established as a federally funded research and development center headquartered on the campus of Carnegie Mellon University in Pittsburgh, Pennsylvania, United States. Watts Humphrey founded the SEI Software Process Program, aimed at understanding and managing the software engineering process. His 1989 book, Managing the Software Process, asserts that the Software Development Process can and should be controlled, measured, and improved. The Process Maturity Levels introduced would become the Capability Maturity Model Integration for Development(CMMi-DEV), which has defined how the US Government evaluates the abilities of a software development team.

Modern, generally accepted best-practices for software engineering have been collected by the ISO/IEC JTC 1/SC 7 subcommittee and published as the Software Engineering Body of Knowledge (SWEBOK).

Leave A Comment