Software Engineering: Basic Principles and Best Practices

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Software engineering is as much about teamwork as it is about technology. This introductory textbook covers both. For courses featuring a team project, it offers tips and templates for aligning classroom concepts with the needs of the students' projects. Students will learn how software is developed in industry by adopting agile methods, discovering requirements, designing modular systems, selecting effective tests, and using metrics to track progress. The book also covers the 'why' behind the 'how-to', to prepare students for advances in industry practices. The chapters explore ways of eliciting what users really want, how clean architecture divides and conquers the inherent complexity of software systems, how test coverage is essential for detecting the inevitable defects in code, and much more. Ravi Sethi provides real-life case studies and examples to demonstrate practical applications of the concepts. Online resources include sample project materials for students, and lecture slides for instructors.

Author(s): Ravi Sethi
Edition: 1
Publisher: Cambridge University Press
Year: 2023

Language: English
Commentary: Publisher PDF | Published: 08 December 2022
Pages: 360
City: Cambridge, UK
Tags: Computer Science; Programming Language Theory; Programming Language Implementation; Applied Logic; Software Engineering; Software Development; Software Development Processes; Requirements Analysis; Design and Architecture; Architectural Patterns; Testing; Quality Metrics

Cover
Half Title Page
Title Page
Copyright Page
Brief Contents
Contents
Preface
1 Introduction
1.1 What Is Software Engineering?
1.1.1 Definition of Software Engineering
1.1.2 A Tale of Two Companies
1.2 The Requirements Challenge
1.2.1 Identifying Users and Requirements
1.2.2 Dealing with Requirements Changes
1.3 Software Is Intrinsically Complex
1.3.1 Sources of Complexity
1.3.2 Architecture: Dealing with Program Complexity
1.4 Defects Are Inevitable
1.4.1 Fix Faults to Avoid Failures
1.4.2 Introduction to Testing
1.4.3 Black-Box and White-Box Testing
1.5 Balancing Constraints: The Iron Triangle
1.5.1 Scope. Cost. Time. Pick Any Two!
1.6 Social Responsibility
1.6.1 Case Study: The Volkswagen Emissions Scandal
1.6.2 The ACM Code
1.6.3 Case Study: The Therac-25 Accidents
1.6.4 Lessons for Software Projects
1.7 Conclusion
Further Reading
Exercises
2 Software Development Processes
2.1 Processes and Values Guide Development
2.1.1 What Is a Process?
2.1.2 Two Development Cultures: Plan versus Grow
2.1.3 Role Models: Unix Culture and Agile Values
2.1.4 Selecting a Process Model
2.2 Structuring Teamwork: The Scrum Framework
2.2.1 Overview of Scrum
2.2.2 Scrum Roles
2.2.3 Scrum Events
2.2.4 Scrum Artifacts
2.2.5 Summary
2.3 Agile Development: Extreme Programming
2.3.1 Listening to Customers: User Stories
2.3.2 Testing: Make It Central to Development
2.3.3 When to Design?
2.3.4 A Scrum+XP Hybrid
2.3.5 Summary
2.4 Limitations of Waterfall Processes
2.4.1 The Perils of Big-Bang Integration and Testing
2.4.2 The Waterfall Cost-of-Change Curve
2.4.3 Managing the Risks of Waterfall Processes
2.4.4 Summary
2.5 Levels of Design and Testing: V Processes
2.5.1 Overview of V Processes
2.5.2 Levels of Testing, from Unit to Acceptance
2.5.3 Summary
2.6 Additional Project Risks
2.6.1 Rough Risk Assessment
2.6.2 Netscape 3.0: A Successful Iterative Project
2.6.3 Netscape 4.0: A Troubled Project
2.7 Risk Reduction: The Spiral Framework
2.7.1 Overview of the Spiral Framework
2.7.2 Summary
2.8 Conclusion
Further Reading
Exercises
3 User Requirements
3.1 What Is a Requirement?
3.1.1 The Basic Requirements Cycle
3.1.2 Case Study: Requirements Challenges
3.1.3 Kinds of Requirements
3.2 Developing Requirements and Software
3.2.1 Agile Methods Validate Working Software
3.2.2 Case Study: An Agile Emphasis on Requirements
3.2.3 Plan-Driven Methods Validate a Specification
3.3 Eliciting User Needs
3.3.1 A Classification of Needs
3.3.2 Accessing User Needs
3.3.3 Case Study: Intuit's Design for Delight
3.4 Writing Requirements: Stories and Features
3.4.1 Guidelines for Effective User Stories
3.4.2 Guidelines for System Features
3.4.3 Perspective on User Stories
3.5 Writing User-Experience Scenarios
3.5.1 Guidelines for User-Experience Scenarios
3.5.2 Case Study: A Medical Scenario
3.6 Clarifying User Goals
3.6.1 Properties of Goals
3.6.2 Asking Clarifying Questions
3.6.3 Organizing Goals into Hierarchies
3.6.4 Contributing and Conflicting Goals
3.7 Identifying Security Attacks
3.7.1 Attack Trees: Think Like an Attacker
3.7.2 Finding Possible Attacks
3.8 Conclusion
Further Reading
Exercises
4 Requirements Analysis
4.1 A Checklist Approach
4.2 Relative Estimation: Iteration Planning
4.2.1 Anchoring Can Bias Decisions
4.2.2 Agile Story Points
4.2.3 Velocity of Work
4.3 Structured Group Consensus Estimates
4.3.1 Wideband Delphi and Planning Poker
4.3.2 The Original Delphi Method
4.4 Balancing Priorities
4.4.1 Must-Should-Could-Won't (MoSCoW) Prioritization
4.4.2 Balancing Value and Cost
4.4.3 Balancing Value, Cost, and Risk
4.5 Customer Satisfiers and Dissatisfiers
4.5.1 Kano Analysis
4.5.2 Classification of Features
4.5.3 Life Cycles of Attractiveness
4.5.4 Degrees of Sufficiency
4.6 Plan-Driven Estimation Models
4.6.1 How Are Size and Effort Related?
4.6.2 The Cocomo Family of Estimation Models
4.7 Conclusion
Further Reading
Exercises
5 Use Cases
5.1 Elements of a Use Case
5.1.1 Actors and Goals Outline a System
5.1.2 Flows and Basic Flows
5.2 Alternative Flows: Conditional Behaviors
5.2.1 Specific Alternative Flows
5.2.2 Extension Points
5.2.3 Bounded Alternative Flows
5.3 Writing Use Cases
5.3.1 A Template for Use Cases
5.3.2 From Actor Intentions to System Interactions
5.3.3 How to Build Use Cases
5.4 Use-Case Diagrams
5.4.1 Diagrams Highlight Goals and Actors
5.5 Relationships between Use Cases
5.5.1 Subflows
5.5.2 Inclusion of Use Cases
5.5.3 Extensions of Use Cases
5.6 Conclusion
Further Reading
Exercises
6 Design and Architecture
6.1 The Role of Architecture
6.1.1 What Is Architecture?
6.1.2 Design Includes Architecture
6.1.3 What Is a Good Software Architecture?
6.2 Designing Modular Systems
6.2.1 The Modularity Principle
6.2.2 Coupling and Cohesion
6.2.3 Design Guidelines for Modules
6.3 Class Diagrams
6.3.1 Representing a Class
6.3.2 Relationships between Classes
6.4 Architectural Views
6.4.1 The 4+1 Grouping of Views
6.4.2 Structures and Views
6.5 Describing System Architecture
6.5.1 Outline for an Architecture Description
6.5.2 System Overview of a Communications App
6.5.3 A Development View: Module Hierarchies
6.6 Conclusion
Further Reading
Exercises
7 Architectural Patterns
7.1 Software Layering
7.1.1 The Layered Pattern
7.1.2 Design Trade-offs
7.2 Three Building Blocks
7.2.1 The Shared-Data Pattern
7.2.2 Observers and Subscribers
7.3 User Interfaces: Model-View-Controller
7.3.1 Design Decisions
7.3.2 The Basic Model-View-Controller Pattern
7.3.3 Keep Views Simple
7.4 Dataflow Architectures
7.4.1 Dataflow Pipelines
7.4.2 Dataflow Networks
7.4.3 Unbounded Streams
7.4.4 Big Dataflows
7.5 Connecting Clients with Servers
7.5.1 The Client-Server Pattern
7.5.2 Deploying Test Servers
7.5.3 The Broker Pattern
7.6 Families and Product Lines
7.6.1 Commonalities and Variabilities
7.6.2 Software Architecture and Product Lines
7.6.3 Economics of Product-Line Engineering
7.7 Conclusion
Further Reading
Exercises
8 Static Checking
8.1 Architecture Reviews
8.1.1 Guiding Principles for Architecture Reviews
8.1.2 Discovery, Deep-Dive, and Retrospective Reviews
8.2 Conducting Software Inspections
8.2.1 The Phases of a Traditional Inspection
8.2.2 Case Study: Using Data to Ensure Effectiveness
8.2.3 Organizing an Inspection
8.3 Code Reviews: Check Intent and Trust
8.3.1 Invested Expert Reviewers
8.3.2 Reviewing Is Done within Hours
8.4 Automated Static Analysis
8.4.1 A Variety of Static Checkers
8.4.2 False Positives and False Negatives
8.5 Conclusion
Further Reading
Exercises
9 Testing
9.1 Overview of Testing
9.1.1 Issues during Testing
9.1.2 Test Selection
9.1.3 Test Adequacy: Deciding When to Stop
9.1.4 Test Oracles: Evaluating the Response to a Test
9.2 Levels of Testing
9.2.1 Unit Testing
9.2.2 Integration Testing
9.2.3 Functional, System, and Acceptance Testing
9.2.4 Case Study: Test Early and Often
9.3 Code Coverage I: White-Box Testing
9.3.1 Control-Flow Graphs
9.3.2 Control-Flow Coverage Criteria
9.4 Input Coverage I: Black-Box Testing
9.4.1 Equivalence-Class Coverage
9.4.2 Boundary-Value Coverage
9.5 Code Coverage II: MC/DC
9.5.1 Condition and Decision Coverage Are Independent
9.5.2 MC/DC Pairs of Tests
9.6 Input Coverage II: Combinatorial Testing
9.7 Conclusion
Further Reading
Exercises
10 Quality Metrics
10.1 Meaningful Metrics
10.1.1 Metrics Quantify Attributes
10.1.2 Selecting Useful Metrics
10.1.3 Goal-Directed Measurement
10.2 Software Quality
10.2.1 The Many Forms of Software Quality
10.2.2 Measuring Customer Support
10.3 Graphical Displays of Data Sets
10.3.1 Data Sets
10.3.2 Scales of Measurement
10.3.3 Bar Charts Display Data by Category
10.3.4 Gantt Charts Display Schedules
10.4 Product Quality: Measuring Defects
10.4.1 Severity of Defects
10.4.2 Defect-Removal Efficiency
10.4.3 Customer-Found Defects (CFDs)
10.4.4 CFDs Measure Installs, Not Quality
10.5 Ops Quality Improvement: A Case Study
10.5.1 How to Improve Software Quality
10.5.2 The Customer Quality Metric
10.5.3 Subgoals: Product and Process Improvement
10.5.4 Measuring Process Improvements
10.6 Data Dispersion: Boxplots and Histograms
10.6.1 Medians and Quartiles
10.6.2 Box Plots Summarize Data by Quartile
10.6.3 Histograms of Data Spread
10.7 Data Dispersion: Statistics
10.7.1 Variance from the Mean
10.7.2 Discrete Probability Distribution
10.7.3 Continuous Distributions
10.7.4 Introduction to Normal Distributions
10.7.5 Introduction to Student's t-Distributions
10.8 Confidence Intervals
10.8.1 Definition of Confidence Interval
10.8.2 If the Population Standard Deviation Is Known
10.8.3 If the Population Standard Deviation Is Unknown
10.9 Simple Linear Regression
10.9.1 The Simpler Case: Line through the Origin
10.9.2 Ordinary Least-Squares Fit
10.10 Conclusion
Further Reading
Exercises
Appendix A Team Project
A.1 Overview
A.1.1 Goals for a Project
A.1.2 The Team Experience
A.1.3 Coupling the Classroom and Project Experiences
A.2 Project Proposal
A.3 Skeletal System: Status Report 1
A.4 Viable System: Status Report 2
A.5 Comprehensive Final Report
Notes
References
Index