When it comes to software engineering, I'm a very practical sort. Knowing all the theory is great, and I do try to keep my knowledge updated and accurate, but what really matters to me is writing solid, reliable, efficient, USEFUL software.
So here are two books that were surprisingly better than I had thought they might be, principally because they are, at their core, eminently practical:
- Site Reliability Engineering: How Google Runs Production Systems
The SRE book is rather an odd bird. It's really 34 separate chapters, written, in total, by about 50 different people, all of whom are or once were Google SRE's.
Each chapter has a topic, and the overall topics are collected into themes and roughly grouped and ordered, but each chapter is independent and you can easily skip around and read different things in different orders, as your interests and needs dictate.
Everything about this book is practical: it's nothing but hard-earned knowledge from a group of people who have been spending their entire professional careers down in the bowels of Google's production systems, keeping them running night and day.
Sometimes the advice is rather basic ("automate everything!"); sometimes the advice is quite advanced (adjusting the overload multiplier in the equation which governs client request throttling behaviors). In all cases, however, it's useful and well-explained.
- Cracking the Coding Interview: 189 Programming Questions and Solutions
This book has been "the hotness" for years now, and for years I had been avoiding it.
I feared it would be nothing but cheap tricks and short-cuts, a cram-class for people trying to pretend they're something they're not.
But I recently read a very favorable blog article about CTCI, and decided to give it a try.
I wish I'd done this years ago.
Although it's certainly useful for its stated purpose (at-home preparation for new graduates who are hoping to enter the workforce), it's much more broadly useful to the practicing professional programmer.
Again, as with SRE, CTCI is divided into many separate chapters, each with a very specific topic, gathered into themes, and roughly grouped and ordered. And, again, you can jump around however you like, as your interests and needs dictate.
Each chapter contains a very clear, very concise, and very useful summary of the current received wisdom about some aspect of software engineering, including the major topics, algorithms, approaches, etc., as well as lots of references for people who want to dig deeper.
More, each chapter then contains a fascinating set of quiz questions, each one suitable for you to sit down with a pencil and pad of paper, a strong cup of coffee, and a quiet hour, to work through.
Even better, each question comes with one or more "hints", organized in a very clever fashion so that you can choose to look at a single hint without "spoiling" things by accidentally seeing all the other hints at the same time. I found that the hints, in many cases, were the best part of the book, as they often sparked insightful rumination about how to look at common problems in significantly different ways.
And, as the title promises, each question contains a detailed answer, explaining not only how to solve the problem properly using the techniques from that chapter, but also, in many cases, notes about common pitfalls and errors that you'll want to avoid.
One quibble: whatever semi-automated process the CTCI team are using to update their book from edition to edition suffers from some sort of cross-referencing flaw, as many of the questions would indicate that the answer could be found on page NNN, when in fact the actual answer was on a different page number. This little annoyance was easy to work around, though, as the answers were in the same order as the questions.
Both SRE and CTCI are surprisingly "deep" books, with a LOT of material. I've been, on-and-off, working my way through each of them over a period of months, and I imagine I might still be digging into them months from now.