Software engineering
Computer programs, the software that is
becoming an ever-larger part of the computer
system, are growing more and more complicated, requiring
teams of programmers and years of effort to develop. As
a consequence, a new subdiscipline, software
engineering, has arisen. The development of a large
piece of software is perceived as an engineering task,
to be approached with the same care as the construction
of a skyscraper, for example, and with the same
attention to cost, reliability, and maintainability of
the final product. The software-engineering process is
usually described as consisting of several phases,
variously defined but in general consisting of: (1)
identification and analysis of user requirements, (2)
development of system specifications (both hardware and
software), (3) software design (perhaps at several
successively more detailed levels), (4) implementation
(actual coding), (5) testing, and (6) maintenance.
Even with such an engineering discipline in place,
the software-development process is expensive and
time-consuming. Since the early 1980s, increasingly
sophisticated tools have been built to aid the software
developer and to automate as much as possible the
development process. Such computer-aided software
engineering (CASE) tools span a wide range of types,
from those that carry out the task of routine coding
when given an appropriately detailed design in some
specification language to those that incorporate an
expert system to enforce design rules and eliminate
software defects prior to the coding phase.
As the size and complexity of software has grown, the
concept of reuse has become increasingly important in
software engineering, since it is clear that extensive
new software cannot be created cheaply and rapidly
without incorporating existing program modules
(subroutines, or pieces of computer code). One of
the attractive aspects of object-oriented programming
(see below Programming languages ) is that code written
in terms of objects is readily reused. As with other
aspects of computer systems, reliability--usually
rather vaguely defined as the likelihood of a system to
operate correctly over a reasonably long period of
time--is a key goal of the finished software product.
Sophisticated techniques for testing software have
therefore been designed. For example, a large software
product might be deliberately "seeded" with
artificial faults, or "bugs"; if they are all
discovered through testing, there is a high probability
that most actual faults likely to cause computational
errors have been discovered as well. The need for better
trained software engineers has led to the development of
educational programs in which software engineering is
either a specialization within computer science
or a separate program. The recommendation that software
engineers, like other engineers, be licensed or
certified is gaining increasing support, as is the
momentum toward the accreditation of software
engineering degree programs.
|