Principles, Judgment and the Craft of Building Software That Lasts
Introduction: The Case for Common Sense
- A Bug That Cost Millions
- What Common Sense Is (and Is Not)
- The Five Questions Experienced Developers Ask
- How to Use This Book
Chapter 1: The Common-Sense Mindset
- Two Kinds of Complexity
- Judgments, Not Rules
- One-Way Doors and Two-Way Doors
- Cost Over Time
- Knowing What You Don’t Know
Chapter 2: Problems, Requirements and Change
- The Real Problem Is Rarely the Stated Problem
- Eliciting and Expressing Requirements
- Scope, YAGNI and the Planning Dilemma
- Estimation and Prioritization as Reasoning
Chapter 3: Simplicity
- The Compounding Cost of Complexity
- What Simple Actually Means
- Techniques for Staying Simple
- When to Complicate on Purpose
Chapter 4: Code Quality and Readability
- Code Is Read More Than It Is Written
- Naming and Local Clarity
- Small Functions and Flat Control Flow
- The Same Logic, Three Ways
Chapter 5: Structure, Abstraction, Modularity, Coupling and Cohesion
- Why We Abstract and What It Costs
- Modules and Single Responsibility
- Deep Modules and Information Hiding
- Coupling, Cohesion and the Direction of Dependence
Chapter 6: Design Patterns, Anti-Patterns and Judgment
- Patterns as a Shared Language
- A Practical Tour of Patterns
- The Anti-Patterns That Do the Most Damage
- The Meta-Pattern of Restraint
Chapter 7: Testing and Confidence
- What Testing Is Actually For
- The Test Pyramid and Its Trade-offs
- Test-Driven Development, Honestly
- Flaky Tests and the Cost of Untrustworthy Tests
Chapter 8: APIs, Interfaces and Dependencies
- Designing Interfaces People Will Depend On
- Contracts, Versioning and Backward Compatibility
- Managing the Dependencies You Take In
- Frameworks, Libraries and the Framework Tax
Chapter 9: Architecture, System Design and Distributed Systems
- What Architecture Is and Isn’t
- Monoliths, Services and the Shape of the System
- Conway’s Law and Organizational Reality
- The Fallacies of Distributed Computing
- Designing for Failure and Scale
Chapter 10: Performance and Scalability
- Measure Before You Optimize
- Bottlenecks and How They Move
- Caching, Batching and Layering
- Throughput, Latency and the Tail
- When to Scale and When to Stop
Chapter 11: Data and Databases
- Data Is the Thing You Cannot Get Back
- Modeling Before You Pick a Database
- SQL, NoSQL and Consistency, Honestly
- Migrations, Replication and Sharding
Chapter 12: Reliability, Observability and Debugging
- Reliability Is Designed In, Not Bolted On
- The Three Pillars of Observability
- A Debugging Method That Scales
- Post-Mortems and the Culture of Failure
Chapter 13: Security
- Threat Modeling Before You Build
- The OWASP Map
- Least Privilege and Defense in Depth
- The Human and Supply-Chain Layer
- The Cost Asymmetry
Chapter 14: Technical Debt, Refactoring and Legacy Systems
- What Technical Debt Really Is (and Isn’t)
- Refactoring as Risky, Managed Change
- The Strangler Fig and Living with Legacy
- Why “Just Rewrite It” Usually Loses
Chapter 15: Building, Shipping and Operating
- Version Control as a Discipline
- Continuous Integration and Delivery
- Deployment Strategies and Reversibility
- Infrastructure as Code and Environment Parity
Chapter 16: Teams, Review, Communication and the Long-Term Strategy
- Code Review Done Right
- Estimation, Planning and Commitments
- Communication and the Bus Factor
- What Actually Drives Developer Productivity
- Long-Term Engineering Strategy