| Foreword by Michael Feathers |
| Acknowledgments |
| 1. | Welcome! |
| About This Book |
| Optimize for Understanding |
| How to Read This Book |
| Toward a New Approach |
| Get Your Investigative Tools |
| 2. | Code as a Crime Scene |
| Meet the Problems of Scale |
| Get a Crash Course in Offender Profiling |
| Profiling the Ripper |
| Apply Geographical Offender Profiling to Code |
| Learn from the Spatial Movement of Programmers |
| Find Your Own Hotspots |
| 3. | Creating an Offender Profile |
| Mining Evolutionary Data |
| Automated Mining with Code Maat |
| Add the Complexity Dimension |
| Merge Complexity and Effort |
| Limitations of the Hotspot Criteria |
| Use Hotspots as a Guide |
| Dig Deeper |
| 4. | Analyze Hotspots in Large-Scale Systems |
| Analyze a Large Codebase |
| Visualize Hotspots |
| Explore the Visualization |
| Study the Distribution of Hotspots |
| Differentiate Between True Problems and False Positives |
| 5. | Judge Hotspots with the Power of Names |
| Know the Cognitive Advantages of Good Names |
| Investigate a Hotspot by Its Name |
| Understand the Limitations of Heuristics |
| 6. | Calculate Complexity Trends from Your Code’s Shape |
| Complexity by the Visual Shape of Programs |
| Learn About the Negative Space in Code |
| Analyze Complexity Trends in Hotspots |
| Evaluate the Growth Patterns |
| From Individual Hotspots to Architectures |
| 7. | Treat Your Code As a Cooperative Witness |
| Know How Your Brain Deceives You |
| Learn the Modus Operandi of a Code Change |
| Use Temporal Coupling to Reduce Bias |
| Prepare to Analyze Temporal Coupling |
| 8. | Detect Architectural Decay |
| Support Your Redesigns with Data |
| Analyze Temporal Coupling |
| Catch Architectural Decay |
| React to Structural Trends |
| Scale to System Architectures |
| 9. | Build a Safety Net for Your Architecture |
| Know What’s in an Architecture |
| Analyze the Evolution on a System Level |
| Differentiate Between the Level of Tests |
| Create a Safety Net for Your Automated Tests |
| Know the Costs of Automation Gone Wrong |
| 10. | Use Beauty as a Guiding Principle |
| Learn Why Attractiveness Matters |
| Write Beautiful Code |
| Avoid Surprises in Your Architecture |
| Analyze Layered Architectures |
| Find Surprising Change Patterns |
| Expand Your Analyses |
| 11. | Norms, Groups, and False Serial Killers |
| Learn Why the Right People Don’t Speak Up |
| Understand Pluralistic Ignorance |
| Witness Groupthink in Action |
| Discover Your Team’s Modus Operandi |
| Mine Organizational Metrics from Code |
| 12. | Discover Organizational Metrics in Your Codebase |
| Let’s Work in the Communication Business |
| Find the Social Problems of Scale |
| Measure Temporal Coupling over Organizational Boundaries |
| Evaluate Communication Costs |
| Take It Step by Step |
| 13. | Build a Knowledge Map of Your System |
| Know Your Knowledge Distribution |
| Grow Your Mental Maps |
| Investigate Knowledge in the Scala Repository |
| Visualize Knowledge Loss |
| Get More Details with Code Churn |
| 14. | Dive Deeper with Code Churn |
| Cure the Disease, Not the Symptoms |
| Discover Your Process Loss from Code |
| Investigate the Disposal Sites of Killers and Code |
| Predict Defects |
| Time to Move On |
| 15. | Toward the Future |
| Let Your Questions Guide Your Analysis |
| Take Other Approaches |
| Let’s Look into the Future |
| Write to Evolve |
| A1. | Refactoring Hotspots |
| Refactor Guided by Names |
| Bibliography |