Contents
An Introduction to Software Engineering
Software engineering is concerned with all aspects of software production from the early stages of system specification through to maintaining the system after it has gone into use. In this chapter, we will explain the following:
- the definition of computer science and software engineering and how the two are different
- how software engineering is similar to other engineering disciplines and what that means for software engineers
- the unique challenges of software engineering
- software development models and processes and their component parts, software development practices
Software systems are perhaps the most intricate and complex... of the things humanity makes. Fred Brooks []
As a discipline, software engineering has progressed very far in a very short period of time, particularly when compared to classical engineering fields (like civil or electrical engineering). In the early days of computing, not much more than 50 years ago, computerized systems were quite small. Most of the programming was done by scientists trying to solve specific, relatively small mathematical problems. Today we often build monstrous systems, in terms of size and complexity. And, the visibility of the software has transitioned from mainly scientists and software developers to the general public of all ages. Today, software is working both explicitly and behind the scenes in virtually all aspects of our lives, including the critical systems that affect our health and well-being. [] Essentially every person encounters software throughout their day from cars to phones to television to the Internet.
Despite our rapid progress, the software industry is considered by many to be in a crisis. Some 40 years ago, the term Software Crisis] While the industry can celebrate that software touches nearly all aspects of our daily lives, we can all relate to software availability dates (such as computer games) as moving targets and to computers crashing or locking up. We have many challenges we need to deal with as we continue to progress into a more mature engineering field, one that predictably produces high-quality products.
- 1The Engineering of Software
Until this point in your academic career, you have likely focused on being a computer scientist. Consider the definition of computer science developed by an ACM]:
The discipline of computing is the systematic study of algorithmic processes that describe and transform information: their theory, analysis, design, efficiency, implementation, and application. The fundamental question underlying all of computing is, What can be (efficiently) automated?
Likely, the main focus of your studies and programming thus far have been to get the computer to do what you want it to do (i.e. transform information), as efficiently as possible. Professionals in the computing industry today must consider many other issues in using computer science to engineer software-intensive. Consider this definition of engineering proposed by Robert Baber (emphasis added) []:
... the systematic and regular application of scientific and mathematical knowledge to the design, construction, and operation of machines, systems, and so on of practical use and, hence, of economic value . Particular characteristic of engineers is that they take seriously their responsibility for correctness, suitability, and safety of the results of their efforts. In this regard they consider themselves to be responsible to their customer (including their employers where relevant), to the users of their machines and systems, and to the public at large.
Computer science is one of the disciplines that provide a theory basis for the profession of software engineering. (Some others are psychology, economics, and management.) The above definition of engineering lays out two important issues involved in transitioning from computer science to software engineering. The issues underlined in the above definition of engineering are further discussed below:
- Practical use, economic value. Engineers need to produce products that customers actually want and are willing to pay real money for. These products need to help people do the things they need to do. Listening to the customer is of prime importance. Engineers also need to produce these products the customer wants as economically as possible. The best product in the world wont sell if its too expensive. And, if we develop products using inappropriate practices and processes, our products will be too expensive. As engineers, we need to build valuable product for our customers.
- Responsibility for correctness, suitability, and safety. Engineers are ethically obligated to ensure their programs are correct and suitable for their customers. In fact, the software engineering code of ethics [] authored by professional society ACM2 states that software engineers shall commit themselves to making the analysis, specification, design, development, testing and maintenance of software a beneficial and respected profession for the benefit and protection of the health, safety and welfare of the public. In some instances, our programs have safety critical implications, where people might die if a program has errors. In other cases, whole businesses could be at risk if a program is not correct or contains security vulnerabilities that enable attackers to steal or delete data. We are sure that you have always tried to get your programs to be correct and suitable in the past. The new dimension now is that you must always consider your responsibility and obligation to your customer. The work you do could impact their safety, their business... and their well being!
- 2Software Development
In addition to the ACM professional society, our field had a second professional society IEEE. IEEE]. The systematic, disciplined, quantifiable approach is often termed a software process model (in the general sense) or a software development process (in the specific sense). Specific software development processes consist of a particular set of software development practices, which are often performed by the software engineer in a predetermined order. Software development practices, models, and methodologies will be introduced in the next two subsections.
- 2.1Software Development Practices
Engineers adopt a systematic and organized approach to their work. As you learn software engineering, you should be exposed to many specific practices (or techniques) for developing software. By software developmentpractice we refer to a requirement employed to prescribe a disciplined, uniform approach to the software development process [], in other words, a well-defined activity that contributes toward the satisfaction of the project goals; generally the output of one practice becomes the input of another practice. As a software engineer, you should learn as many different types of software development practices as possible. Then, based upon the project and the people on your team, you can decide the right set of practices to take out of your practice bag to use on that particular project. In this book, you will learn practices you can deposit in your bag and about selecting an appropriate set of practices for a project and a team.
First, we provide one list of software development practices (but this list may vary depending upon the process and its associated terminology):
- Requirements engineering
- System analysis
- High-level design/architecture
- Low-level design
- Coding
- Integration
- Design and code reviews
- Testing
- Maintenance
- Project management