| |
| |
Foreword | |
| |
| |
Preface | |
| |
| |
| |
Engineering and Software | |
| |
| |
| |
Concepts of Software Development | |
| |
| |
| |
Separation of Concerns | |
| |
| |
| |
Management vs. Technical | |
| |
| |
| |
Teamwork vs. Individual Effort | |
| |
| |
| |
Different Tasks--Development Phases | |
| |
| |
| |
Phases of the Software Life Cycle | |
| |
| |
| |
Information Exchange Between Developer and End User | |
| |
| |
| |
Complete Problem Description (Developer Only) | |
| |
| |
| |
Break Down into Detailed Assignments for Programming | |
| |
| |
| |
Programming | |
| |
| |
| |
Testing | |
| |
| |
| |
Changing the Program | |
| |
| |
| |
Naming the Development Phases | |
| |
| |
| |
The Business of Developing Software | |
| |
| |
| |
Time to Market | |
| |
| |
| |
Perceived Software Quality | |
| |
| |
| |
The Software Development Team | |
| |
| |
| |
Managing Development | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Some Principles of Software Development | |
| |
| |
| |
Intellectual Control | |
| |
| |
| |
Complexity and Control | |
| |
| |
| |
Language Betrays Us | |
| |
| |
| |
Divide and Conquer | |
| |
| |
| |
Independent Parts | |
| |
| |
| |
7 [plus or minus] 2 Rule | |
| |
| |
| |
Hierarchies | |
| |
| |
| |
Know When to Stop | |
| |
| |
| |
Identify the "Customers" | |
| |
| |
| |
Fuzzy into Focus | |
| |
| |
| |
Document It! | |
| |
| |
| |
Record It or It's Lost | |
| |
| |
| |
Know What You've Assumed | |
| |
| |
| |
Traceability | |
| |
| |
| |
A (Document) Place for Everything and Everything in Its Place | |
| |
| |
| |
Documentation Isn't a Novel | |
| |
| |
| |
Input/Output Is the Essence of Software | |
| |
| |
| |
Too Much Engineering Is Not a Good Thing | |
| |
| |
| |
If It Ain't Broke Don't Fix It | |
| |
| |
| |
The "Creeping Feature Creature" | |
| |
| |
| |
Expect to Deal with Change | |
| |
| |
| |
Plan for It | |
| |
| |
| |
Fix It Now | |
| |
| |
| |
Reuse Past Work | |
| |
| |
| |
Previous Work Well Done Is Golden | |
| |
| |
| |
Create Software So that Reuse Is Possible | |
| |
| |
| |
Don't Reinvent the Wheel | |
| |
| |
| |
Take Responsibility | |
| |
| |
| |
Summary of Software Engineering Principles | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Is It Really Engineering? | |
| |
| |
| |
What's Different About Software? | |
| |
| |
| |
Artificial Science | |
| |
| |
| |
The Analogy to Other Professions | |
| |
| |
| |
Civil Engineering | |
| |
| |
| |
Architecture | |
| |
| |
| |
Mechanical/Aeronautical Engineering | |
| |
| |
| |
Computer (Hardware) Engineering | |
| |
| |
| |
Medicine | |
| |
| |
| |
Responsibility of Software Developers | |
| |
| |
| |
Engineering Institutions | |
| |
| |
| |
Market Forces | |
| |
| |
| |
The Legal System | |
| |
| |
| |
Warranties | |
| |
| |
| |
Professional Organizations | |
| |
| |
| |
Government Regulation | |
| |
| |
| |
Professional Engineers and Accreditation | |
| |
| |
| |
"Software Engineers" Are Legal Only in Texas | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Management and Process | |
| |
| |
| |
The Controversy over "Process" | |
| |
| |
| |
Fred Taylor's Scientific Management | |
| |
| |
| |
Program Development as a Formal Process | |
| |
| |
| |
Capability Maturity Model | |
| |
| |
| |
Process Management Isn't for Every Organization | |
| |
| |
| |
Engineering Management | |
| |
| |
| |
Metrics | |
| |
| |
| |
Estimation Models | |
| |
| |
| |
Feedback from Metrics | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
The "Life Cycle" of Software | |
| |
| |
| |
Alternatives to the Waterfall Model | |
| |
| |
| |
The Spiral Model | |
| |
| |
| |
Exploratory Programming | |
| |
| |
| |
Opportunistic Development | |
| |
| |
| |
The Phases of Development | |
| |
| |
| |
Requirements | |
| |
| |
| |
Specification | |
| |
| |
| |
Design | |
| |
| |
| |
Code | |
| |
| |
| |
Testing | |
| |
| |
| |
Software Inspection | |
| |
| |
| |
Inspection Works | |
| |
| |
| |
The Participants and the Procedure | |
| |
| |
| |
Inspection Is Expensive | |
| |
| |
| |
What Can an Individual Do? | |
| |
| |
| |
Maintenance Throughout the Life Cycle | |
| |
| |
| |
Debugging | |
| |
| |
| |
Configuration Management | |
| |
| |
| |
Managing a Development Life Cycle | |
| |
| |
| |
Progress Reports | |
| |
| |
| |
Dividing Effort Among the Phases | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
The Test Plan | |
| |
| |
| |
Functional Testing | |
| |
| |
| |
System-Level Functional Testing | |
| |
| |
| |
Functional Unit Testing | |
| |
| |
| |
Normal vs. Exception Test Cases | |
| |
| |
| |
Broken-Box Testing | |
| |
| |
| |
Fault-Based Testing | |
| |
| |
| |
An Example | |
| |
| |
| |
Interface Testing | |
| |
| |
| |
Boundary-Value Tests | |
| |
| |
| |
Test Plan Throughout the Life Cycle | |
| |
| |
| |
Adding Systematic Testing to the Plan | |
| |
| |
| |
After Testing | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Requirements and Specification | |
| |
| |
| |
Requirements | |
| |
| |
| |
Exploring Requirements | |
| |
| |
| |
Requirements Describe a Software Transform | |
| |
| |
| |
Identification of System Inputs and Output | |
| |
| |
| |
Partitioning Inputs and Outputs | |
| |
| |
| |
Exploring Relationships Between Inputs and Outputs | |
| |
| |
| |
From Requirements to the Test Plan | |
| |
| |
| |
Example: Printing Trees | |
| |
| |
| |
Pinning Down the Output Format | |
| |
| |
| |
The Input Format | |
| |
| |
| |
Specifications That Are Not of Concern to the User | |
| |
| |
| |
Commentary on the Example | |
| |
| |
| |
Software "Modes" | |
| |
| |
| |
Rapid Prototyping | |
| |
| |
| |
Managing the Requirements Phase | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Properties of Good Requirements | |
| |
| |
| |
Understandable by End Users | |
| |
| |
| |
Nonprescriptive | |
| |
| |
| |
Correct | |
| |
| |
| |
Complete | |
| |
| |
| |
Concise (Succinct) | |
| |
| |
| |
Precise | |
| |
| |
| |
Clear | |
| |
| |
| |
Unambiguous | |
| |
| |
| |
Consistent | |
| |
| |
| |
Traceable | |
| |
| |
| |
Modifiable | |
| |
| |
| |
Testable (Verifiable) | |
| |
| |
| |
Feasible | |
| |
| |
| |
Summary: How to Write Requirements? | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Specification | |
| |
| |
| |
Customers and Their Needs | |
| |
| |
| |
Sharpening Requirements into Specifications | |
| |
| |
| |
When the End User "Doesn't Care" | |
| |
| |
| |
Internal ("System") Errors | |
| |
| |
| |
Using a Specification as a Test Oracle | |
| |
| |
| |
Writing a Specification Only to Discard It | |
| |
| |
| |
The Uses of Formalism | |
| |
| |
| |
Informal Formalism | |
| |
| |
| |
The Opportunity to Verify | |
| |
| |
| |
Formal Specification and Design Methods | |
| |
| |
| |
Finite State Machine Design | |
| |
| |
| |
Object-Oriented Design | |
| |
| |
| |
Design with Data Flow Diagrams | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Formal Methods | |
| |
| |
| |
Specification Languages | |
| |
| |
| |
Enabling Human Talent | |
| |
| |
| |
Hard-to-Use Mathematics | |
| |
| |
| |
First-Order Predicate Logic | |
| |
| |
| |
Example: Sorting | |
| |
| |
| |
A First Try | |
| |
| |
| |
Restricting the Input | |
| |
| |
| |
Second Try | |
| |
| |
| |
"Programming" a Specification | |
| |
| |
| |
Prolog: A Quick Introduction | |
| |
| |
| |
Prolog as a Specification Language | |
| |
| |
| |
Prolog and First-Order Logic--Correct Specifications | |
| |
| |
| |
The Controversy over "Formal Methods" | |
| |
| |
| |
Dangerous Software | |
| |
| |
| |
Can Formal Methods Make Software Safe? | |
| |
| |
| |
Mathematical Precision for Its Own Sake | |
| |
| |
| |
Mathematical Precision for Proof | |
| |
| |
| |
The Formal Methodists' Dream | |
| |
| |
| |
The "Agnostic" Position | |
| |
| |
| |
Formal Specifications as Automatic Oracles | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Design and Coding | |
| |
| |
| |
Software Design | |
| |
| |
| |
Purposes of Design | |
| |
| |
| |
What Is a Design? | |
| |
| |
| |
General Design Ideas | |
| |
| |
| |
Iterative Enhancement | |
| |
| |
| |
Step-Wise Refinement | |
| |
| |
| |
Information Hiding | |
| |
| |
| |
Adding to the Test Plan in Design | |
| |
| |
| |
The Designer's Art | |
| |
| |
| |
By Engineers for Engineers | |
| |
| |
| |
From Requirements to Design | |
| |
| |
| |
Common, Needed Functions | |
| |
| |
| |
Major Data Structures | |
| |
| |
| |
Major Algorithms | |
| |
| |
| |
High-Level ("Architectural") Design | |
| |
| |
| |
Designing Major Subsystems | |
| |
| |
| |
Traceability Matrices | |
| |
| |
| |
Subsystem Interfaces | |
| |
| |
| |
Environment Interface | |
| |
| |
| |
Detailed Design | |
| |
| |
| |
Decomposition of Subsystems into Modules | |
| |
| |
| |
Designing Major Modules of a Subsystem | |
| |
| |
| |
Defining Module Interfaces | |
| |
| |
| |
Specifying the Module Functions | |
| |
| |
| |
Module Documentation | |
| |
| |
| |
Formal Notations for Design | |
| |
| |
| |
Architectural Diagrams | |
| |
| |
| |
Design Formalisms | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Coding | |
| |
| |
| |
Programming Languages | |
| |
| |
| |
Strong Typing | |
| |
| |
| |
User-defined Types | |
| |
| |
| |
Encapsulation for Data Abstractions | |
| |
| |
| |
Run-Time Checking | |
| |
| |
| |
Program Redundancy Checking | |
| |
| |
| |
Assertions | |
| |
| |
| |
And When a Problem Is Caught--What Then? | |
| |
| |
| |
Macro Capability | |
| |
| |
| |
Programming-Language Libraries | |
| |
| |
| |
Error-Prone Programming Language Constructions | |
| |
| |
| |
Choosing a Programming Language | |
| |
| |
| |
Languages for Rapid Prototyping | |
| |
| |
| |
Support Tools for Programming | |
| |
| |
| |
Language Analyzers--LCLint | |
| |
| |
| |
File Utilities | |
| |
| |
| |
Shell Command Scripts | |
| |
| |
| |
grep Searches | |
| |
| |
| |
Programmed Searches and Edits | |
| |
| |
| |
Comparing Files | |
| |
| |
| |
The make Utility | |
| |
| |
| |
Version-Control Tools | |
| |
| |
| |
Adding to the Test Plan While Coding | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Pseudocode | |
| |
| |
| |
Designing with Pseudocode | |
| |
| |
| |
Example of Pseudocode: Zipf's Law | |
| |
| |
| |
Test Plan for the Zipf's Law Software | |
| |
| |
| |
Implementing Pseudocode | |
| |
| |
| |
C Implementation of Zipf's Law | |
| |
| |
| |
Implementing Zipf's Law in a Shell Script | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Finite State Machines | |
| |
| |
| |
Designing with FSMs | |
| |
| |
| |
Formal Finite State Automata | |
| |
| |
| |
Example FSM: The C scanf () Conversion | |
| |
| |
| |
Designing a Simple GUI as an FSM | |
| |
| |
| |
Test Plan for the GUI | |
| |
| |
| |
Model Checking | |
| |
| |
| |
Coding an FSM Design | |
| |
| |
| |
Implementation Techniques | |
| |
| |
| |
Implementing Transgressions of FSM Formalism | |
| |
| |
How Does It Fit? | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Abstract Data Types (ADTs) | |
| |
| |
| |
Hiding Design Decisions | |
| |
| |
| |
ADT Signatures and Axioms--Boolean Example | |
| |
| |
| |
Signature Diagram | |
| |
| |
| |
Algebraic Axioms | |
| |
| |
| |
Encapsulation and C | |
| |
| |
| |
Example: The ADT IntSet | |
| |
| |
| |
Signature for IntSet | |
| |
| |
| |
English Specification | |
| |
| |
| |
Design of IntSet | |
| |
| |
| |
Testing IntSet | |
| |
| |
| |
Implementing an ADT | |
| |
| |
| |
Implementing a Boolean ADT | |
| |
| |
| |
Encapsulation: Header Files | |
| |
| |
| |
Correctness of ADT Implementations | |
| |
| |
| |
Implementing the IntSet ADT in C | |
| |
| |
| |
Instrumenting the ADT's Memory Allocation | |
| |
| |
| |
Local Variables of the ADT Type | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Object-Oriented Design | |
| |
| |
| |
Real Objects and Software Objects | |
| |
| |
| |
What is a Software Object? | |
| |
| |
| |
The Object Paradigm | |
| |
| |
| |
Object-Oriented Requirements | |
| |
| |
| |
Modeling the Physical World | |
| |
| |
| |
The Role of Requirements | |
| |
| |
| |
Booch Method | |
| |
| |
| |
Shlaer-Mellor Method | |
| |
| |
| |
Class-Responsibilities-Collaboration (CRC) Method | |
| |
| |
| |
Example: A Checkbook System | |
| |
| |
| |
Identification of Classes and Patterns | |
| |
| |
| |
Identification of Responsibilities | |
| |
| |
| |
Identification of Collaborators | |
| |
| |
| |
Polymorphism and Inheritance | |
| |
| |
| |
Identification and Use of Persistent Data | |
| |
| |
| |
Checking an Object Design for Implementation | |
| |
| |
| |
Object-Oriented Languages | |
| |
| |
| |
Smalltalk | |
| |
| |
| |
C++ | |
| |
| |
| |
Java | |
| |
| |
| |
A Brief Introduction to Java | |
| |
| |
| |
Objects and Classes | |
| |
| |
| |
Methods and Parameters | |
| |
| |
| |
Inheritance and Polymorphism | |
| |
| |
| |
Implementation of the Checkbook | |
| |
| |
| |
Implementation of the Account Class | |
| |
| |
| |
Implementation of the Transaction and Check Classes | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Data Flow Diagrams | |
| |
| |
| |
Elements of Data Flow Diagrams | |
| |
| |
| |
Data Transforms | |
| |
| |
| |
Information Flows | |
| |
| |
| |
Information Sources and Sinks | |
| |
| |
| |
Information Stores | |
| |
| |
| |
Example DFDs: A Payroll System | |
| |
| |
| |
Refining DFDs | |
| |
| |
| |
Heritage Numbers | |
| |
| |
| |
DFD Terminology | |
| |
| |
| |
The Data Dictionary | |
| |
| |
| |
Checking DFDs--CASE Tools | |
| |
| |
| |
Structure Charts | |
| |
| |
| |
The Central Transform | |
| |
| |
| |
Constructing Structure Charts | |
| |
| |
| |
Example Construction | |
| |
| |
| |
Implementing a DFD | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Wrapping up Design and Coding | |
| |
| |
| |
Additional Design Ideas | |
| |
| |
| |
The Universal Modeling Language (UML) | |
| |
| |
| |
Client--Server Design | |
| |
| |
| |
Choosing Design Techniques | |
| |
| |
| |
Recognizing a Design | |
| |
| |
| |
Which Formal Technique(s) Should I Use? | |
| |
| |
| |
Wrapping up the Code | |
| |
| |
| |
Documenting Choices | |
| |
| |
| |
Defensive Coding | |
| |
| |
| |
Managing the Design and Coding Phases | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Testing | |
| |
| |
| |
Software Testing | |
| |
| |
| |
Get out the Test Plan | |
| |
| |
| |
What Should Testing Accomplish? | |
| |
| |
| |
The Testing Process: Unit Testing Versus System Testing | |
| |
| |
| |
Unit Testing | |
| |
| |
| |
Test Harness and Stubs | |
| |
| |
| |
Subsystem Testing | |
| |
| |
| |
System Testing | |
| |
| |
| |
Inspection Versus Testing | |
| |
| |
| |
Managing the Testing Phase | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
Coverage-- "Systematic" Testing | |
| |
| |
| |
Dividing the Input Space for Failure Search | |
| |
| |
| |
Functional (Specification-Based, Black Box) Testing | |
| |
| |
| |
Structural (Code-Based) Testing | |
| |
| |
| |
Generating Code-Based Tests | |
| |
| |
| |
Misleading the Tester | |
| |
| |
| |
Test Oracles | |
| |
| |
| |
Structural Test Adequacy and Marick's Recommendation | |
| |
| |
| |
Variations on Coverage Testing | |
| |
| |
| |
Control-flow Graphs and Their Coverage | |
| |
| |
| |
Path Coverage | |
| |
| |
| |
Branch Coverage | |
| |
| |
| |
Testing "Tools" | |
| |
| |
| |
Tools to Manage the Testing Process | |
| |
| |
| |
Structural-coverage Measuring Tools | |
| |
| |
| |
More Complex Structural Coverage Criteria | |
| |
| |
| |
Dataflow Coverage | |
| |
| |
| |
Mutation Coverage | |
| |
| |
| |
Which Coverage Is Best? | |
| |
| |
| |
The "Subsumes" Relationship | |
| |
| |
| |
Choosing a Testing Method in Practice | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
| |
The Future of Testing | |
| |
| |
| |
Random Testing | |
| |
| |
| |
User Profile | |
| |
| |
| |
Random Input Values | |
| |
| |
| |
An Ideal Example of Random Testing | |
| |
| |
| |
Predicting Software Quality | |
| |
| |
| |
Reliability | |
| |
| |
| |
Dependability | |
| |
| |
| |
Automated Testing | |
| |
| |
| |
Regression Testing | |
| |
| |
| |
State of the Software Testing Art | |
| |
| |
How Does It Fit? | |
| |
| |
Review Questions | |
| |
| |
Further Reading | |
| |
| |
References | |
| |
| |
Answers and Hints for Selected Exercises | |
| |
| |
Index | |