SSD9 - Software Specification, Testing, and Maintenance
Software Systems Development 9
Software Specification, Testing, and Maintenance
This course is an introduction to software engineering. Software engineering includes
the principles and practices that contribute to producing better software and to making
software development more predictable and economical. You will learn about how
software development practices have changed in the last few decades and about the
different phases that a software product goes through. For each phase of software
development, you will study specific techniques for improving the quality of products
and you will read about the interactions and expectations of groups and organizations
that participate in the software development process.
The course is organized into eight units, each with several sections. All units have a
multiple-choice quiz and all but the first unit contain a practical exercise. The
exercises are part of the project for the course and lead you to create a software
product from start to finish. There are also three in-class exams. You can read about
how to work through the quizzes, exercises, and exams in the course Help pages.
Prerequisites
SSD4 User-Centered Design and Testing; SSD7 Database Systems
Course Textbook
The required textbook for the course will be:
Schach, Stephen. Object-Oriented and Classical Software Engineering. 7th ed.
McGraw Hill Publishing Co., 2007. ISBN: 978-0-07-319126-3
OR
Schach, Stephen. Object-Oriented and Classical Software Engineering. 6th ed.
McGraw Hill Publishing Co., 2004. ISBN: 0-07-286551-2
Sixth edition of the book can be used instead of the new seventh edition;
copies of older editions may be available through sources that sell used books.
Important: Reading assignments given in the online notes are valid for any
edition unless otherwise noted. Where the readings for an edition differ from
the default, the page or section numbers are listed in parentheses for the
specified edition.
For your reference, Appendix B. Readings has a complete list of required
readings from the textbook.
Course Outcomes
1
SSD9 - Software Specification, Testing, and Maintenance
The purpose of SSD9 is for students to
1. Learn the principles and practices for producing better software
and for making software development more predictable and
economical
2. Learn to examine critically the different phases of a software
product's life cycle
3. Learn various approaches to software design and about the role
of software architecture in software design
4. Learn structured systems analysis, object-oriented analysis
(OOA), and object-oriented design (OOD)
5. Learn the different types of software testing, documentation,
and maintenance techniques
6. Learn to design and build Internet-based software projects of
significant scale, acquiring experience in all phases of the
software product life cycle
Students successfully completing SSD9 will be able to
I. Produce
1. Software systems based on customer requirements
2. Scope descriptions and requirements checklists by choosing a
suitable development model
3. Unified Modeling Language (UML) diagrams illustrating the
use cases identified for the software product
4. Use case scenarios for normal and abnormal use cases
5. A class list for a product using the noun extraction technique
6. Class diagrams and state transition diagrams using the UML
notation
7. Sequence diagrams and collaboration diagrams using UML
8. Detailed class diagrams, object interface specifications, and
skeletal Java class files
9. Detailed code documentation using Javadoc
10. Project implementation plans, test plans, and documents at
every phase
11. A final software system for demonstration
II. Use
1. OOA and OOD techniques
2
SSD9 - Software Specification, Testing, and Maintenance
2. Entity-relationship (ER) modeling techniques
3. The MySQL database system and Java Database Connectivity
(JDBC) for a project
4. Javadoc to produce documentation
5. Techniques for improving the quality of artifacts for each phase
of software development
III. Knowledgeably Discuss
1. Specification techniques that address the various software
engineering principles
2. Computer-aided software engineering (CASE) technology
3. Code reuse and design reuse
4. Managing maintenance: fault reports, fault prioritization
5. Maintenance of object-oriented software
IV. Hold Positions as Software Engineers
Those who certify in this course will be able to (a) develop software systems using
modern software engineering principles; (b) make decisions about selecting the
appropriate life-cycle model for software development; (c) develop documents
required by each life cycle of the software development process; and (d) develop test
plans and acceptance test plans for complex software projects.
Unit 1. Overview of Software Engineering
The overall goal of software engineering is the production of fault-free software that
satisfies the user's needs and that is delivered on time and within budget.
In this unit, we begin by examining some of the challenges of developing software,
and some of the myths that still surround the software development process. We then
look back at the evolution of software practices and at the concerns that motivated the
shift from a focus on programming to a wider view of software production. Next, we
introduce the stages of the software life cycle and consider their economic aspects.
The unit concludes with a brief review of some of the terminology that will be used
throughout the remainder of the course.
1.1 Software Challenges and Myths
1.2 History and Evolution
3
SSD9 - Software Specification, Testing, and Maintenance
1.3 Life Cycle and Economy
1.4 Terminology
Assessments
Multiple-Choice Quiz 1
1.1 Software Challenges and Myths
In this module we will briefly survey some of the challenges to be faced when
developing software, and some of the misconceptions about software development
that have sprung up over the relatively short history of large-scale software
production.
Just about anyone who has participated in developing software products of any
significant size or complexity will tell you two things. First, if there is something you
can count on, it is that it will take you longer to finish than you expect. Second, even
when you think the product is completed, problems will still be lurking that testing
will not have found. In the old days, people used to say that whatever time estimate
you thought was reasonable, you should multiply it at least by a factor of three, or ten.
From the perspective of a software development manager, development delays, and
errors found after delivery can incur unacceptable losses, which take the form of
additional (unexpected) costs and greatly diminished customer satisfaction and
confidence. In today's competitive environment, getting a product to market on time
and with as few residual "bugs" as possible can mean the difference between the
success and failure of a product, or even a company.
Why are the costs of software development so high? In part, because software
development frequently goes over the estimated time limits. So why does it take so
long to get programs finished? Why do we have difficulty measuring development
progress and why can we not find all errors before we deliver? These questions do not
have a simple answer because the software process is a complex one, involving
multiple parties who have different objectives and constraints. The actors in software
production—the customers, managers, and developers—may come into the process
with expectations and attitudes that, while seemingly reasonable, can contribute to
increasing the time and cost of product development. Some of these expectations and
attitudes, although mistaken, are quite widespread that they have acquired a mythical
status. We will review some of these myths below. (For additional myths, refer to
Pressman 2000, section 1.4.)
4
SSD9 - Software Specification, Testing, and Maintenance
Some mistaken perceptions about software development originate with the customer.
For example:
"A general statement of objectives is sufficient to begin writing programs — we can fill in
the details later."
"Project requirements continually change, but change can be easily accommodated,
because software is flexible."
Both of these myths reflect the perception that, because software can be changed more
easily than a manufactured product, it can be modified in response to changing
requirements at any point in the process, without paying any penalty. While it is true
that it is easier to change code than to change a manufactured product, the
repercussions of software changes go far beyond the actual change itself. In some
cases, the changes will be very localized and minor; in other cases, they may require
substantial redesign of the affected component, as well as interacting components. In
all cases, any change will require substantial testing to make sure that no new
problems have been inadvertently introduced.
Some of the misconceptions about software development come from the developers
themselves. For example:
"Once we write the program and get it to work, our job is done."
"The only deliverable for a successful project is the working program."
"Until I get the program running, I really have no way of assessing its quality."
While it is true that a working program is an essential component of successful
software development, it is by no means the only component. Depending on what
agreements have been reached for maintaining the software after delivery, either the
developer or the customer will need to make some modifications to the code. At that
point, it will be extremely important to have code that is clearly written and well
documented, since it is very likely that the programmers making the modifications
will not be the same ones who wrote the code initially. Even if the programmers were
the same, they would quickly find out how much they had forgotten about their own
programs! When it comes to assessing the quality of the program as well as its
ultimate correctness, other factors come into play. For example, we may ask whether
the assumptions made by each piece of the code are well defined, or whether a
complete test suite has been provided for the program, or for individual components
of the program. Being able to answer these questions positively will not only result in
a program that is easier to maintain, but will also help the programmer build
confidence in the building blocks of the system and assess its quality during
development. Formal software reviews that look at these aspects of the software will
also help to assess its quality.
Finally, some of the myths surrounding the need for software engineering may come
from the management of the organization where the product is being developed.
5
SSD9 - Software Specification, Testing, and Maintenance
Consider the following statements coming from a manager and, immediately
following them in each case, some objections that should be raised:
"We already have a book full of standards and procedures."
Any manager working in an organization whose daily running already requires adherence
to a number of standards and procedures is, understandably, reluctant to add more. Yet
those existing standards and procedures may have little impact on the quality of the
software process; perhaps they are outdated and do not reflect current practices, or
perhaps they are simply not applied.
"My people have state-of-the-art software development tools, because we bought them
the newest computers."
Hardware by itself contributes relatively little to high-quality software development; it is
more important to have good software tools and well-defined development practices.
"If we get behind schedule, we can just add more programmers."
Today's computers can run very large software products that would take a single person a
long time to develop. Although team programming permits the development of large
products in a short time by allowing work in parallel, it also introduces complexity.
Changes affecting the interface to modules of the system need to be distributed among all
programmers whose code interacts with those modules. Coordination among team
members may require lengthy meetings and conferences. When adding new programmers
to an ongoing project, one must consider the time that it will take the new programmers to
get up to speed and become productive, and the time required for existing team members
to train the newcomers, as well as any additional time required for communication and
coordination within the enlarged group.
While trying to debunk individual myths surrounding software development may be
useful in itself, the real solution for meeting the challenges of software production is
to provide a framework that supports constant, evolutionary improvement in product
and process, based on an explicit model of the development process. In Unit 2, we
will examine some of the models that have already been developed.
At the very beginning of this unit, we defined software engineering rather generally as
"a discipline whose aim is the production of fault-free software that satisfies the user's
needs and that is delivered on time and within budget." More specifically, software
engineering is an endeavor whose objective is to set realistic expectations regarding
the software development process, so these expectations can be satisfied. It achieves
its objective by planning for and tracking a development itinerary where the
functionality of a product matches its requirements, the development schedule
satisfies the constraints of both the customer and the developer, and the overall cost of
development does not exceed the budget provided for it. Knowing how to analyze and
6
SSD9 - Software Specification, Testing, and Maintenance
manipulate the trade-offs between what the customer wants and what the software
producer can provide under the given constraints is what separates a system engineer
from a mere programmer. From the software engineering point of view, actual coding
is a small part of the overall effort!
Finally, in the midst of hardware, software, schedules, and budgets, one should not
forget that, like many other enterprises, software production involves human
beings—the customers, the programmers, and the managers—and therefore software
engineering is directly concerned with managing people and facilitating
communication.
References
Pressman, Roger S. Software Engineering: A Practitioner's Approach. 4th ed. New
York: McGraw Hill, 2000.
1.2 History and Evolution
The goal of this module is to provide a brief history of software development, by
considering the evolution of software practices since the 1950s. The growing
complexity of software applications, together with the lessons learned from early
software projects, have made software engineering increasingly important in today's
use case.
Readings:
Schach, section 1.1.
In the 1950s and through much of the 1960s, hardware dominated the computer world.
Several years after the invention of the transistor in 1947, computers began scaling
down in size and cost. In 1954, IBM announced its first transistor-based computer and
by the late 1950s several organizations, companies, and universities had computers at
their disposal. At that time, computers were still very expensive and very large: a
computer significantly less powerful than today's laptop occupied as much as one or
two rooms, together with permanent storage devices and other accessories.
Management of computer production was substantially hardware oriented, and many
of the same practices applicable to the manufacturing of industrial products—formal
standards, quality controls, and cost controls—were applied to hardware. There was
7
SSD9 - Software Specification, Testing, and Maintenance
an area of expertise called hardware engineering, but the software itself was still
something of an afterthought.
With so much attention and capital going into hardware, software production and
programming was the purview of a few individuals who understood how to make all
that machinery do something useful. They worked with programming languages (like
assembly language) that few programmers would choose to use today. Programming
was definitely seen as more of an art than a science, and had little visibility at the
management level.
Programmers were given complete responsibility for the software, and it was common
for a programmer to begin coding without spending any time on analysis,
specification, or design. This approach led to an undisciplined style of programming,
following few if any formal methods and learning by trial and error. There was a lack
of predictability in the quality of the code, and a lack of accountability on the part of
its developers. It was difficult if not impossible to estimate how long a project would
take. Furthermore, the code was often poorly and incompletely documented causing a
severe problem for anyone taking over its maintenance from the original developers.
As computers became more widespread through the late 1960s and 1970s, the number
of people and organizations relying on hardware and software mushroomed, and the
disorderly world of software development was destined for reform. In the literature,
one finds references to the "software crisis" of the 1970s, an era when the quality of
software was generally unacceptably low, deadlines were seldom if ever met, and
costs sometimes went over budget to a significant degree. The costs of software
development began to overshadow the costs associated with hardware. It was clearly
time to replace the old CABTAB ("code a bit, test a bit . . . don't know how long it
will take") approach to programming, which had become too costly, with a new one
that emphasized formal methods for quality assessment and cost control.
Efforts from the 1970s through the 1990s focused on increasing understanding of the
science of programming, improving predictability of the software product and process,
and improving the accountability of the participants. The software development
process became a primary object of study for research and development, especially at
newly founded research institutions like Carnegie Mellon University's Software
Engineering Institute (http://www.sei.cmu.edu). Still, the problems of the original
"software crisis" have not been completely alleviated, and the effectiveness of
software development is still poor in many fields. Stephen Schach suggests in his
textbook that the "software crisis" should have been called the "software depression,"
because it has lasted significantly longer than a crisis normally does. Today software
has become ubiquitous and its quality is even more crucial. It drives business
decisions. It serves as the basis for solutions to science and engineering problems. It is
heavily relied upon by transportation and telecommunication systems, by the medical,
industrial, and military establishments, and by the ever-growing entertainment
8