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
• 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 (Brooks, 1995)
As a discipline, software engineering has progressed very far in a
very short period of time, particularly when compared to classical engineering
field (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. Errors in those systems generally had only
“annoying” consequences to the mathematician who was trying to find “the
answer.” Today we often build monstrous systems, in terms of size and
complexity. What is also notable is the progression in the past 50 years of the
visibility of the software 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.” (Pfleeger, 1998)
Despite our rapid progress, the software industry is considered by
many to be in a crisis. Some 40 years ago, the term “Software Crisis” emerged
to describe the software industry’s inability to provide customers with high
quality products on schedule. “The average software development project
overshoots its schedule by half; larger projects generally do worse. And, some
three quarters of all large systems are “operating failures” that either do not
function as intended or are not used at all.” (Gibbs, 1994) 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.
Software Development
Software
engineering is the application of a systematic, disciplined, quantifiable
approach to the development, operation, and maintenance of software; that is,
the application of engineering to software (IEEE, 1990). 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.
Software 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 development practice we refer to a requirement employed
to prescribe a disciplined, uniform approach to the software development
process (IEEE, 1990), 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. 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
• Configuration management
No comments:
Post a Comment