Pragmatic Projects
10 min read
Core idea
Everything in the book, applied at team scale
The penultimate topic takes the individual disciplines accumulated over eight topics and asks: how do they scale to a team? The answer is that they don't change shape — they multiply. A team of pragmatic individuals is dramatically more than the sum of its parts. A pragmatic individual on a non-pragmatic team is slowly worn down. The unit of pragmatic practice, the authors argue, is not the individual but the team.
The topic's five topics name the failure modes that prevent teams from being pragmatic, and the practices that prevent them. A team that doesn't fix broken windows together produces a system nobody is proud of. A team that confuses methodology ceremony with actual improvement (coconuts!) gets the form without the function. A team without the version-control + testing + automation triad can't deliver reliably no matter how skilled its individuals. A team that loses sight of the user builds technically correct systems nobody wants. And a team that doesn't take pride in its work loses the only sustainable motivation engineering has.
Tip 79: Maintain Small Stable Teams.
Pragmatic at scale is about shared metabolism
The recurring theme: a pragmatic team has a shared metabolism. Information moves frictionlessly between members. Standards are universal, not assigned. Quality is everyone's job. Improvement is scheduled, not aspirational. Communication is the team's product, not its overhead. Coconut-cult ceremonies look the same on a slide, but the metabolism is what makes the difference between a team that delivers and a team that just performs delivery.
Why it matters
A bad team eats a good engineer
The brutal observation from the topic: one Pragmatic Programmer on a team that doesn't share the values cannot sustain pragmatic practice indefinitely. The constant friction — the broken windows nobody else fixes, the cargo-cult ceremonies, the absent automation, the indifference to users — wears them down. Either the team changes, or the engineer leaves. The topic is therefore not just for leads; it is for any individual asking whether their environment will let them do their best work.
The starter kit is non-negotiable
The topic's central practical assertion: version control + automated testing + full automation of build and deploy is the bedrock under every other practice. A team without these cannot deliver reliably. A team with these can iterate, adapt, recover, and improve. They are not optional. They are not a nice-to-have. They are the cost of doing this kind of work in 2020 and beyond.
Key takeaways
The topics in this topic
Topic 49 — Pragmatic Teams
The topic opens by recasting every individual discipline from earlier topics in team terms. A pragmatic team:
- Doesn't tolerate broken windows. Quality is not delegated to a "QA team." Every member fixes what they find.
- Watches for boiled frogs. Someone is always asking whether cumulative compromises (scope, timeline, scope, scope, scope) still produce a project worth building.
- Schedules its knowledge portfolio. Learning is not free time; it is scheduled like work. Brown-bag lunches, conference attendance, prototype days, retrospective experiments — all on the backlog.
- Communicates as a team. The team has a presence — a brand, a voice, consistent documentation, predictable cadence. Outsiders know what to expect when they interact with this team.
- Stays DRY. Frictionless internal communication prevents two engineers from solving the same problem twice in silos.
- Uses team-level tracer bullets. End-to-end skinny vertical slices, including all disciplines (UX, server, QA, ops), instead of horizontal handoffs between specialist sub-teams.
- Automates everything. Formatting, testing, deployment, configuration. Manual steps are bugs waiting to happen.
- Knows when to stop adding paint. Done means done. Polishing past the point of returns wastes time the next project needs.
Tip 80: Schedule It to Make It Happen.
The size guidance: under 10–12 people. Fifty people is a horde, not a team. People come and go rarely; trust is built by working together over time, not by org-chart adjacency.
Topic 50 — Coconuts Don't Cut It
The topic's most memorable image. In WWII, certain Pacific islanders observed Allied troops bring food, medicine, and matériel by airplane. After the war ended and the troops left, the islanders built bamboo "control towers" and wooden "headphones" and tried to summon the planes back by performing the rituals they had observed. The form was exact; the function was absent. The planes did not come.
Tip 81: Don't Use Manual Procedures. (In context: the broader lesson — don't perform process for its own sake.)
Software has its cargo cults. Scrum standups performed by teams that haven't internalized why they exist. Retrospectives with no action items. "Agile transformations" measured by ceremony adherence rather than outcome. Code reviews that approve everything. Documentation written but never read.
The authors' rule: adopt practices because they close real feedback loops on your specific team, not because a book or consultant said to. If a daily standup actually helps your team — keep it. If it doesn't — change or drop it. The methodology is in service of the team, not vice versa.
The deeper warning: process adherence without inspection-and-adaptation is the inverse of agility. The whole point of any modern methodology is to keep changing the methodology as the team learns. A team that ran the same exact process for two years isn't agile; it's stuck.
Topic 51 — Pragmatic Starter Kit
If the topic has one non-negotiable, it's this topic. Three foundational practices must exist on every project, from day one, no exceptions:
Tip 82: Organize Fully Functional Teams.
Tip 83: Do What Works, Not What's Fashionable.
Tip 84: Deliver When Users Need It.
-
Version control under everything. Code, configs, docs, build scripts, infrastructure definitions. Everything reproducible from a clone.
-
Ruthless automated testing. Unit, integration, end-to-end, property-based as appropriate. Run on every commit. Failures block merge. The test suite is part of the product.
-
Full build and deploy automation. Zero manual steps from commit to production. Builds reproducible from source. Deploys repeatable and rollback-able.
These three are not improvements you make later when the project is mature. They are the starter kit. Start with them. Refuse to start without them. The cost is one or two days at project setup; the savings are measured in the project's entire lifetime.
The authors are blunt about why: without these three, every other discipline in the book is harder. You can't refactor confidently without tests. You can't undo a bad change without version control. You can't deliver reliably without deployment automation. Every "I'll add the tests later" project becomes a project that ships untested code forever.
Topic 52 — Delight Your Users
A short topic with a big claim: the goal of a project is not to deliver software; it is to delight the people who use it. Software that ships on time and meets the spec but doesn't actually help its users is a failure dressed as a success. Software that surprises users with how well it understands their world is a success even when it ships late.
Tip 85: Make Quality a Requirements Issue — and Delight a Goal.
How to delight, in practice:
- Know your users' world. Talk to them. Spend a day in their job. Watch them use what you built. The insights are not in surveys; they're in observation.
- Build for the next ask. Anticipate what they'll want once they have the current thing. Make the next step possible.
- Solve the problem, not the request. When a user asks for X, ask why. Often the real problem can be solved better than X solves it.
- Care about the rough edges. The error message that explains what went wrong. The empty state that's actually useful. The undo that always works. These are what people remember.
Delight is also what makes a team sustainably motivated. Engineers who watch their users light up when they use the product work differently from engineers who never see anyone use it. Schedule the connection.
Topic 53 — Pride and Prejudice
The final tip in the book. Sign your work. Literally — many software engineers' code is anonymous, accreted by committee, owned by no one, defended by no one. The Pragmatic Programmer takes the opposite stance: this is my work, I am proud of it, I stand behind it.
Tip 100: Sign Your Work.
The implications are larger than the gesture. If you would sign it, you wouldn't ship sloppy. You wouldn't tolerate broken windows in your own work. You wouldn't program by coincidence. You wouldn't skip the tests. You wouldn't blame the framework. You would take responsibility.
The prejudice half of the title is subtler. Pragmatic Programmers are opinionated. They will fight for quality, for clean abstractions, for the user, for the team. They are not bystanders. They are not easy to roll over. They have a stake in the work because they have signed it.
The book closes with this because it closes the loop on the very first topic. It's Your Life. You own your career, your work, your output, your name on the result. Everything in between — the design principles, the tools, the paranoia, the team practices — is in service of producing work you would proudly sign.
Mental model
Practical application
A team health audit
Once a quarter, walk the team through these questions. Three or more "no" answers indicate the team is sliding away from pragmatic practice:
- Is everything under version control — code, configs, infra, docs?
- Does every commit run automated tests, and do failures block merge?
- Can we deploy to production with zero manual steps and roll back in under five minutes?
- Do we fix broken windows the day we notice them?
- Do we have scheduled time for learning and experimentation?
- Have we changed anything about our process in the last quarter based on a retrospective?
- Do we know who our users are and have we watched them use the product recently?
- Would every team member be willing to put their name on what we shipped last week?
A team that answers yes to all eight is operating well. A team that answers no to three or more has work to do, and the work is more important than whatever's on the current sprint board.
Starting a new project: the day-one checklist
The first day of a new project is the cheapest moment to set up the starter kit. Before any production code:
- Initialize the repo and commit a README.
- Add CI that runs the (empty) test suite on every push.
- Add a "hello world" deploy pipeline that gets a placeholder page to production.
- Write the first failing test.
- Write the smallest code that passes it.
- Deploy.
This whole sequence is half a day's work and establishes the cadence. Adding it later — once the project is "real" — always takes ten times as long and often never happens.
Example
The team that shipped together for five years
A small team of seven builds a successful B2B SaaS product over five years. From the outside, the product looks unremarkable. From the inside, the team operates differently from the ones around it.
- Stable. Five of the seven were on the team at year one. The other two joined in years 2 and 4. Nobody has left.
- Starter kit from day one. Day one of the project:
git init, CI green on a placeholder test, deploy pipeline shipping a "hello" page to staging. Five years later: 8,000 tests, 12 deploys a day, 30-second rollback. - Quality is everyone's job. No QA team. Every engineer writes tests. Every engineer rotates through on-call. The on-call docs are owned by the team, not a separate ops group.
- Real process. They started with Scrum, dropped sprint commitments in year 2 when they found them performative, kept the retros but condensed them to 30 minutes, added a weekly "what surprised us this week" round in year 3. The process today doesn't match any methodology in any book — it is theirs.
- Delight. Two engineers spend a half-day per quarter watching customers use the product. The improvements that come out of those sessions are routinely the highest-impact work the team does.
- Pride. Every commit message starts with the author's initials. Every feature has an owner who signs off. Bad commits are not anonymous; good commits are not anonymous either.
The team's competitors built similar products with twice the headcount, three times the budget, and shipped fewer features per quarter. The competitors had a "QA team," a "DevOps team," a "Scrum master," a "Quality officer," a "Director of Engineering" — every role from the org-chart template. The pragmatic team had seven engineers who collectively did all those jobs and trusted each other completely. The difference was visible in everything they shipped — and in the fact that, five years on, nobody had left.
That is the topic's whole argument, distilled into one team's story: the practices compound, the trust compounds, the pride compounds, and the result is a team that out-ships organizations many times its size.
Related lessons
Related concepts
- Pragmatic Teamslinked concept
- Automationlinked concept
- User Delightlinked concept
- Professional Pridelinked concept