Table of contents : Title Fundamentals of Software Engineering, Fifth Edition Copyright Dedication CONTENTS List of Figures Preface Preface to the First Edition 1. Introduction 1.1 Evolution—From an Art Form to an Engineering Discipline 1.1.1 Evolution of an Art into an Engineering Discipline 1.1.2 Evolution Pattern for Engineering Disciplines 1.1.3 A Solution to the Software Crisis 1.2 Software Development Projects 1.2.1 Programs versus Products 1.2.2 Types of Software Development Projects 1.2.3 Software Projects Being Undertaken by Indian Companies 1.3 Exploratory Style of Software Development 1.3.1 Perceived Problem Complexity: An Interpretation Based on Human Cognition Mechanism 1.3.2 Principles Deployed by Software Engineering to Overcome Human Cognitive Limitations 1.4 Emergence of Software Engineering 1.4.1 Early Computer Programming 1.4.2 High-level Language Programming 1.4.3 Control Flow-based Design 1.4.4 Data Structure-oriented Design 1.4.5 Data Flow-oriented Design 1.4.6 Object-oriented Design 1.4.7 What Next 1.4.8 Other Developments 1.5 Notable Changes in Software Development Practices 1.6 Computer Systems Engineering Summary Exercises 2. Software Life Cycle Models 2.1 A Few Basic Concepts 2.2 Waterfall Model and Its Extensions 2.2.1 Classical Waterfall Model 2.2.2 Iterative Waterfall Model 2.2.3 V-Model 2.2.4 Prototyping Model 2.2.5 Incremental Development Model 2.2.6 Evolutionary Model 2.3 Rapid Application Development (RAD 2.3.1 Working of RAD 2.3.2 Applicability of RAD Model 2.3.3 Comparison of RAD with Other Models 2.4 Agile Development Models 2.4.1 Essential Idea behind Agile Models 2.4.2 Agile versus Other Models 2.4.3 Extreme Programming Model 2.4.4 Scrum 2.4.5 Lean Software Development 2.5 Spiral Model 2.5.1 Phases of the Spiral Model 2.6 A Comparison of Different Life Cycle Models 2.6.1 Selecting an Appropriate Life Cycle Model for a Project Summary Exercises 3. Software Project Management 3.1 Software Project Management Complexities 3.2 Responsibilities of a Software Project Manager 3.2.1 Job Responsibilities for Managing Software Projects 3.2.2 Skills Necessary for Managing Software Projects 3.3 Project Planning 3.3.1 Sliding Window Planning 3.3.2 The SPMP Document of Project Planning 3.4 Metrics for Project Size Estimation 3.4.1 Lines of Code (LOC 3.4.2 Function Point (FP) Metric 3.5 Project Estimation Techniques 3.5.1 Empirical Estimation Techniques 3.5.2 Heuristic Techniques 3.5.3 Analytical Estimation Techniques 3.6 Empirical Estimation Techniques 3.6.1 Expert Judgement 3.6.2 Delphi Cost Estimation 3.7 COCOMO—A Heuristic Estimation Technique 3.7.1 Basic COCOMO Model 3.7.2 Intermediate COCOMO 3.7.3 Complete COCOMO 3.7.4 COCOMO 2 3.8 Halstead’s Software Science—An Analytical Technique 3.8.1 Length and Vocabulary 3.8.2 Program Volume 3.8.3 Potential Minimum Volume 3.8.4 Effort and Time 3.8.5 Length Estimation 3.9 Staffing Level Estimation 3.9.1 Norden’s Work 3.9.2 Putnam’s Work 3.9.3 Jensen’s Model 3.10 Scheduling 3.10.1 Work Breakdown Structure 3.10.2 Activity Networks 3.10.3 Critical Path Method (CPM 3.10.4 PERT Charts 3.10.5 Gantt Charts 3.11 Organisation and Team Structures 3.11.1 Organisation Structure 3.11.2 Team Structure 3.12 Staffing 3.13 Risk Management 3.13.1 Risk Management Approaches 3.13.2 Risk Identification 3.13.3 Risk Assessment 3.13.4 Risk Mitigation 3.13.5 Boehm’s Top 10 Risks and Counter Measures 3.14 Software Configuration Management 3.14.1 Necessity of Software Configuration Management 3.14.2 Configuration Management Activities Summary Exercises 4. Requirements Analysis and Specification 4.1 Requirements Gathering and Analysis 4.1.1 Requirements Gathering 4.1.2 Requirements Analysis 4.2 Software Requirements Specification (SRS 4.2.1 Users of SRS Document 4.2.2 Why Spend Time and Resource to Develop an SRS Document 4.2.3 Characteristics of a Good SRS Document 4.2.4 Attributes of Bad SRS Documents 4.2.5 Important Categories of Customer Requirements 4.2.6 Functional Requirements 4.2.7 How to Identify the Functional Requirements 4.2.8 How to Document the Functional Requirements 4.2.9 Traceability 4.2.10 Organisation of the SRS Document 4.2.11 Techniques for Representing Complex Logic 4.3 Formal System Specification 4.3.1 What is a Formal Technique 4.3.2 Operational Semantics 4.4 Axiomatic Specification 4.5 Algebraic Specification 4.5.1 Auxiliary Functions 4.5.2 Structured Specification 4.6 Executable Specification And 4GL Summary Exercises 5. Software Design 5.1 Overview of the Design Process 5.1.1 Outcome of the Design Process 5.1.2 Classification of Design Activities 5.1.3 Classification of Design Methodologies 5.2 How to Characterise a Good Software Design 5.2.1 Understandability of a Design: A Major Concern 5.3 Cohesion and Coupling 5.3.1 Classification of Cohesiveness 5.3.2 Classification of Coupling 5.4 Layered Arrangement of Modules 5.5 Approaches to Software Design 5.5.1 Function-oriented Design 5.5.2 Object-oriented Design Summary Exercises 6. Function-Oriented Software Design 6.1 Overview of SA/SD Methodology 6.2 Structured Analysis 6.2.1 Data Flow Diagrams (DFDs 6.3 Developing the DFD Model of a System 6.3.1 Context Diagram 6.3.2 Level 1 DFD 6.3.3 Extending DFD Technique to make it Applicable to Real-time Systems 6.4 Structured Design 6.4.1 Transformation of a DFD Model into Structure Chart 6.5 Detailed Design 6.6 Design Review Summary Exercises 7. Object Modelling Using UML 7.1 Basic Object-Orientation Concepts 7.1.1 Basic Concepts 7.1.2 Class Relationships 7.1.3 How to Identify Class Relationships 7.1.4 Other Key Concepts 7.1.5 Related Technical Terms 7.1.6 Advantages and Disadvantages of OOD 7.2 Unified Modelling Language (UML 7.2.1 Origin of UML 7.2.2 Evolution of UML 7.3 UML Diagrams 7.4 Use Case Model 7.4.1 Representation of Use Cases 7.4.2 Why Develop the Use Case Diagram 7.4.3 How to Identify the Use Cases of a System 7.4.4 Essential Use Case versus Real Use Case 7.4.5 Factoring of Commonality among Use Cases 7.4.6 Use Case Packaging 7.5 Class Diagrams 7.6 Interaction Diagrams 7.7 Activity Diagram 7.8 State Chart Diagram 7.9 Postscript 7.9.1 Package, Component, and Deployment Diagrams 7.9.2 UML 2.0 Summary Exercises 8. Object-Oriented Software Development 8.1 Introduction to Patterns 8.1.1 Basic Pattern Concepts 8.1.2 Types of Patterns 8.1.3 More Pattern Concepts 8.2 Some Common Design Patterns 8.3 An Object-Oriented Analysis and Design (OOAD) Methodology 8.3.1 Unified Process 8.3.2 Overview of the OOAD Methodology 8.3.3 Use Case Model Development 8.3.4 Domain Modelling 8.3.5 Identification of Entity Objects 8.3.6 Booch’s Object Identification Method 8.3.7 Interaction Modelling 8.3.8 Class-Responsibility-Collaborator (CRC) Cards 8.4 Applications of the Analysis and Design Process 8.5 OOD Goodness Criteria Summary Exercises 9. User Interface Design 9.1 Characteristics of a Good User Interface 9.2 Basic Concepts 9.2.1 User Guidance and On-line Help 9.2.2 Mode-based versus Modeless Interface 9.2.3 Graphical User Interface (GUI) versus Text-based User Interface 9.3 Types of User Interfaces 9.3.1 Command Language-based Interface 9.3.2 Menu-based Interface 9.3.3 Direct Manipulation Interfaces 9.4 Fundamentals of Component-based GUI Development 9.4.1 Window System 9.4.2 Types of Widgets 9.4.3 An Overview of X-Window/MOTIF 9.4.4 X Architecture 9.4.5 Size Measurement of a Component-based GUI 9.5 A User Interface Design Methodology 9.5.1 Implications of Human Cognition Capabilities on User Interface Design 9.5.2 A GUI Design Methodology Summary Exercises 10. Coding and Testing 10.1 Coding 10.1.1 Coding Standards and Guidelines 10.2 Code Review 10.2.1 Code Walkthrough 10.2.2 Code Inspection 10.2.3 Cleanroom Technique 10.3 Software Documentation 10.3.1 Internal Documentation 10.3.2 External Documentation 10.4 Testing 10.4.1 Basic Concepts and Terminologies 10.4.2 Testing Activities 10.4.3 Why Design Test Cases 10.4.4 Testing in the Large versus Testing in the Small 10.4.5 Tests as Bug Filters 10.5 Unit Testing 10.6 Black-Box Testing 10.6.1 Equivalence Class Partitioning 10.6.2 Boundary Value Analysis 10.6.3 Summary of the Black-box Test Suite Design Approach 10.7 White-Box Testing 10.7.1 Basic Concepts 10.7.2 Statement Coverage 10.7.3 Branch Coverage 10.7.4 Condition Coverage 10.7.5 Condition and Decision Coverage 10.7.6 Multiple Condition Coverage 10.7.7 Multiple Condition/Decision Coverage (MC/DC 10.7.8 Path Coverage 10.7.9 McCabe’s Cyclomatic Complexity Metric 10.7.10 Data Flow-based Testing 10.7.11 Mutation Testing 10.8 Debugging 10.8.1 Debugging Approaches 10.8.2 Debugging Guidelines 10.9 Program Analysis Tools 10.9.1 Static Analysis Tools 10.9.2 Dynamic Analysis Tools 10.10 Integration Testing 10.10.1 Phased versus Incremental Integration Testing 10.11 Testing Object-Oriented Programs 10.11.1 What is a Suitable Unit for Testing Object-oriented Programs 10.11.2 Do Various Object-orientation Features Make Testing Easy 10.11.3 Why are Traditional Techniques Considered Not Satisfactory for Testing Object-oriented Programs 10.11.4 Grey-Box Testing of Object-oriented Programs 10.11.5 Integration Testing of Object-oriented Programs 10.12 System Testing 10.12.1 Smoke Testing 10.12.2 Performance Testing 10.12.3 Error Seeding 10.13 Some General Issues Associated with Testing Summary Exercises 11. Software Reliability and Quality Management 11.1 Software Reliability 11.1.1 Hardware versus Software Reliability 11.1.2 Reliability Metrics of Software Products 11.1.3 Reliability Growth Modelling 11.2 Statistical Testing 11.2.1 Steps in Statistical Testing 11.3 Software Quality 11.3.1 Software Quality Models 11.4 Software Quality Management System 11.4.1 Evolution of Quality Systems 11.4.2 Product Metrics versus Process Metrics 11.5 ISO 9000 11.5.1 What is ISO 9000 Certification 11.5.2 ISO 9000 for Software Industry 11.5.3 Why Get ISO 9000 Certification 11.5.4 How to Get ISO 9000 Certification 11.5.5 Summary of ISO 9001 Requirements 11.5.6 Salient Features of ISO 9001 Requirements 11.5.7 ISO 9000-2000 11.5.8 Shortcomings of ISO 9000 Certification 11.6 SEI Capability Maturity Model 11.6.1 Comparison between ISO 9000 Certification and SEI/CMM 11.6.2 Is SEI CMM Applicable to Small Organisations 11.6.3 Capability Maturity Model Integration (CMMI 11.7 Few Other Important Quality Standards 11.8 Six Sigma Summary Exercises 12. Computer Aided Software Engineering 12.1 CASE and Its Scope 12.2 CASE Environment 12.2.1 Benefits of CASE 12.3 CASE Support in Software Life Cycle 12.3.1 Prototyping Support 12.3.2 Structured Analysis and Design 12.3.3 Code Generation 12.3.4 Test Case Generator 12.4 Other Characteristics of CASE Tools 12.4.1 Hardware and Environmental Requirements 12.4.2 Documentation Support 12.4.3 Project Management 12.4.4 External Interface 12.4.5 Reverse Engineering Support 12.4.6 Data Dictionary Interface 12.4.7 Tutorial and Help 12.5 Towards Second Generation CASE Tool 12.6 Architecture of a CASE Environment Summary Exercises 13. Software Maintenance 13.1 Characteristics of Software Maintenance 13.1.1 Characteristics of Software Evolution 13.1.2 Special Problems Associated with Software Maintenance 13.2 Software Reverse Engineering 13.3 Software Maintenance Process Models 13.4 Estimation of Maintenance Cost Summary Exercises 14. Software Reuse 14.1 What can be Reused 14.2 Why Almost no Reuse So Far 14.3 Basic Issues in any Reuse Program 14.4 A Reuse Approach 14.4.1 Domain Analysis 14.4.2 Component Classification 14.4.3 Searching 14.4.4 Repository Maintenance 14.4.5 Reuse without Modifications 14.5 Reuse at Organisation Level 14.5.1 Current State of Reuse Summary Exercises 15. Emerging Trends 15.1 Client-Server Software 15.2 Client-Server Architectures 15.3 CORBA 15.3.1 CORBA Reference Model 15.3.2 CORBA ORB Architecture 15.3.3 CORBA Implementations 15.3.4 Software Development in CORBA 15.4 COM/DCOM 15.4.1 COM 15.4.2 DCOM 15.5 Service-Oriented Architecture (SOA 15.5.1 Service-oriented Architecture (SOA): Nitty-Gritty 15.6 Software as a Service (SaaS Summary Exercises References Index Back cover