During reading the book, I mostly stumbled upon the stuff I digested before. However, it is a nice one-stop-shop to find ultimate engineering tenets.
If I’d get only one lesson from this book, it would be: “Time is our most finite asset, and leverage—the value we produce per unit time—allows us to direct our time towards what matters most. We should always ask ourselves: Does the work I’m doing provide the highest leverage for my current goal? If not, why am I doing it? Moreover, when we make the wrong choice—which is bound to happen over the course of our careers—a growth mindset allows us to view each failure as an opportunity to learn and do better next time.”
Some other takeaways from the chapters:
- Optimise for learning
- The earlier that you optimise for learning, the more time your learning has to compound. A good first job, for example, makes it easier to get a better second job, which then affects future career opportunities.
- Make sure that at least one of your languages is a scripting language (e.g., Python or Ruby) that you can use as your Swiss Army knife for quick tasks.
- Join a discussion group. In the eighteenth century, politician and inventor Benjamin Franklin organised a group of friends into a “club of mutual improvement”. The club met every Friday evening to discuss and debate “morals, politics, or natural philosophy,” providing members with a structured opportunity to improve themselves.
- Write to teach. That’s the technique that Physics Nobel Prize winner Richard Feynman used to learn faster.
- Prioritise Regularly
- Treat your brain as a processor, not as a memory bank.
- Work on the improvement and non-urgent. Prioritise long-term investments that increase your effectiveness, even if they don’t have a deadline.
- Reduce context switches. Don’t spend your cognitive energy actively juggling tasks.
- Make prioritisation a habit. Experiment to figure out a good workflow. Prioritise regularly, and it’ll get easier to focus on and complete your highest-leverage activities.
- Improve Your Project Estimation Skills
- “A good estimate” is an estimate that provides clear enough view of the project reality to allow the project leadership to make good decisions about how to control the project to hit its target. - Steve McConnell in his book Software Estimation
- If a task will take more than two days, decompose it further.
- If you’ve made your estimates granular, you can defend them more easily.
- Use multiple approaches to estimate the same task. This can help increase confidence that your approach is sound. For example, suppose you’re building a new feature. You can 1) decompose the project into regular tasks, estimate each individual task, and create a bottom-up estimate; 2) gather historical data on how long it took to build something similar; and 3) count the number of subsystems you have to build and estimate the average time required for each one.
- When setting schedules, build in buffer time for the unexpected interruptions.
- Additional hours can burn out team members. In their book Peopleware, Tom DeMarco and Timothy Lister document a phenomenon they call “undertime”. The have found that overtime is “almost always followed by an equal period of compensatory undertime while the workers catch up with their lives.” Furthermore, they add, “the positive potential of working extra hours is far exaggerated, and that its negative impact…. can be substantial; error, burnout, accelerated turnover.”
- Work overtime only if you’re confident that it will enable you to finish on time.
- Define measurable tasks first. Clear milestones can alert you as to whether you’re on track or falling behind. Use them as opportunities to revise your estimates.
- Do the riskiest first. Reduce variance in your estimates and risk in your project by exploring the unknown early on. Don’t give yourself the illusion of progress by focusing first on what’s easy to do.
- Balance Quality with Pragmatism
- The engineering practices that work for Google would be overkill at a startup or a small company.
- At Quora, the author’s team only required reviews of model and controller code business logic; view code that rendered the web interface to users didn’t need to be reviewed.
- Establish a culture of reviewing code. Find the right balance between code reviews and tooling to trade off code quality and development speed.
- Minimise the Operation Burden
- The best that we can do is to “script for success,” practice failure scenarios, and work on our ability to recover quickly.
- Instagram grew and scaled successfully in part because the team didn’t spend all their time keeping their app up and running. Minimising our own operational burden means that we, too, can invest our time in more meaningful ways of driving impact.
- Invest in Your Team’s Growth
- “You’re a staff engineer if you’re making a whole team better than it would be otherwise. You’re a principal engineer if you are making the whole company better than it would be otherwise. And you’re distinguished if you’re improving the industry.” Marc Hedlund, VP of Engineering at Stripe
- Great Engineering Cultures:
- Optimise for iteration speed
- Push relentlessly towards automation
- Build the right software abstraction
- Focus on high code quality by using code reviews
- Maintain a respectful work environment
- Build shared ownership of code
- Invest in automated testing
- Allot experimentation time, either through 20% time or hackathons.
- Foster a culture of learning and continuous improvement.
- Hire the best.