Notes from Software Engineering at Google

Mar 1, 2026

I recently read Software Engineering at Google by Titus Winters, Tom Manshreck, and Hyrum Wright. The book covers how Google does software engineering at scale - everything from culture and teamwork to testing, build systems, and CI/CD.

Here are my notes from each chapter that stood out to me.

Chapter 1: What Is Software Engineering?

The key distinction: programming is writing code for now, software engineering is code that changes over time.

Hyrum's Law

With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviours of your system will be depended upon by somebody.

If users can see it, they'll depend on it. Design APIs assuming everything is public.

Time and Change

Software engineering is about surviving the test of time. What works for a 100-line project doesn't work for 100 million lines.

Shifting Left

Fix problems earlier in the development cycle. Find bugs at compile time, not production.

Chapter 2: How to Work Well on Teams

The Genius Myth

The idea that great code comes from lone genius programmers is harmful. The best software comes from teams.

Don't Hide

The Three Pillars

Blameless Post-Mortems

When things go wrong, focus on the process, not the person. People make mistakes; the goal is to fix the system.

Chapter 3: Knowledge Sharing

Psychological Safety

The foundation of a learning organisation. People need to feel safe to ask questions and admit they don't know something.

Scaling Knowledge

Readability

Google has a "readability" process - code must be reviewed by someone certified in that language. It's standardised mentorship through code review.

Chapter 4: Engineering for Equity

Bias Is the Default

We all have biases. Acknowledge them and build processes that account for them.

Diversity Is a Process

Diversity isn't a checkbox - it's about building systems that work for everyone.

Chapter 5: How to Lead a Team

Managers vs Tech Leads

Servant Leadership

Your job is to remove roadblocks, not write more code. Enable your team to be effective.

Antipatterns

Positive Patterns

Chapter 6: Leading at Scale

Always Be Deciding

Leadership is making trade-offs constantly. Identify your blind spots.

Always Be Leaving

Build a "self-driving" team - one that doesn't need you to function. Document decisions, onboard others, delegate.

Always Be Scaling

Chapter 7: Measuring Engineering Productivity

Measuring engineering productivity is hard. The danger is optimising for the wrong thing.

Don't Measure Lines of Code

Productivity isn't about output volume. Focus on outcomes, not output.

Goals, Signals, Metrics

Chapter 8: Style Guides and Rules

Why Have Rules?

Consistency reduces cognitive load. Rules let reviewers focus on logic, not style.

Guiding Principles

Chapter 9: Code Review

Code review is one of the most important quality gates in software development.

Benefits

Best Practices

Chapter 10: Documentation

Chapter 11: Testing Overview

Why Test?

Tests give you confidence to make changes. They document expected behaviour.

Test Size

The Beyonce Rule

Tests should verify behaviour, not implementation. If you refactor and tests break, they're too brittle.

Chapter 12: Unit Testing

Preventing Brittle Tests

DAMP, Not DRY

DAMP (Descriptive And Meaningful Phrases) > DRY (Don't Repeat Yourself) in tests. Readability matters more than avoiding duplication in test code.

Chapter 13: Test Doubles

Types

Prefer Realism Over Isolation

Use real implementations when possible. Fakes should mirror real behaviour.

Chapter 14: Larger Testing

Unit tests aren't enough. Sometimes you need bigger, slower, more expensive tests.

Types of Larger Tests

Chapter 15: Deprecation

Deprecation is the art of removing old things without breaking your users.

Types

Why Deprecate?

Remove old features to reduce maintenance burden. But do it responsibly with clear timelines.

Chapter 16: Version Control and Branch Management

How you manage your source code shapes how your team works.

One Version

Google uses monorepo with "one version" - everyone uses the latest. No library version juggling.

Trunk-Based Development

Short-lived branches merged to main frequently. No long-lived feature branches.

Chapter 17: Code Search

When your codebase has millions of files, regular grep won't cut it.

Why a Separate Tool?

At scale, grep doesn't work. Need specialised tools for fast, indexed search across millions of files.

Chapter 18: Build Systems and Build Philosophy

Task-Based vs Artifact-Based

Google uses artefact-based for reproducibility.

The 1:1:1 Rule

One build target per source file, one test file per source file, one output directory per source file.

Chapter 19: Critique: Google's Code Review Tool

Key Principles

Chapter 20: Static Analysis

Static analysis catches bugs without running your code.

Tricorder

Google's static analysis platform. Runs tools automatically on code reviews.

Key Lessons

Chapter 21: Dependency Management

Dependencies are a liability. Every one you add is something someone else maintains.

The Problem

Diamond dependencies, version conflicts, "dependency hell."

Approaches

Google's Approach

"Minimal version selection" - use the oldest allowed version that satisfies requirements.

Chapter 22: Large-Scale Changes (LSCs)

What Is an LSC?

Changes affecting thousands of files. Google's tooling can "shard" changes across many CLs.

Challenges

Chapter 23: Continuous Integration

Key Concepts

Chapter 24: Continuous Delivery

Getting code to users quickly and safely.

Idioms

Shifting Left

Make data-driven decisions earlier. Don't wait for production to know something is wrong.

Chapter 25: Compute as a Service

Key Ideas

Conclusion

Software engineering is a team sport. Focus on processes that scale - code review, testing, knowledge sharing. The goal isn't perfect code; it's code that survives over time.