Five(ish) Books For All Programmers
August 13, 2022
This one is from a friend: "What are five books that all aspiring programmers should be sure to read?" I thought it was an interesting question, so I wrote a bit on it. Here's what I wrote.
First of all, you need to be able to think like a programmer. That means not being afraid of technical details. In the US, I feel like there's a tendency to be afraid of technical details. I blame how poorly STEM is often handled in early schooling. I argue that dissuading that fear ASAP is critical, to make sure one doesn't run from it when it inevitably comes up in programming. Thus:
- Paul Lockhart's A Mathematician's Lament. Read it twice for good measure. It's focused on mathematics specifically, but the argument applies to programming and plenty of other technical subjects.
Next, how to be a good programmer.
- The Pragmatic Programmer by Andy Hunt and David Thomas is a collection of good ideas with regard to philosophies, principles, and technical details. I think reading this book is what took me from good coder to good developer. It also doesn't need to be read linearly, it's a great reference.
The next two are about bad code. Unfortunately, not all code in the world is good code. There are some very senior developers making very bad mistakes. You need to be able to identify things that have gone wrong, and how to move things in a proper direction.
- Martin Feather's Working Effectively with Legacy Code is about the technical stuff: the grimy, messy code. It goes into how to reverse bad mistakes and move a codebase in a better direction. Before I'd read this book, production legacy code had literally brought me to tears on two separate occasions. Now I'm much more equipped to handle such situations.
- The Phoenix Project by Gene Kim et al., more often seen in DevOps circles, is more about teams and processes than the code itself. This is about ideological mistakes you see in projects, and how to recover from a situation that might seem utterly hopeless. It's a primer for DevOps, which is pretty helpful overall. It also is the only book on this list that reads like a novel.
These 4 books lay the foundations for how to be a good programmer philosophically, with plenty of good nuggets of technical ideas. Once you've read (and understood) them, you should be comfortable with a decent chunk of professional development. All that's really left is technical details and experience. The answer for that I think is "The most commonly recommended book in your field of choice."
- In the general case, for beginners or people who haven't picked a field, I think you'll probably be better off getting practice than reading more books. Four is plenty. Though if you really want my fifth recommendation, there's a quaint little code quality book by the name of A Philosophy of Software Design by John Ousterhout, which has given me a lot of clever ways to think about "software complexity" and what "messy code" actually means.
- In my specific case, the book is Martin Kleppmann's Designing Data-Intensive Applications. This is a nice primer for general systems design, and lays a solid foundation to get more into distributed systems engineering.
- If you want to get into any particular field, I would do some research on the commonly recommended books and insert the top one here.
August 8, 2023: I used to suggest Clean Code for beginners at the end, but nowadays I don't stand by that anymore. The suggestion has been updated.