You are previewing Software Engineering: Principles and Practice.
O'Reilly logo
Software Engineering: Principles and Practice

Book Description

Software Engineering: Principles and Practice challenges the reader to appreciate the issues, design trade-offs and teamwork required for successful software development. This new edition has been brought fully up to date, with complete coverage of all aspects of the software lifecycle and a strong focus on all the skills needed to carry out software projects on time and within budget. Highlights of the third edition include:

  • Fully updated chapters on requirements engineering and software architecture.

  • New chapters on component-based software engineering, service orientation and global software development.

  • Extensive coverage of the human and social aspects of software development.

  • Balanced coverage of both traditional, heavyweight development and agile, lightweight development approaches such as Extreme Programming (XP).

Written to support both introductory and advanced software engineering courses, this book is invaluable for everyone in software development and maintenance who wants an accessible account of the problems incurred in large-scale software development and the proposed solutions. A companion website with additional resources for students and instructors can be found at www.wileyeurope.com/college/van vliet

Table of Contents

  1. Copyright
  2. Foreword
  3. Preface
    1. SOFTWARE ENGINEERING
    2. LEARNING ABOUT SOFTWARE ENGINEERING
    3. WHAT'S CHANGED?
    4. ACKNOWLEDGEMENTS
  4. 1. Introduction
    1. 1.1. WHAT IS SOFTWARE ENGINEERING?
    2. 1.2. PHASES IN THE DEVELOPMENT OF SOFTWARE
    3. 1.3. MAINTENANCE OR EVOLUTION
    4. 1.4. FROM THE TRENCHES
      1. 1.4.1. Ariane 5, Flight 501
      2. 1.4.2. Therac-25
      3. 1.4.3. The London Ambulance Service
      4. 1.4.4. Who Counts the Votes?
    5. 1.5. SOFTWARE ENGINEERING ETHICS
    6. 1.6. QUO VADIS?
    7. 1.7. SUMMARY
    8. 1.8. FURTHER READING
      1. 1.8.1. Exercises
  5. I. Software Management
    1. 2. Introduction to Software Engineering Management
      1. 2.1. PLANNING A SOFTWARE DEVELOPMENT PROJECT
      2. 2.2. CONTROLLING A SOFTWARE DEVELOPMENT PROJECT
      3. 2.3. SUMMARY
        1. 2.3.1. Exercises
    2. 3. The Software Life Cycle Revisited
      1. 3.1. THE WATERFALL MODEL
      2. 3.2. AGILE METHODS
        1. 3.2.1. Prototyping
        2. 3.2.2. Incremental Development
        3. 3.2.3. Rapid Application Development and Dynamic Systems Development Method
        4. 3.2.4. Extreme Programming
      3. 3.3. THE RATIONAL UNIFIED PROCESS (RUP)
      4. 3.4. MODEL-DRIVEN ARCHITECTURE
      5. 3.5. INTERMEZZO: MAINTENANCE OR EVOLUTION
      6. 3.6. SOFTWARE PRODUCT LINES
      7. 3.7. PROCESS MODELING
      8. 3.8. SUMMARY
      9. 3.9. FURTHER READING
        1. 3.9.1. Exercises
    3. 4. Configuration Management
      1. 4.1. TASKS AND RESPONSIBILITIES
      2. 4.2. CONFIGURATION MANAGEMENT PLAN
      3. 4.3. SUMMARY
      4. 4.4. FURTHER READING
        1. 4.4.1. Exercises
    4. 5. People Management and Team Organization
      1. 5.1. PEOPLE MANAGEMENT
        1. 5.1.1. Coordination Mechanisms
        2. 5.1.2. Management Styles
      2. 5.2. TEAM ORGANIZATION
        1. 5.2.1. Hierarchical Organization
        2. 5.2.2. Matrix Organization
        3. 5.2.3. Chief Programmer Team
        4. 5.2.4. SWAT Team
        5. 5.2.5. Agile Team
        6. 5.2.6. Open Source Software Development
        7. 5.2.7. General Principles for Organizing a Team
      3. 5.3. SUMMARY
      4. 5.4. FURTHER READING
        1. 5.4.1. Exercises
    5. 6. On Managing Software Quality
      1. 6.1. ON MEASURES AND NUMBERS
      2. 6.2. A TAXONOMY OF QUALITY ATTRIBUTES
      3. 6.3. PERSPECTIVES ON QUALITY
      4. 6.4. THE QUALITY SYSTEM
      5. 6.5. SOFTWARE QUALITY ASSURANCE
      6. 6.6. THE CAPABILITY MATURITY MODEL (CMM)
        1. 6.6.1. Personal Software Process
        2. 6.6.2. BOOTSTRAP and SPICE
        3. 6.6.3. Some Critical Notes
      7. 6.7. GETTING STARTED
      8. 6.8. SUMMARY
      9. 6.9. FURTHER READING
        1. 6.9.1. Exercises
    6. 7. Cost Estimation
      1. 7.1. ALGORITHMIC MODELS
        1. 7.1.1. Walston—Felix
        2. 7.1.2. COCOMO
        3. 7.1.3. Putnam
        4. 7.1.4. Function Point Analysis
        5. 7.1.5. COCOMO 2: Variations on a Theme
        6. 7.1.6. Use-Case Points: Another Variation on a Theme
      2. 7.2. GUIDELINES FOR ESTIMATING COST
      3. 7.3. DISTRIBUTION OF MANPOWER OVER TIME
      4. 7.4. AGILE COST ESTIMATION
      5. 7.5. SUMMARY
      6. 7.6. FURTHER READING
        1. 7.6.1. Exercises
    7. 8. Project Planning and Control
      1. 8.1. A SYSTEMS VIEW OF PROJECT CONTROL
      2. 8.2. A TAXONOMY OF SOFTWARE DEVELOPMENT PROJECTS
        1. 8.2.1. Realization Control Situation
        2. 8.2.2. Allocation Control Situation
        3. 8.2.3. Design Control Situation
        4. 8.2.4. Exploration Control Situation
        5. 8.2.5. Summary of Control Situations
      3. 8.3. RISK MANAGEMENT
      4. 8.4. TECHNIQUES FOR PROJECT PLANNING AND CONTROL
      5. 8.5. SUMMARY
      6. 8.6. FURTHER READING
        1. 8.6.1. Exercises
  6. II. The Software Life Cycle
    1. 9. Requirements Engineering
      1. 9.1. REQUIREMENTS ELICITATION
        1. 9.1.1. Requirements Engineering Paradigms
        2. 9.1.2. Requirements Elicitation Techniques
        3. 9.1.3. Goals and Viewpoints
        4. 9.1.4. Prioritizing Requirements
        5. 9.1.5. COTS selection
        6. 9.1.6. Crowdsourcing
      2. 9.2. REQUIREMENTS DOCUMENTATION AND MANAGEMENT
        1. 9.2.1. Requirements Specification
        2. 9.2.2. Requirements Management
      3. 9.3. REQUIREMENTS SPECIFICATION TECHNIQUES
        1. 9.3.1. Choosing a Notation
        2. 9.3.2. Specifying Non-Functional Requirements
      4. 9.4. VERIFICATION AND VALIDATION
      5. 9.5. SUMMARY
      6. 9.6. FURTHER READING
        1. 9.6.1. Exercises
    2. 10. Modeling
      1. 10.1. CLASSIC MODELING TECHNIQUES
        1. 10.1.1. Entity—Relationship Modeling
        2. 10.1.2. Finite State Machines
        3. 10.1.3. Data Flow Diagrams
        4. 10.1.4. CRC Cards
      2. 10.2. ON OBJECTS AND RELATED STUFF
      3. 10.3. THE UNIFIED MODELING LANGUAGE
        1. 10.3.1. The Class Diagram
        2. 10.3.2. The State Machine Diagram
        3. 10.3.3. The Sequence Diagram
        4. 10.3.4. The Communication Diagram
        5. 10.3.5. The Component Diagram
        6. 10.3.6. The Use Case
      4. 10.4. SUMMARY
      5. 10.5. FURTHER READING
        1. 10.5.1. Exercises
    3. 11. Software Architecture
      1. 11.1. SOFTWARE ARCHITECTURE AND THE SOFTWARE LIFE CYCLE
      2. 11.2. ARCHITECTURE DESIGN
      3. 11.3. ARCHITECTURAL VIEWS
      4. 11.4. ARCHITECTURAL STYLES
      5. 11.5. SOFTWARE ARCHITECTURE ASSESSMENT
      6. 11.6. SUMMARY
      7. 11.7. FURTHER READING
        1. 11.7.1. Exercises
    4. 12. Software Design
      1. 12.1. DESIGN CONSIDERATIONS
        1. 12.1.1. Abstraction
        2. 12.1.2. Modularity
        3. 12.1.3. Information Hiding
        4. 12.1.4. Complexity
        5. 12.1.5. System Structure
        6. 12.1.6. Object-Oriented Metrics
      2. 12.2. CLASSICAL DESIGN METHODS
        1. 12.2.1. Functional Decomposition
        2. 12.2.2. Data Flow Design (SA/SD)
        3. 12.2.3. Design Based on Data Structures
      3. 12.3. OBJECT-ORIENTED ANALYSIS AND DESIGN METHODS
        1. 12.3.1. The Booch Method
        2. 12.3.2. Fusion
        3. 12.3.3. RUP Revisited
      4. 12.4. HOW TO SELECT A DESIGN METHOD
        1. 12.4.1. Design Method Classification
        2. 12.4.2. Object Orientation: Hype or the Answer?
      5. 12.5. DESIGN PATTERNS
      6. 12.6. DESIGN DOCUMENTATION
      7. 12.7. VERIFICATION AND VALIDATION
      8. 12.8. SUMMARY
      9. 12.9. FURTHER READING
        1. 12.9.1. Exercises
    5. 13. Software Testing
      1. 13.1. TEST OBJECTIVES
        1. 13.1.1. Test Adequacy Criteria
        2. 13.1.2. Fault Detection Versus Confidence Building
        3. 13.1.3. From Fault Detection to Fault Prevention
      2. 13.2. TESTING AND THE SOFTWARE LIFE CYCLE
        1. 13.2.1. Requirements Engineering
        2. 13.2.2. Design
        3. 13.2.3. Implementation
        4. 13.2.4. Maintenance
        5. 13.2.5. Test-Driven Development (TDD)
      3. 13.3. VERIFICATION AND VALIDATION PLANNING AND DOCUMENTATION
      4. 13.4. MANUAL TEST TECHNIQUES
        1. 13.4.1. Reading
        2. 13.4.2. Walkthroughs and Inspections
        3. 13.4.3. Correctness Proofs
        4. 13.4.4. Stepwise Abstraction
      5. 13.5. COVERAGE-BASED TEST TECHNIQUES
        1. 13.5.1. Control-Flow Coverage
        2. 13.5.2. Data Flow Coverage
        3. 13.5.3. Coverage-Based Testing of Requirements Specifications
      6. 13.6. FAULT-BASED TEST TECHNIQUES
        1. 13.6.1. Error Seeding
        2. 13.6.2. Mutation Testing
      7. 13.7. ERROR-BASED TEST TECHNIQUES
      8. 13.8. COMPARISON OF TEST TECHNIQUES
        1. 13.8.1. Comparison of Test Adequacy Criteria
        2. 13.8.2. Properties of Test Adequacy Criteria
        3. 13.8.3. Experimental Results
      9. 13.9. TEST STAGES
      10. 13.10. ESTIMATING SOFTWARE RELIABILITY
      11. 13.11. SUMMARY
      12. 13.12. FURTHER READING
        1. 13.12.1. Exercises
    6. 14. Software Maintenance
      1. 14.1. MAINTENANCE CATEGORIES REVISITED
      2. 14.2. MAJOR CAUSES OF MAINTENANCE PROBLEMS
      3. 14.3. REVERSE ENGINEERING AND REFACTORING
        1. 14.3.1. Refactoring
        2. 14.3.2. Inherent Limitations
        3. 14.3.3. Tools
      4. 14.4. SOFTWARE EVOLUTION REVISITED
      5. 14.5. ORGANIZATIONAL AND MANAGERIAL ISSUES
        1. 14.5.1. Organization of Maintenance Activities
        2. 14.5.2. Software Maintenance from a Service Perspective
        3. 14.5.3. Control of Maintenance Tasks
        4. 14.5.4. Quality Issues
      6. 14.6. SUMMARY
      7. 14.7. FURTHER READING
        1. 14.7.1. Exercises
    7. 15. Software Tools
      1. 15.1. TOOLKITS
      2. 15.2. LANGUAGE-CENTERED ENVIRONMENTS
      3. 15.3. INTEGRATED ENVIRONMENTS AND WORKBENCHES
        1. 15.3.1. Analyst WorkBenches
        2. 15.3.2. Programmer WorkBenches
        3. 15.3.3. Management WorkBenches
        4. 15.3.4. Integrated Project Support Environments
      4. 15.4. PROCESS-CENTERED ENVIRONMENTS
      5. 15.5. SUMMARY
      6. 15.6. FURTHER READING
        1. 15.6.1. Exercises
  7. III. Advanced Topics
    1. 16. User Interface Design
      1. 16.1. WHERE IS THE USER INTERFACE?
      2. 16.2. WHAT IS THE USER INTERFACE?
      3. 16.3. HUMAN FACTORS IN HUMAN-COMPUTER INTERACTION
        1. 16.3.1. Humanities
        2. 16.3.2. Artistic Design
        3. 16.3.3. Ergonomics
      4. 16.4. THE ROLE OF MODELS IN HUMAN-COMPUTER INTERACTION
        1. 16.4.1. A Model of Human Information Processing
        2. 16.4.2. Mental Models of Information Systems
        3. 16.4.3. Conceptual Models in User Interface Design
      5. 16.5. THE DESIGN OF INTERACTIVE SYSTEMS
        1. 16.5.1. Design as an Activity Structure
        2. 16.5.2. Design as Multi-Disciplinary Collaboration
      6. 16.6. TASK ANALYSIS
        1. 16.6.1. Task Analysis in HCI Design
        2. 16.6.2. Analysis Approaches for Collaborative Work
        3. 16.6.3. Sources of Knowledge and Collection Methods
        4. 16.6.4. An Integrated Approach to Task Analysis: GTA
      7. 16.7. SPECIFICATION OF THE USER INTERFACE DETAILS
        1. 16.7.1. Dialog
        2. 16.7.2. Representation
      8. 16.8. EVALUATION
        1. 16.8.1. Evaluation of Analysis Decisions
        2. 16.8.2. Evaluation of UVM Specifications
        3. 16.8.3. Evaluation of Prototypes
      9. 16.9. SUMMARY
      10. 16.10. FURTHER READING
        1. 16.10.1. Exercises
    2. 17. Software Reusability
      1. 17.1. REUSE DIMENSIONS
      2. 17.2. REUSE OF INTERMEDIATE PRODUCTS
        1. 17.2.1. Libraries of Software Components
        2. 17.2.2. Templates
        3. 17.2.3. Reuse of Architecture
        4. 17.2.4. Application Generators and Fourth-Generation Languages
      3. 17.3. REUSE AND THE SOFTWARE LIFE CYCLE
      4. 17.4. REUSE TOOLS AND TECHNIQUES
        1. 17.4.1. From Module Interconnection Language to Architecture Description Language
        2. 17.4.2. Middleware
      5. 17.5. PERSPECTIVES OF SOFTWARE REUSE
      6. 17.6. NON-TECHNICAL ASPECTS OF SOFTWARE REUSE
        1. 17.6.1. Economics
        2. 17.6.2. Management
        3. 17.6.3. Psychology of Programmers
      7. 17.7. SUMMARY
      8. 17.8. FURTHER READING
        1. 17.8.1. Exercises
    3. 18. Component-Based Software Engineering
      1. 18.1. WHY COMPONENT-BASED SOFTWARE ENGINEERING?
      2. 18.2. COMPONENT MODELS AND COMPONENTS
        1. 18.2.1. Component Forms in Component Models
        2. 18.2.2. Architecture and Component Models
      3. 18.3. COMPONENT-BASED DEVELOPMENT PROCESS AND COMPONENT LIFE CYCLE
        1. 18.3.1. Component-Based System Development Process
        2. 18.3.2. Component Assessment
        3. 18.3.3. Component Development Process
      4. 18.4. ARCHITECTURAL APPROACHES IN COMPONENT-BASED DEVELOPMENT
        1. 18.4.1. Architecture-Driven Component Development
        2. 18.4.2. Product-Line Development
        3. 18.4.3. COTS-Based Development
        4. 18.4.4. Selecting an Approach
      5. 18.5. SUMMARY
      6. 18.6. FURTHER READING
        1. 18.6.1. Exercises
    4. 19. Service Orientation
      1. 19.1. SERVICES, SERVICE DESCRIPTIONS, AND SERVICE COMMUNICATION
      2. 19.2. SERVICE-ORIENTED ARCHITECTURE (SOA)
      3. 19.3. WEB SERVICES
        1. 19.3.1. Extensible Markup Language (XML)
        2. 19.3.2. Simple Object Access Protocol (SOAP)
        3. 19.3.3. Web Services Description Language (WSDL)
        4. 19.3.4. Universal Description, Discovery, and Integration (UDDI)
        5. 19.3.5. Business Process Execution Language for Web Services (BPEL4WS)
      4. 19.4. SERVICE-ORIENTED SOFTWARE ENGINEERING
      5. 19.5. SUMMARY
      6. 19.6. FURTHER READING
        1. 19.6.1. Exercises
    5. 20. Global Software Development
      1. 20.1. CHALLENGES OF GLOBAL SYSTEM DEVELOPMENT
      2. 20.2. HOW TO OVERCOME DISTANCE
        1. 20.2.1. Common Ground
        2. 20.2.2. Coupling of Work
        3. 20.2.3. Collaboration Readiness
        4. 20.2.4. Technology Readiness
        5. 20.2.5. Organizing Work in Global Software Development
      3. 20.3. SUMMARY
      4. 20.4. FURTHER READING
        1. 20.4.1. Exercises
    6. Bibliography