Adventure Code

Logo

Personal blog

View My GitHub Profile

back to Book reviews

Software Engineering at Google - by Titus Winters, Hyrum Wright, 2020

alt text

The main ideas presented by the book:

Culture

Policies need to scale - sublinear human work/interventions needed

Distributed/Scale knowledge

Leadership

Don'ts

Dos

Always be deciding

"Important and ambiguous problems do not have magic “silver bullet” solutions. There’s no answer that works forever in all situations. There is only the best answer for the moment (this month, reevaluate next month), and it almost certainly involves making trade-offs in one direction or another. It’s your job to call out the trade-offs, and help decide how to balance"

"The trap of searching for the perfect solution, which leads analysis paralysis. - You need to make your teams comfortable with iteration - you need to frame your process as continuous rebalancing of trade-offs, it’s an iterative process. This is what we mean when we say Always Be Deciding."

“if you try to achieve an impossible goal, there’s a good chance you’ll fail, but if you fail trying to achieve the impossible, you’ll most likely accomplish far more than you would have accomplished had you merely attempted something you knew you could complete.”

“Hope is not a strategy.”

Research advice

GSM system

Process

Optimize (code) for the reader

Document reasoning behind a decision

Simpler solutions are always preferable

A code review benefit, the little moment of reflection before sending off your change, forces an engineer to resolve issues before sending the change and not cut corners

Documentation

Testing

Test maintainability - (usefulness)

Prefer Real implementation instead of test doubles (real > fakes > mocks)

Test doubles - Fakes

Test doubles - Mocks - stubbing & interaction testing

Hyrum's Law - with enough users, all observable behavior will be depended on (not just your API contract)

Deprecation

Tools

Source Control - not only technology + but policies and usage conventions

Build system: Flexibility vs Determinism->Parallelism Task-based build systems

Dependency management - hardest problem in software

Semantic Versioning

CI/CD

Continuous Integration == Alerting "left shifted"

Martin Fowler: “The biggest risk to any software effort is that you end up building something that isn’t useful.

A software product is never ready - it can under improvement or abandoned “You get extraordinary outcomes by realizing that the launch never lands but that it begins a learning cycle where you then fix the next most important thing, measure how it went, fix the next thing, etc.—and it is never complete.”

No software is perfect - and that's okay - as long as hits your set targets

Set up cost is high, but the long-term wins in terms of risk management, developer velocity, and enabling rapid innovation are so high that these initial costs become worthwhile

Microservices - reduced operational cost and gains in cognitive simplicity

Compute-As-A-Service

API/Service design trade-off