The Pragmatic Programmer: From Journeyman to Master
Quotes from the Book
Programming is the immediate act of producing code. Software engineering is the set of policies, practices, and tools that are necessary to make that code useful for as long as it needs to be used and allowing collaboration across a team.
This is what good management is about: 95% observation and listening, and 5% making critical adjustments in just the right place.
Traditional managers worry about how to get things done, whereas great managers worry about what things get done (and trust their team to figure out how to do it).
Knowledge is in some ways the most important (though intangible) capital of a software engineering organization, and sharing of that knowledge is crucial for making an organization resilient and redundant in the face of change. A culture that promotes open and honest knowledge sharing distributes that knowledge efficiently across the organization and allows that organization to scale over time. In most cases, investments into easier knowledge sharing reap manyfold dividends over the life of a company.
The moral is this: do not underestimate the power of playing the social game. It’s not about tricking or manipulating people; it’s about creating relationships to get things done. Relationships always outlast projects. When you’ve got richer relationships with your coworkers, they’ll be more willing to go the extra mile when you need them.
Stagnation is an option, but often not a wise one.
Nothing is built on stone; all is built on sand, but we must build as if the sand were stone. Jorge Luis Borges
Still other teams give out noise-canceling headphones to engineers to make it easier to deal with background noise — in fact, in many companies, the very act of wearing headphones is a common signal that means “don’t disturb me unless it’s really important.
We think the middle ground is really the best solution. Group teams of four to eight people together in small rooms (or large offices) to make it easy (and non-embarrassing) for spontaneous conversation to happen.
Programming is hard. Software engineering is even harder. You need that second pair of eyes.
Remember the tried-and-true mantra of “Fail early, fail fast, fail often.
Even though software development is deeply intellectual work that can require deep concentration and alone time, you must play that off against the value (and need!) for collaboration and review.
The vast majority of the work at Google (and at most companies!) doesn’t require genius-level intellect, but 100% of the work requires a minimal level of social skills.
core principles of humility, respect, and trust.
Software engineering” differs from “programming” in dimensionality: programming is about producing code. Software engineering extends that to include the maintenance of that code for its useful life span.
Contrary to some people’s instincts, leaders who admit mistakes are more respected, not less.
Even a relatively simple trade-off of the form “We’ll spend $$$s for compute resources to recoup engineer time” had unforeseen downstream effects.
Solving these problems in a scalable way means changing the way we do deprecation: instead of pushing migration work to customers, teams can internalize it themselves, with all the economies of scale that provides. In 2012, we tried to put a stop to this with rules mitigating churn: infrastructure teams must do the work to move their internal users to new versions themselves or do the update in place, in backward-compatible fashion. This policy, which we’ve called the “Churn Rule,” scales better: dependent projects are no longer spending progressively greater effort just to keep up. We’ve also learned that having a dedicated group of experts execute the change scales better than asking for more maintenance effort from every user: experts spend some time learning the whole problem in depth and then apply that expertise to every subproblem. Forcing users to respond to churn means that every affected team does a worse job ramping up, solves their immediate problem, and then throws away that now-useless knowledge. Expertise scales better.
The traditional use of development branches is another example of policy that has built-in scaling problems. An organization might identify that merging large features into trunk has destabilized the product and conclude, “We need tighter controls on when things merge. We should merge less frequently.” This leads quickly to every team or every feature having separate dev branches. Whenever any branch is decided to be “complete,” it is tested and merged into trunk, triggering some potentially expensive work for other engineers still working on their dev branch, in the form of resyncing and testing. Such branch management can be made to work for a small organization juggling 5 to 10 such branches. As the size of an organization (and the number of branches) increases, it quickly becomes apparent that we’re paying an ever-increasing amount of overhead to do the same task.
Hyrum’s Law represents the practical knowledge that — even with the best of intentions, the best engineers, and solid practices for code review — we cannot assume perfect adherence to published contracts or best practices.
If the fork in question is provably limited in scope, that helps, as well — avoid forks for interfaces that could operate across time or project-time boundaries (data structures, serialization formats, networking protocols).
On the other hand, if every developer forks everything used in their software project instead of reusing what exists, scalability suffers alongside sustainability. Reacting to a security issue in an underlying library is no longer a matter of updating a single dependency and its users: it is now a matter of identifying every vulnerable fork of that dependency and the users of those forks.
If I spend two weeks changing this linked-list into a higher-performance structure, I’m going to use five gibibytes more production RAM but save two thousand CPUs. Should I do it?” Not only does this question depend upon the relative cost of RAM and CPUs, but also on personnel costs (two weeks of support for a software engineer) and opportunity costs (what else could that engineer produce in two weeks?).
just because,” “because I said so,” or “because everyone else does it this way” are places where bad decisions lurk.
in software engineering, as in life, good choices lead to good outcomes.
As every system administrator knows, it’s one thing to know in theory that you can recover from tape, and another to know in practice exactly how to do it and how much it will cost when it becomes necessary. Practice and expertise are great drivers of efficiency and reliability.
Every piece of technology upon which your project depends has some (hopefully small) risk of containing critical bugs and security vulnerabilities that might come to light only after you’ve started relying on it. If you are incapable of deploying a patch for Heartbleed or mitigating speculative execution problems like Meltdown and Spectre because you’ve assumed (or promised) that nothing will ever change, that is a significant gamble.
Hyrum’s Law: With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.
We have tried to make the discussions in this book more about engineering and less about programming.
Watch on YouTube
About Titus Winters
About the book
The approach to and understanding of software engineering at Google is unlike any other company. With this book, you'll get a candid and insightful look at how software is constructed and maintained by some of the world's leading practitioners.
Titus Winters, Tom Manshreck, and Hyrum K. Wright, software engineers and a technical writer at Google, reframe how software engineering is practiced and taught: from an emphasis on programming to an emphasis on software engineering, which roughly translates to programming over time.
You'll learn:
Fundamental differences between software engineering and programming How an organization effectively manages a living codebase and efficiently responds to inevitable change Why culture (and recognizing it) is important, and how processes, practices, and tools come into play
Book details
- First published
- 2020
- Author
- Titus Winters
- Genre
- Nonfiction
- Goodreads rating
- 4.20 (2k ratings)
Keep reading
The Pragmatic Programmer: From Journeyman to Master
Managing Humans: Biting and Humorous Tales of a Software Engineering Manager
Accelerate: Building and Scaling High Performing Technology Organizations
Peopleware: Productive Projects and Teams
Hackers & Painters: Big Ideas from the Computer Age
Continuous delivery
Right Kind of Wrong: The Science of Failing Well
Pragmatic Thinking and Learning: Refactor Your Wetware
Founders at Work: Stories of Startups' Early Days
Code Complete
Getting Real: The Smarter, Faster, Easier Way to Build a Web Application
Don't Make Me Think, Revisited: A Common Sense Approach to Web Usability
Domain-Driven Design: Tackling Complexity in the Heart of Software
Algorithms to Live By: The Computer Science of Human Decisions
Amp It Up: Leading for Hypergrowth by Raising Expectations, Increasing Urgency, and Elevating Intensity
The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers―Straight Talk on the Challenges of Entrepreneurship
Adapt: Why Success Always Starts with Failure
Making Ideas Happen: Overcoming the Obstacles Between Vision and Reality
Lean Analytics: Use Data to Build a Better Startup Faster
Measure What Matters
Running Lean: Iterate from Plan A to a Plan That Works
The Goal: A Process of Ongoing Improvement
Zero to One: Notes on Startups, or How to Build the Future
The Effective Executive: The Definitive Guide to Getting the Right Things Done
Rework
Invent and Wander: The Collected Writings of Jeff Bezos
The Lean Startup
Creativity, Inc.: Overcoming the Unseen Forces That Stand in the Way of True Inspiration
The Fifth Discipline: The Art & Practice of The Learning Organization
Range: Why Generalists Triumph in a Specialized World
The Soul of a New Machine
Black Box Thinking: Why Some People Never Learn from Their Mistakes - But Some Do
A World Without Email: Reimagining Work in an Age of Communication Overload
Thinking In Systems: A Primer
The Design of Everyday Things
The Art of Thinking Clearly
The PARA Method: Simplify, Organize, and Master Your Digital Life
Good to Great: Why Some Companies Make the Leap... and Others Don't
Hit Refresh: The Quest to Rediscover Microsoft's Soul and Imagine a Better Future for Everyone
Things a Little Bird Told Me: Confessions of the Creative Mind
Built to Last: Successful Habits of Visionary Companies
Radical Candor: Be a Kickass Boss Without Losing Your Humanity
Getting There: A Book of Mentors
Think Like a Freak
The Accidental Creative: How to Be Brilliant at a Moment's Notice
Drive: The Surprising Truth About What Motivates Us
The Essential Drucker
The Startup of You: Adapt to the Future, Invest in Yourself, and Transform Your Career
Originals: How Non-Conformists Move the World
The Five Dysfunctions of a Team
In the Beginning...Was the Command Line
Pour Your Heart Into It: How Starbucks Built a Company One Cup at a Time
Principles: Life and Work
The 80/20 Principle: The Secret to Achieving More with Less
The Art of the Start: The Time-Tested, Battle-Hardened Guide for Anyone Starting Anything
The E-myth Revisited
Slow Productivity: The Lost Art of Accomplishment Without Burnout
Smarter Faster Better: The Secrets of Being Productive in Life and Business
