Software Engineering
Last updated
Last updated
Software engineering is the application of engineering to design, implement, maintain, test, and evaluate computer software. Computer software (or simply software) is a set of instructions and that tells a computer how to work. Computer hardware (or simply hardware) is a physical system that performs the work defined by software and configuration. Computer software and hardware require each other and neither can be used on their own. Software encompasses all information processed by a computer system, including programs, libraries, and non-executable data such as documentation or media.
Software engineers create the programs which turn computers into useful machines. Computer software enables us to send email, search the Internet, make video calls, control industrial manufacturing robots, and fly rockets. Software engineers manage the entire process of designing and developing software, which includes computer programming, gathering requirements, software testing, and maintaining the final product. Software engineers have played a central role in the ongoing digital revolution by making the software which tells computers what to do, Computer software is transforming human civilization and has led to the beginning of the Information Age.
There are many formal definitions and understandings of software engineering. The ISO/IEC/IEEE Systems and Software Engineering Vocabulary (SEVOCAB) define software engineering as
the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software; that is, the application of engineering to software
Software engineers apply the principles of engineering to design, develop, maintain, test, and evaluate software. The term programmer is sometimes used as a synonym, but may also lack connotations of formal education or skills. In some circles, there is controversy over over the term software engineer versus programmer and software developer. The activity of computer programming is mainly involved in the implementation phase of software development, thus programmers are considered to only be responsible and able to contribute to a limited problem domain. For more information about about the programmer versus engineer controversy checkout Programmers: Stop Calling Yourselves Engineers, by Ian Bogost.
For the purpose of this guide we will only use the term software engineer, but recognize that software engineer, computer programmer, and software developer have different legal implications and connotations depending on the industry and particular professional context.
Software engineering is critical to modern technologies from your alarm clock to rocket flight control systems. Modern society truly runs on computer software. Software engineering is also one of the fastest growing professions today and a career as a software engineer offers variety of benefits.
Gain great skill-set that's in short supply, opening up a wide range of options.
Excellent working conditions - often shorter, flexible hours, with possibility of remote work.
In the US, the pay is relatively high, especially early in your career - $100,000+ starting salary is possible.
Software engineering can empower individuals by giving them the financial means to earn to give and build useful skills. To learn more about how to make an impact with a career in software engineering, checkout the article Software engineering at large tech-firms (for skill-building & earning to give) published by the organization 80,000 Hours.
Software engineering emerged as a sub-discipline of computer science, electrical engineering, and computer engineering in the beginning of the 1960s. Software engineering was developed in part as a response to the Software Crisis, which was a perceived period in the early days of computer science known for the difficulty successfully developing and delivering software projects. During this period of time, a high percentage of software projects had failed due to a variety of reasons including
Projects running over-budget
Projects running over-time
Software was very inefficient
Software was of low quality
Software often did not meet requirements
Projects were unmanageable and code difficult to maintain
Software was never delivered
A major cause of the Software Crisis was determined to be that computers were becoming several orders of magnitude more powerful at an exponential rate. As Edsger Dijkstra, the creator of the C++ programming language, put it bluntly "as long as there were no machines, programming was no problem at all; when we had a few weak computers, programming became a mild problem, and now we have gigantic computers, programming has become an equally gigantic problem." Rapid increases in computer power caused an explosion of complexity in the problems that could be tackled. With the increase in the complexity of the software, many software problems arose because existing methods were inadequate.
During the Software Crisis, term "software engineering" emerged, with its origins attributed to various sources. The term appeared in a list of services offered by companies in the June 1965 issue of COMPUTERS and AUTOMATION. The ACM President Anthony A. Oettinger. It used it more formally in the August 1966 issue of Communications of the ACM. It is associated with the title of a NATO conference in 1968 by Professor Friedrich L. Bauer, the first conference on software engineering.
Margaret Hamilton also is credited as independently naming the discipline "software engineering" during the Apollo missions to provide legitimacy to the work her team was doing. The term "engineering" was used to acknowledge that the work should be taken just as seriously as other contributions toward the advancement of technology.
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. The Capability Maturity Model Integration for Development(CMMI-DEV) currently used by US Government to evaluate the abilities of a software development team, was developed through Humphrey's program.
Today, the ISO/IEC JTC 1/SC 7 subcommittee has collected modern, general accepted best-practices for software engineering which are published as the Software Engineering Body of Knowledge (SWEBOK).
Software engineering is one of the fastest growing professions today. The roles and responsibilities range from industry and technology stack. In 2018, the U.S. Bureau of Labor Statistics(BLS) counted 1,365,500 software developers holding jobs in the U.S. Since software engineering is relatively new discipline, formal education is often taught as part of a computer science curriculum. As such, software engineers typically hold computer science, computer engineering, and electrical engineering degrees. The BLS estimates from 2014 to 2024 that the number of software engineers will increase by 17%.
According to Indeed.com, the average salary for a software engineer in the United States is $111,537. A good starting software engineer salary in the US is considered to be $113,211 per year. Competitive starting salaries will vary depending on location and cost of living.
Software engineers work on a variety of technologies from websites to flight control systems, require varying education and training in computer science, computer programming, engineering, mathematics, and project management. Open Source Society University offers a free online curriculum that corresponds to 4-year degree in computer science with links to online education resources and courses. It covers a variety of subjects including computer science theory, computer programming, mathematics, engineering, operating systems, data structures & algorithms, information security, software engineering, and advanced computer science topics.
The Accreditation Board for Engineering and Technology (ABET) is a non-governmental organization that accredits post-secondary education programs in applied and natural science, computing, engineering and engineering technology. According to the ABET, in addition to the general criteria for all baccalaureate level engineering programs, a college's software engineering program must meeting the following criteria to qualify for accreditation:
Provide both breadth and depth across the range of engineering and computer science topics implied by the title and objectives of the program
Include computing fundamentals, software design and construction, requirements analysis, security, verification, and validation
Teach software engineering processes and tools appropriate for the development of complex software systems
Cover discrete mathematics, probability, and statistics, with applications appropriate to software engineering
The program's faculty members must also teach core software engineering topics, have an understanding of professional practice in software engineering, and maintain currency in their areas of professional or scholarly specialization.
In practice, most software engineering activities do not need to be performed by software engineerings from ABET accredited bachelor degree programs. However, software engineers in industries such as aerospace, pharmaceuticals, energy, and transportation, who are working on safety/mission critical systems, will typically be required to have an ABET accredited degree in software engineering, computer engineering, computer science, or electrical engineering.
The demand for software engineers, especially in the areas of web and mobile application development, has been exploded in recent years. Code bootcamps have emerged to fill the demand to training in software engineering. Bootcamps offer accelerated learning programs that teach digital skills like software engineering, data science, product management, and UX/UI Design. Learn more about code bootcamps on SPEC's Guide to Code Bootcamps.
IEEE Computer Science, Software Engineering Body of Knowledge (2021)
Wikipedia, Software Engineering (2021)