What is software engineering?
Bjarne Stroustrup, the creator of the C++ programming language, once said that "our civilization runs on software." This statement is impressively backed by reality, in which software controls a huge variety of devices, from cell phones and music players, to smart appliances such as microwave ovens and laundry machines, to personal computers that many people use at work and large mainframe computers that operate in governmental organizations. In fact, it is hard to imagine an area of human activity that does not rely at least partially on software, including professional work, home activities, and entertainment.
Using a basic definition, software means computer programs and their associated documentation. Computer programs, in turn, consist of algorithms (or procedures) applied to various types of data. Software engineering emerged in the late 1960s as a new engineering discipline concerned with all aspects pertaining to software production. It encompasses concepts, principles, theories, techniques and tools that can be used for developing high-quality professional software. First introduced at the 1968 NATO Software Engineering Conference in Garmisch, Germany, software engineering emphasizes a systematic, disciplined approach to software development and evolution and typically applies to the construction of large software systems (or products) in which teams of numerous software engineers are involved.
High-quality software is characterized by:
- High dependability (including safety, security and reliability)
A software product is said to have a life-cycle, or undergo a software process, which in software engineering terms consists essentially of two parts: development and evolution. Both involve traditional engineering phases, software development consisting primarily of concept creation, requirements specification, design, implementation, integration, testing, and deployment. On the other hand, software evolution involves operation and maintenance as well as some limited development activities aimed at improving the software.
Applications of software engineering
Software engineering applications are practically unlimited. In fact, software engineering has grown so fast in the last several decades that it has become tightly connected with all other areas of computer science (e.g., artificial intelligence, parallel processing, computer graphics, human-computer interaction, database management systems, and many others) as well as with some areas outside the traditional computer domain (such as cognitive sciences and visual arts).
Challenges in software engineering
Current challenges in software engineering research and development include:
- Dealing with the increased complexity of software required in new applications
- The diversity of software systems that need to communicate/operate with each other
- The need to develop trustworthy software
- Increased market demands for a quick turnaround from concept to deployment and operation
- The quest for increased efficiency in component-based reuse and automatic code generation
Studying software engineering
Students who want to focus on software engineering are expected to gain and integrate knowledge from various subject areas including computer programming, data structures, algorithms, numerical methods, statistics, design patterns, human-computer interaction, computer graphics, information visualization, database systems, web development, software project management, and software engineering.
Internship and employment opportunities in software engineering
Software engineers are in high demand nationally and abroad. The list of companies hiring software engineers is practically endless. While most jobs are in industry, research labs also hire skilled software engineers, either for research in software engineering itself or for supporting software development in research environments. Furthermore, skilled software engineers are also hired by start-up companies, or are well prepared to start their own software development companies.
Notably, under the umbrella of software engineering several specialized professions exist besides software engineer itself, including computer programmer, analyst, designer, developer, tester, consultant, and others.