History of software engineering

Last updated

The history of software engineering begins around the 1960s. Writing software has evolved into a profession concerned with how best to maximize the quality of software and of how to create it. Quality can refer to how maintainable software is, to its stability, speed, usability, testability, readability, size, cost, security, and number of flaws or "bugs", as well as to less measurable qualities like elegance, conciseness, and customer satisfaction, among many other attributes. How best to create high quality software is a separate and controversial problem covering software design principles, so-called "best practices" for writing code, as well as broader management issues such as optimal team size, process, how best to deliver software on time and as quickly as possible, work-place "culture", hiring practices, and so forth. All this falls under the broad rubric of software engineering. [1]

Contents

Overview

The evolution of software engineering is notable in a number of areas:

1945 to 1965: The origins

Early usages for the term software engineering include a 1965 letter from ACM president Anthony Oettinger, [6] [7] lectures by Douglas T. Ross at MIT in the 1950s. [8] Margaret H. Hamilton is the person who came up with the idea of naming the discipline, software engineering, as a way of giving it legitimacy during the development of the Apollo Guidance Computer. [9] [10]

I fought to bring the software legitimacy so that it—and those building it—would be given its due respect and thus I began to use the term 'software engineering' to distinguish it from hardware and other kinds of engineering, yet treat each type of engineering as part of the overall systems engineering process. When I first started using this phrase, it was considered to be quite amusing. It was an ongoing joke for a long time. They liked to kid me about my radical ideas. Software eventually and necessarily gained the same respect as any other discipline

Margaret Hamilton, 2014 interview with El País [11]

The NATO Science Committee sponsored two conferences [12] on software engineering in 1968 (Garmisch, Germany — see conference report ) and 1969, which gave the field its initial boost. Many believe these conferences marked the official start of the profession of software engineering. [6] [13]

1965 to 1985: The software crisis

Software engineering was spurred by the so-called software crisis of the 1960s, 1970s, and 1980s, which identified many of the problems of software development. Many projects ran over budget and schedule. Some projects caused property damage. A few projects caused loss of life. [14] The software crisis was originally defined in terms of productivity, but evolved to emphasize quality. Some used the term software crisis to refer to their inability to hire enough qualified programmers.[ citation needed ]

Peter G. Neumann has kept a contemporary list of software problems and disasters. [16] The software crisis has been fading from view, because it is psychologically extremely difficult to remain in crisis mode for a protracted period (more than 20 years). Nevertheless, software – especially real-time embedded software – remains risky and is pervasive, and it is crucial not to give in to complacency. Over the last 10–15 years Michael A. Jackson has written extensively about the nature of software engineering, has identified the main source of its difficulties as lack of specialization, and has suggested that his problem frames provide the basis for a "normal practice" of software engineering, a prerequisite if software engineering is to become an engineering science. [17]

1985 to 1989: "No Silver Bullet"

For decades, solving the software crisis was paramount to researchers and companies producing software tools. The cost of owning and maintaining software in the 1980s was twice as expensive as developing the software.[ citation needed ]

Software projects

Seemingly, every new technology and practice from the 1970s through the 1990s was trumpeted as a silver bullet to solve the software crisis. Tools, discipline, formal methods, process, and professionalism were touted as silver bullets:[ citation needed ]

In 1986, Fred Brooks published his No Silver Bullet article, arguing that no individual technology or practice would ever make a 10-fold improvement in productivity within 10 years.[ citation needed ]

Debate about silver bullets raged over the following decade. Advocates for Ada, components, and processes continued arguing for years that their favorite technology would be a silver bullet. Skeptics disagreed. Eventually, almost everyone accepted that no silver bullet would ever be found. Yet, claims about silver bullets pop up now and again, even today.[ citation needed ]

Some[ who? ] interpret[ why? ] no silver bullet to mean that software engineering failed.[ clarification needed ] However, with further reading, Brooks goes on to say: "We will surely make substantial progress over the next 40 years; an order of magnitude over 40 years is hardly magical ..."[ citation needed ]

The search for a single key to success never worked. All known technologies and practices have only made incremental improvements to productivity and quality. Yet, there are no silver bullets for any other profession, either. Others interpret no silver bullet as proof that software engineering has finally matured and recognized that projects succeed due to hard work.[ citation needed ]

However, it could also be said that there are, in fact, a range of silver bullets today, including lightweight methodologies (see "Project management"), spreadsheet calculators, customized browsers, in-site search engines, database report generators, integrated design-test coding-editors with memory/differences/undo, and specialty shops that generate niche software, such as information web sites, at a fraction of the cost of totally customized web site development. Nevertheless, the field of software engineering appears too complex and diverse for a single "silver bullet" to improve most issues, and each issue accounts for only a small portion of all software problems.[ citation needed ]

