Part I What Is Software Engineering?
Engineering—The Practical Application of Science
Reclaiming “Software Engineering”
The Birth of Software Engineering
Design Engineering, Not Production Engineering
A Working Definition of Engineering
Repeatability and Accuracy of Measurement
Engineering, Creativity, and Craft
Why What We Do Is Not Software Engineering
The Journey from Craft to Engineering
3 Fundamentals of an Engineering Approach
Applying Stability and Throughput
The Foundations of a Software Engineering Discipline
Experts at Managing Complexity
Practical Advantages of Working Iteratively
Iteration as a Defensive Design Strategy
Practicalities of Working Iteratively
A Practical Example of the Importance of Feedback
Feedback in Organization and Culture
Separating Empirical from Experimental
Inventing a Reality to Suit Our Argument
What Does “Being Experimental” Mean?
Automated Testing as Experiments
Putting the Experimental Results of Testing into Context
Part III Optimize for Managing Complexity
Undervaluing the Importance of Good Design
Designing for Testability Improves Modularity
Modularity at Different Scales
Modularity and Cohesion: Fundamentals of Design
Driving High Cohesion with TDD
How to Achieve Cohesive Software
Separating Essential and Accidental Complexity
When to Adopt Ports & Adapters
Using TDD to Drive Separation of Concerns
12 Information Hiding and Abstraction
Abstraction or Information Hiding
What Causes “Big Balls of Mud”?
Organizational and Cultural Problems
Technical Problems and Problems of Design
Improving Abstraction Through Testing
Picking Appropriate Abstractions
Abstractions from the Problem Domain
Abstract Accidental Complexity
Isolate Third-Party Systems and Code
Always Prefer to Hide Information
Loose Coupling Isn’t the Only Kind That Matters
How Does This Differ from Separation of Concerns?
Async as a Tool for Loose Coupling
Loose Coupling in Human Systems
Part IV Tools to Support Engineering in Software
14 The Tools of an Engineering Discipline
Problems with Achieving Testability
General Tools to Support Engineering
15 The Modern Software Engineer
Engineering as a Human Process
Digitally Disruptive Organizations
Durable and Generally Applicable
18.218.234.83