Preface PART 1 Introduction to Software Engineering Chapter 1 The Scope of Software Engineering 1.1 Historical Aspects 1.2 Economic Aspects 1.3 Maintenance Aspects 1.4 Specification and Design Aspects 1.5 Team Programming Aspects 1.6 The Object-Oriented Paradigm 1.7 Terminology Chapter Review For Further Reading Problems References Chapter 2 The Software Process 2.1 Client, Developer, and User 2.2 Requirements Phase 2.2.1 Requirements Phase Testing 2.2.2 Requirements Phase Documentation 2.3 Specification Phase 2.3.1 Specification Phase Testing 2.3.2 Specification Phase Documentation 2.4 Design Phase 2.4.1 Design Phase Testing 2.4.2 Design Phase Documentation 2.5 Implementation Phase 2.5.1 Implementation Phase Testing 2.5.2 Implementation Phase Documentation 2.6 Integration Phase 2.6.1 Integration Phase Testing 2.6.2 Integration Phase Documentation 2.7 Maintenance Phase 2.7.1 Maintenance Phase Testing 2.7.2 Maintenance Phase Documentation 2.8 Retirement 2.9 Problems with Software Production: Essence and Accidents 2.9.1 Complexity 2.9.2 Conformity 2.9.3 Changeability 2.9.4 Invisibility 2.9.5 No Si1verBullet? 2.10 Improving the Software Process 2.11 Capability Maturity Models 2.12 Other Software Process Improvement Initiatives 2.13 Costs and Benefits of Software Process Improvement Chanter Review For Further Reading Problems References Chapter 3 Software Life-Cycle Models 3.1 Build-and-Fix Model 3.2 Waterfall Model 3.2.1 Analysis of the Waterfall Model 3.3 Rapid Prototyping Model 3.3.1 Integrating the Waterfall and Rapid Prototyping Models 3.4 Incremental Model 3.4.1 Analysis of the Incremental Model 3.5 Extreme Programming 3.6 Synchronize-and-Stabilize Model 3.7 Spiral Model 3.7.1 Analysis of the Spiral Model 3.8 Object-Oriented Life-Cycle Models 3.9 Comparison of Life-Cycle Models Chapter Review For Further Reading Problems References Chapter 4 Teams 4.1 Team Organization 4.2 Democratic Team Approach 4.2.1 Analysis of the Democratic Team Approach 4.3 Classical Chief Programmer Team Approach 4.3.1 The New York Times Project 4.3.2 Impracticality of the Classical Chief Programmer Team Approach 4.4 Beyond Chief Programmer and Democratic Teams 4.5 Synchronize-and-Stabilize Teams 4.6 Extreme Programming Teams Chapter Review For Further Reading Problems References Chapter 5 The Tools Of the Trade 5.1 Stepwise Refinement 5.1.1 Stepwise Refinement Example 5.2 Cost-Benefit Analysis 5.3 Software Metrics 5.4 CASE 5.5 Taxonomy of CASE 5.6 Scope of CASE 5.7 Software Versions 5.7.1 Revisions 5.7.2 Variations 5.8 Configuration Control 5.8.1 Configuration Control during Product Maintenance 5.8.2 Baselines 5.8.3 Configuration Control during Product Development 5.9 Build Tools 5.10 Productivity Gains with CASE Technology Chapter Review For Further Reading Problems References Chapter 6 Testing 6.1 Quality Issues 6.1.1 Software Quality Assurance 6.1.2 Managerial Independence 6.2 Nonexecution-Based Testing 6.2.1 Walkthroughs 6.2.2 Managing Walkthroughs 6.2.3 Inspections 6.2.4 Comparison of Inspections and Walkthroughs 6.2.5 Strengths and Weaknesses of Reviews 6.2.6 Metrics for Inspections 6.3 Execution-Based Testing 6.4 What Should Be Tested? 6.4.1 Utility 6.4.2 Reliability 6.4.3 Robustness 6.4.4 Performance 6.4.5 Correctness 6.5 Testing versus Correctness Proofs 6.5.1 Example of a Correctness Proofs 6.5.2 Correctness Proof Case Study 6.5.3 Correctness Proof and Software Engineering 6.6 Who Should Perform Execution-Based Testing? 6.7 When Testing Stops Chapter Review For Further Reading Problems References Chapter 7 From Modules to Objects 7.1 What Is a Module? 7.2 Cohesion 7.2.1 Coincidental Cohesion 7.2.2 Logical Cohesion 7.2.3 Temporal Cohesion 7.2.4 Procedural Cohesion 7.2.5 Communicational Cohesion 7.2.6 Functional Cohesion 7.2.7 Informational Cohesion 7.2.8 Cohesion Example 7.3 Coupling 7.3.1 Content Coupling 7.3.2 Common Coupling 7.3.3 Control Coupling 7.3.4 Stamp Coupling 7.3.5 Data Coupling 7.3.6 Coupling Example 7.3.7 The Importance of Coupling 7.4 Data Encapsulation 7.4.1 Data Encapsulation and Product Development 7.4.2 Data Encapsulation and Product Maintenance 7.5 Abstract Data Types 7.6 Infromation Hiding 7.7 Objects 7.8 Inheritance, Polymorphism, and Dynamic Binding 7.9 Cohesion and Coupling of Objects 7.10 The Object-Oriented Paradigm Chapter Review For Further Reading Problems References Chapter 8 Reusability Portability, and Interoperability 8.1 Reuse Concepts 8.2 Impediments to Reuse 8.3 Reuse Case Studies 8.3.1 Raytheon Missi1e Systems Division 8.3.2 Toshiba software Factory 8.3.3 NASA Software 8.3.4 GTE Data Services 8.3.5 Hewlett-Packard 8.3.6 European Space Agency 8.4 Objects and Reuse 8.5 Reuse during the Design and Implementation Phases 8.5.1 Design Reuse 8.5.2 Application Frameworks 8.5.3 Design Patterns 8.5.4 Software Architecture 8.6 Reuse and Maintenance 8.7 Portability 8.7.1 Ware Incompatibilities 8.7.2 Operating Systems Incompatibilities 8.7.3 Numerical Software Incompatibilities 8.7.4 Compiler Incompatibilities 8.8 Why Portability? 8.9 Techniques for Achieving Portability 8.9.1 Portable System Software 8.9.2 Portable Application Software 8.9.3 Portable Data 8.10 Interoperability 8.10.1 COM 8.10.2 CORBA 8.10.3 Comparing COM and CORBA 8.11 Future Trends in Interoperability Chapter Review For Further Reading Problems References Chapter 9 Planning and Estimating 9.1 Planning and the Software Process 9.2 Estimating Duration and Cost 9.2.1 Metrics for the Size of a Product 9.2.2 Techniques of Cost Estimation 9.2.3 Intermediate COCOMO 9.2.4 COCOMO II 9.2.5 Tracking Duration and Cost Estimates 9.3 Components of a Software Project Management Plan 9.4 software Project Management Plan Framework 9.5 IEEE Software Project Management Plan 9.6 Planning Testing 9.7 Planning Object-Oriented Projects 9.8 Training Requirements 9.9 Documentation Standards 9.10 CASE Tools for Planning and Estimating 9.11 Testing the Software Project Management Plan Chapter Review For Further Reading Problems References PART 2 The Phases of the Software Life Cycle Chapter 1O Requirements Phase 10.1 Requirements Elicitation 10.1.1 Interviews 10.1.2 Scenarios 10.1.3 Other Requirements Elicitation Techniques 10.2 Requirements Analysis 10.3 Rapid Prototyping 10.4 Human Factors 10.5 Rapid Prototyping as a Specification Technique 10.6 Reusing the Rapid Prototype 10.7 Management Implications of the Rapid Prototyping Model 10.8 Experiences with Rapid Prototyping 10.9 Techniques for Requirements Elicitation and Analysis 10.10 Testing during the Requirements Phase 10.11 CASE Tools for the Requirements Phase 10.12 Metrics for the Requirements Phase 10.13 Object-Oriented Requirements? 10.14 Air Gourmet Case Study: Requirements Phase 10.15 Air Gourmet Case Study: Rapid Prototype 10.16 Challenges of the Requirements Phase Chapter Review For Further Reading Problems References Chapter 11 Specification Phase 11.1 The Specification Document 11.2 Informal Specifications 11.2.1 Case Study: Text Processing 11.3 Structured Systems Analysis 11.3.1 Sally's Software Shop 11.4 Other Semiformal Techniques 11.5 Entity-Relationship Modeling 11.6 Finite State Machines 11.6.1 Elevator Problem: Finite State Machines 11.7 Petri Nets 11.7.1 Elevator Problem: Petri Nets 11.8 Z 11.8.1 Elevator Problem: Z 11.8.2 Analysis of Z 11.9 Other Formal Techniques 11.10 Comparison of Specification Techniques 11.11 Testing during the Specification Phase 11.12 CASE Tools for the Specification Phase 11.13 Metrics for the Specification Phase 11.14 Air Gourmet Case Study: Structured Systems Analysis 11.15 Air Gourmet Case Study: Software Project Management Plan 11.16 Challenges of the Specification Phase Chapter Review For Further Reading Problems References Chapter 12 Object-Oriented Analysis Phase 12.1 Object-Oriented Analysis 12.2 Elevator Problem: Object-Oriented Analysis 12.3 Use-Case Modeling 12.4 Class Modeling 12.4.1 Noun Extraction 12.4.2 CRC Cards 12.5 Dynamic Modeling 12.6 Testing during the Object-Oriented Analysis Phase 12.7 CASE Tools for the Object-Oriented Analysis Phase 12.8 Air Gourmet Case Study: Object-Oriented Analysis 12.9 Challenges of the Object-Oriented Analysis Phase Chapter Review For Further Reading Problems References Chapter 13 Design Phase 13.1 Design and Abstraction 13.2 Action-Oriented Design 13.3 Data Flow Analysis 13.3.1 Data Flow Analysis Example 13.3.2 Extensions 13.4 Transaction Analysis 13.5 Data-Oriented Design 13.6 Object-Oriented Design 13.7 Elevator Problem: Object-Oriented Design 13.8 Formal Techniques for Detailed Design 13.9 Real-Time Design Techniques 13.10 Testing during the Design Phase 13.11 CASE Tools for the Design Phase 13.12 Metrics for the Design Phase 13.13 Air Gourmet Case Study: Object-Oriented Design 13.14 Challenges of the Design Phase Chapter Review For Further Reading Problems References Chapter 14 Implementation Phase 14.1 Choice of Programming Language 14.2 Fourth-Generation Languages 14.3 Good Programming Practice 14.4 Coding Standards 14.5 Module Reuse 14.6 Module Test Case Selection 14.6.1 Testing to Specifications versus Testing to Code 14.6.2 Feasibility of Testing to Specifications 14.6.3 Feasibility of Testing to Code 14.7 Black-Box Module-Testing Techniques 14.7.1 Equivalence Testing and Boundary Value Analysis 14.7.2 Functional Testing 14.8 Glass-Box Module-Testing Techniques 14.8.1 Structural Testing: Statement, Branch, and Path Coverage 14.8.2 Complexity Metrics 14.9 Code Walkthroughs and Inspections 14.10 Comparison of Module-Testing Techniques 14.11 Cleanroom 14.12 Potential Problems When Testing Objects 14.13 Management Aspects of Module Testing 14.14 When to Rewrite Rather than Debug a Module 14.15 CASE Tools for the Implementation Phase 14.16 Air Gourmet Case Study: Black-Box Test Cases 14.17 Challenges of the Implementation Phase Chapter Review For Further Reading Problems References Chapter 15 Implementation and Integration Phase 15.1 Introduction to Implementation and Integration 15.1.1 Top-down Implementation and Integration 15.1.2 Bottom-up Implementation and Integration 15.1.3 Sandwich Implementation and Integration 15.1.4 Implementation and Integration of Object-Oriented Products 15.1.5 Management Issues during the Implementation and Integration Phase 15.2 Testing during the Implementation and Integration Phase 15.3 Integration Testing of Graphical User Interfaces 15.4 Product Testing 15.5 Acceptance Testing 15.6 CASE Tools for the Implementation and Integration Phase 15.6 CASE Tools for the Complete Software Process 15.8 Integrated Environments 15.9 Environments for Business Applications 15.10 Public Tool Infrastructures 15.11 Potential Problems with Environments 15.12 Metrics for the Implementation and Integration Phase 15.13 Air Gourmet Case Study: Implementation and Integration Phase 15.14 Challenges of the Implementation and Integration Phase Chapter Review For Further Reading Problems References Chapter 16 Maintenance Phase 16.1 Why Maintenance Is Necessary 16.2 What Is Required of Maintenance Programmers 16.3 Maintenance Case Study 16.4 Management of Maintenance 16.4.1 Fault Reports 16.4.2 Authorizing Changes to the Product 16.4.3 Ensuring Maintainability 16.4.4 Problem of Repeated Maintenance 16.5 Maintenance of Object-Oriented Software 16.6 Maintenance Skills versus Development Skills 16.7 Reverse Engineering 16.8 Testing during the Maintenance Phase 16.9 CASE Tools for the Maintenance Phase 16.10 Metrics for the Maintenance Phase 16.11 Air Gourmet Case Study: Maintenance Phase 16.12 Challenges of the Maintenance Phase Chapter Review For Further Reading Problems References Appendix A Broadlands Area Children's Hospital Appendix B Software Engineering Resources Appendix C Air Gourmet Case Study: C Rapid Prototype Appendix D Air Gourmet Case Study: Java Rapid Prototype Appendix E Air Gourmet Case Study: Structured Systems Analysis Appendix F Air Gourmet Case Study: Software Project Management Plan Appendix G Air Gourmet Case Study: Object-Object-Oriented Analysis Appendix H Air Gourmet Case Study: Design for C++ Implementation Appendix I Air Gourmet Case Study: Design for Java Implementation Appendix J Air Gourmet Case Study: Black-Box Test Cases Appendix K Air Gourmet Case Study: C++ Source Code Appendix L Air Gourmet Case Study: Java Source Code Bibliography Author Index Subject Index