1990 to 1999: Prominence of the Internet

The rise of the Internet led to very rapid growth in the demand for international information display/e-mail systems on the World Wide Web. Programmers were required to handle illustrations, maps, photographs, and other images, plus simple animation, at a rate never before seen, with few well-known methods to optimize image display/storage (such as the use of thumbnail images).[ citation needed ]

The growth of browser usage, running on the HyperText Markup Language (HTML), changed the way in which information-display and retrieval was organized. The widespread network connections led to the growth and prevention of international computer viruses on MS Windows computers, and the vast proliferation of spam e-mail became a major design issue in e-mail systems, flooding communication channels and requiring semi-automated pre-screening. Keyword-search systems evolved into web-based search engines, and many software systems had to be re-designed, for international searching, depending on search engine optimization (SEO) . Human natural-language translation systems were needed to attempt to translate the information flow in multiple foreign languages, with many software systems being designed for multi-language usage, based on design concepts from human translators. Typical computer-user bases went from hundreds, or thousands of users, to, often, many-millions of international users.[ citation needed ]

2000 to 2015: Lightweight methodologies

With the expanding demand for software in many smaller organizations, the need for inexpensive software solutions led to the growth of simpler, faster methodologies that developed running software, from requirements to deployment, quicker & easier. The use of rapid-prototyping evolved to entire lightweight methodologies, such as Extreme Programming (XP), which attempted to simplify many areas of software engineering, including requirements gathering and reliability testing for the growing, vast number of small software systems. Very large software systems still used heavily documented methodologies, with many volumes in the documentation set; however, smaller systems had a simpler, faster alternative approach to managing the development and maintenance of software calculations and algorithms, information storage/retrieval and display.[ citation needed ]

Software engineering is a young discipline, and is still developing. The directions in which software engineering is developing include:[ citation needed ]

Aspects

Aspects help software engineers deal with quality attributes by providing tools to add or remove boilerplate code from many areas in the source code. Aspects describe how all objects or functions should behave in particular circumstances. For example, aspects can add debugging, logging, or locking control into all objects of particular types. Researchers are currently working to understand how to use aspects to design general-purpose code. Related concepts include generative programming and templates.

Experimental

Experimental software engineering is a branch of software engineering interested in devising experiments on software, in collecting data from the experiments, and in devising laws and theories from this data. Proponents of this method advocate that the nature of software is such that we can advance the knowledge on software through experiments only.[ citation needed ]

Software product lines

Software product lines, aka product family engineering, is a systematic way to produce families of software systems, instead of creating a succession of completely individual products. This method emphasizes extensive, systematic, formal code reuse, to try to industrialize the software development process.

The Future of Software Engineering conference (FOSE), held at ICSE 2000, documented the state of the art of SE in 2000 and listed many problems to be solved over the next decade. The FOSE tracks at the ICSE 2000 [19] and the ICSE 2007 [20] conferences also help identify the state of the art in software engineering.[ citation needed ]

Software engineering today

The profession is trying to define its boundary and content. The Software Engineering Body of Knowledge SWEBOK has been tabled as an ISO standard during 2006 (ISO/IEC TR 19759).[ citation needed ]

In 2006, Money Magazine and Salary.com rated software engineering as the best job in America in terms of growth, pay, stress levels, flexibility in hours and working environment, creativity, and how easy it is to enter and advance in the field. [21]

Sub-disciplines

Artificial intelligence

A wide variety of platforms has allowed different aspects of AI to develop, ranging from expert systems such as Cyc to deep learning to robot platforms such as the Roomba with open interface. [22] Recent advances in deep artificial neural networks and distributed computing have led to a proliferation of software libraries, including Deeplearning4j, TensorFlow, Theano and Torch.

A 2011 McKinsey Global Institute study found a shortage of 1.5 million highly trained data and AI professionals and managers [23] and a number of private bootcamps have developed programs to meet that demand, including free programs like The Data Incubator or paid programs like General Assembly. [24]

Languages

Early symbolic AI inspired Lisp and Prolog, which dominated early AI programming. Modern AI development often uses mainstream languages such as Python or C++, [25] or niche languages such as Wolfram Language. [26]

Prominent figures in the history of software engineering

See also

Related Research Articles

<span class="mw-page-title-main">Computing</span> Activity involving calculations or computing machinery

Computing is any goal-oriented activity requiring, benefiting from, or creating computing machinery. It includes the study and experimentation of algorithmic processes, and development of both hardware and software. Computing has scientific, engineering, mathematical, technological and social aspects. Major computing disciplines include computer engineering, computer science, cybersecurity, data science, information systems, information technology and software engineering.

