Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software. The term software engineering was popularized during the 1968 NATO Software Engineering Conference (held in Garmisch, Germany) by its chairman F.L. Bauer, and has been in widespread use since. The discipline of software engineering encompasses knowledge, tools, and methods for defining software requirements, and performing software design, software construction, software testing, and software maintenance tasks. Software engineering also draws on knowledge from fields such as computer engineering, computer science, management, mathematics, project management, quality management, software ergonomics, and systems engineering.
As of 2004, the U. S. Bureau of Labor Statistics counts 760,840 software engineers holding jobs in the U.S.; for comparison, in the U.S. there are some 1.4 million practitioners employed in all other engineering disciplines combined. There are estimated to be about 1.5 million practitioners in the E.U., Asia, and elsewhere. SE pioneers include Barry Boehm, Fred Brooks, C. A. R. Hoare, and David Parnas.
David Parnas has said that software engineering is, in fact, a form of engineering. Steve McConnell has said that it is not, but that it should be. Donald Knuth has said that programming is an art.
The U.S. Bureau of Labor Statistics classifies computer software engineers as a subcategory of "computer specialists", along with occupations such as computer scientist, programmer, and network administrator. The BLS classifies all other engineering disciplines, including computer hardware engineers, as "engineers".
The U.K. has seen the alignment of the Information Technology Professional and the Engineering Professionals. Software engineering in Canada has seen some contests in the courts over the use of the title "Software Engineer"
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"
As Dijkstra pointed out, the terms software engineering and software engineer have, at times, also been misused in a much wider sense, particularly in America.The term has been used less formally:
* as the informal contemporary term for the broad range of activities that was formerly called programming and systems analysis;
* as the broad term for all aspects of the practice of computer programming, as opposed to the theory of computer programming, which is called computer science;
* as the term embodying the advocacy of a specific approach to computer programming, one that urges that it be treated as an engineering discipline rather than an art or a craft, and advocates the codification of recommended practices in the form of software engineering methodologies.
Software is often found in products and situations where very high reliability is expected, even under demanding conditions, such as monitoring and controlling nuclear power plants, or keeping a modern airliner aloft Such applications contain millions of lines of code, making them comparable in complexity to the most complex modern machines. For example, a modern airliner has several million physical parts (and the space shuttle about ten million parts), while the software for such an airliner can run to 4 million lines of code. See also List of software engineering topics (thematic) and List of software engineering topics (alphabetical).
Technologies and practices
Software engineers advocate many different technologies and practices, with much disagreement. This debate has gone on for 60 years and may continue forever. Software engineers use a wide variety of technologies and practices. Practitioners use a wide variety of technologies: compilers, code repositories, text editors. They also use a wide variety of practices to carry out and coordinate their efforts: pair programming, code reviews and daily stand up meetings.
In spite of the enormous economic growth and productivity gains enabled by software, persistent complaints about the quality of software remain.