<span class="mw-page-title-main">Programmer</span> Person who writes computer software

A computer programmer, sometimes referred to as a software developer, a software engineer, a programmer or a coder, is a person who creates computer programs.

Software engineering is an engineering-based approach to software development. A software engineer is a person who applies the engineering design process to design, develop, test, maintain, and evaluate computer software. The term programmer is sometimes used as a synonym, but may emphasize software implementation over design and can also lack connotations of engineering education or skills.

Software crisis is a term used in the early days of computing science for the difficulty of writing useful and efficient computer programs in the required time. The software crisis was due to the rapid increases in computer power and the complexity of the problems that could not be tackled. With the increase in the complexity of the software, many software problems arose because existing methods were inadequate.

The waterfall model is a breakdown of development activities into linear sequential phases, meaning they are passed down onto each other, where each phase depends on the deliverables of the previous one and corresponds to a specialization of tasks. The approach is typical for certain areas of engineering design. In software development, it tends to be among the less iterative and flexible approaches, as progress flows in largely one direction through the phases of conception, initiation, analysis, design, construction, testing, deployment and maintenance. The waterfall model is the earliest SDLC approach that was used in software development.

Rapid application development (RAD), also called rapid application building (RAB), is both a general term for adaptive software development approaches, and the name for James Martin's method of rapid development. In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process. Prototypes are often used in addition to or sometimes even instead of design specifications.

Software development is the process used to conceive, specify, design, program, document, test, and bug fix in order to create and maintain applications, frameworks, or other software components. Software development involves writing and maintaining the source code, but in a broader sense, it includes all processes from the conception of the desired software through the final manifestation, typically in a planned and structured process often overlapping with software engineering. Software development also includes research, new development, prototyping, modification, reuse, re-engineering, maintenance, or any other activities that result in software products.

The following outline is provided as an overview of and topical guide to software engineering:

<span class="mw-page-title-main">Computer-aided software engineering</span> Software Quality Engineering Practices

Computer-aided software engineering (CASE) was a domain of software tools used to design and implement applications. CASE tools were similar to and were partly inspired by Computer-Aided Design (CAD) tools used for designing hardware products. CASE tools were intended to help develop high-quality, defect-free, and maintainable software. CASE software was often associated with methods for the development of information systems together with automated tools that could be used in the software development process.

In computer programming, a software framework is an abstraction in which software, providing generic functionality, can be selectively changed by additional user-written code, thus providing application-specific software. It provides a standard way to build and deploy applications and is a universal, reusable software environment that provides particular functionality as part of a larger software platform to facilitate the development of software applications, products and solutions.

In software development, code reuse, also called software reuse, is the use of existing software, or software knowledge, to build new software, following the reusability principles.

The World Wide Web has become a major delivery platform for a variety of complex and sophisticated enterprise applications in several domains. In addition to their inherent multifaceted functionality, these Web applications exhibit complex behaviour and place some unique demands on their usability, performance, security, and ability to grow and evolve. However, a vast majority of these applications continue to be developed in an ad hoc way, contributing to problems of usability, maintainability, quality and reliability. While Web development can benefit from established practices from other related disciplines, it has certain distinguishing characteristics that demand special considerations. In recent years, there have been developments towards addressing these considerations.

In the context of software engineering, software quality refers to two related but distinct notions:

In computer science, formal specifications are mathematically based techniques whose purpose are to help with the implementation of systems and software. They are used to describe a system, to analyze its behavior, and to aid in its design by verifying key properties of interest through rigorous and effective reasoning tools. These specifications are formal in the sense that they have a syntax, their semantics fall within one domain, and they are able to be used to infer useful information.

Coding best practices or programming best practices are a set of informal, sometimes personal, rules that many software developers, in computer programming follow to improve software quality. Many computer programs require being robust and reliable for long periods of time, so any rules need to facilitate both initial development and subsequent maintenance of source code by people other than the original authors.

<span class="mw-page-title-main">Design rationale</span>

A design rationale is an explicit documentation of the reasons behind decisions made when designing a system or artifact. As initially developed by W.R. Kunz and Horst Rittel, design rationale seeks to provide argumentation-based structure to the political, collaborative process of addressing wicked problems.

Comment programming, also known as comment-driven development (CDD), is a (mostly) satirical software development technique that is heavily based on commenting out code.

In software engineering, a software development process or software development life cycle (SDLC) is a process of planning and managing software development. It typically involves dividing software development work into smaller, parallel, or sequential steps or sub-processes to improve design and/or product management. The methodology may include the pre-definition of specific deliverables and artifacts that are created and completed by a project team to develop or maintain an application.

Software construction is a software engineering discipline. It is the detailed creation of working meaningful software through a combination of coding, verification, unit testing, integration testing, and debugging. It is linked to all the other software engineering disciplines, most strongly to software design and software testing.

<span class="mw-page-title-main">Extreme programming</span> Software development methodology

Extreme programming (XP) is a software development methodology intended to improve software quality and responsiveness to changing customer requirements. As a type of agile software development, it advocates frequent releases in short development cycles, intended to improve productivity and introduce checkpoints at which new customer requirements can be adopted.

References

  1. "CS302: Jared King's "The History of Software"". learn.saylor.org. Retrieved 2018-02-17.
  2. "Software engineering … has recently emerged as a discipline in its own right." Sommerville, Ian (1985) [1982]. Software Engineering. Addison-Wesley. ISBN   978-0-201-14229-7.
  3. Abbate, Janet (2012). Recoding Gender . Cambridge, MA: MIT Press. pp.  39. ISBN   978-0262534536.
  4. Ensmenger, Nathan (2012). The Computer Boys Take Over. Cambridge, MA: MIT Press. ISBN   978-0262517966.
  5. "Episode 576: When Women Stopped Coding". NPR Planet Money. Oct 17, 2014. Retrieved June 27, 2018.
  6. 1 2 Meyer, Bertrand (April 4, 2013). "The origin of "software engineering"" . Retrieved 2016-11-25.
  7. Tadre, Matti (2014-12-03). The Science of Computing. CRC Press. p. 121. ISBN   978-1-4822-1770-4.
  8. Mahoney, Michael. "The Roots of Software Engineering" (PDF). CWI Quarterly. 3 (4): 325–334. Archived from the original (PDF) on 2011-02-20. Retrieved Feb 10, 2023.
  9. 2018 International Conference on Software Engineering celebrating its 40th anniversary, and 50 years of Software engineering. "ICSE 2018 - Plenary Sessions - Margaret Hamilton". YouTube . Retrieved 9 Jun 2018.{{cite web}}: CS1 maint: numeric names: authors list (link)
  10. Rayl, A.J.S. (October 16, 2008). "NASA Engineers and Scientists-Transforming Dreams Into Reality". NASA 50th anniversary website. NASA . Retrieved 2016-11-25.
  11. "First Software Engineer | IEEE Computer Society". 5 October 2018. Retrieved 2023-03-05.
  12. Brian Randell (2001). "NATO Software Engineering Conferences". ncl.ac.uk. Retrieved 2016-11-25.
  13. 1 2 3 King, Jared (2016). "Jared King's "The History of Software"". CS302: Software Engineering. Saylor.org . Retrieved 2016-11-25.
  14. Therac-25
  15. Leveson, N.G.; Turner, C.S. (1993-07-01). "An investigation of the Therac-25 accidents". Computer. 26 (7): 18–41. CiteSeerX   10.1.1.372.412 . doi:10.1109/MC.1993.274940. ISSN   0018-9162. S2CID   9691171.
  16. Neumann, Peter G. "RISKS-LIST: RISKS-FORUM Digest". The Risks Digest.
  17. {Michael Jackson, "Engineering and Software Engineering" in S Nanz ed, The Future of Software Engineering, Springer Verlag 2010; Michael Jackson, Problem Frames: Analyzing and Structuring Software Development Problems; Addison-Wesley, 2001}
  18. D.J.Pearson "The use and abuse of a software engineering system" National Computer Conference 1979
  19. "ICSE2000: Call for Participation". ul.ie.
  20. "ICSE 2007: Home". ucl.ac.uk.
  21. Kalwarski, Tara; Daphne Mosher; Janet Paskin; Donna Rosato (2006). "Best Jobs in America". MONEY Magazine. CNN. Retrieved 2006-04-20., "MONEY Magazine and Salary.com researched hundreds of jobs, considering their growth, pay, stress-levels and other factors. These careers ranked highest. 1. Software Engineer..."
  22. "Hacking Roomba". hackingroomba.com. Archived from the original on 18 October 2009.
  23. Manyika, James; Chui, Michael; Bughin, Jaques; Brown, Brad; Dobbs, Richard; Roxburgh, Charles; Byers, Angela Hung (May 2011). "Big Data: The next frontier for innovation, competition, and productivity". McKinsey Global Institute. Archived from the original on 6 March 2013. Retrieved 16 January 2016.{{cite journal}}: Cite journal requires |journal= (help)
  24. "NY gets new boot camp for data scientists: It's free but harder to get into than Harvard". Venture Beat. Archived from the original on 15 February 2016. Retrieved 21 February 2016.
  25. "C++ Java". infoworld.com. Retrieved 6 December 2017.
  26. Ferris, Robert (7 April 2016). "How Steve Jobs' friend changed the world of math". CNBC. Retrieved 28 February 2018.