Recommended Reading

I love books, especially technical ones. I feel a strong need to expand my knowledge base all the time, and my primary mechanism for doing that is through books and open source development. I don’t just read about subjects I deal with at work. In fact, most of what I read normally has nothing to do with the subjects of my day job (at least on the surface). I feel it helps me to be a more rounded developer, and provides me with an extra set of tools to solve problems. After all, that’s what it’s all about: solving problems.

Not all books are created equal though. This list represents books that I consider top-notch. They are books that I consult time and time again, were vital to my growth as a developer, or represent the best-in-class book I could find on a particular subject. I’ve attempted to organize the list to help communicate where I believe a book falls (at least on my bookshelf). Hopefully, you’ll find it useful.

Can’t Live Without

  • Managing Humans: Biting and Humorous Tales of a Software Engineering Manager by Michael Lopp – This book is now sitting in the #1 spot of my bookshelf. Michael Lopp has a wonderful way of telling stories that hit home no matter what your experience has been. If you’re a programmer, you probably suck at managing people. This book explains why, and what you can do about it. If you’re not programmer trying to be a manager, read the book and find out why your manager is some times infuriating and how you can better communicate with him or her. You can’t go wrong reading this book.

  • The Pragmatic Programmer by Andrew Hunt and David Thomas – Every programmer should have to read this book. It has a number of very useful suggestions on everything from picking an editor to the steps you should take to ensure a successful career as a programmer.

  • Practices of an Agile Programmer by Venkat Subramaniam and Andy Hunt – Again, every programmer should have to read this book. It is littered with useful advice, and ways to keep yourself in check with particular practices. I think it’s a wonderful insight into the mind of an agile programmer, and this short read can help you to avoid some of the mistakes others have made.

  • Large Scale C++ Software Design by John Lakos – While the book is focused on C++ as the language of choice, the concepts are geared towards sound object-oriented design and the principles apply to any language (including C). This book marked a strong turning point in my development career, as it was the first solid introduction I had to object-oriented design. It was an easy read, and it was very eye opening.

  • Joel on Software by Joel Spolsky – This book is chock full of good advice and thought provoking commentary that is especially geared toward the developer that has found himself a manager. Joel has a great writing style that makes the book extremely easy to read. I do have to warn you, he’s very opinionated. I didn’t always agree with him, but I can say that all of his arguments were very compelling.

  • Interface-Oriented Design by Ken Pugh – The GoF, Herb Sutter, and other great minds have stated this maxim repeatedly: prefer composition over inheritance. Interface-Oriented Design is all about composition. It shows why interfaces make sense, why you should use them, and how to overcome the issue of re-use. It also breaks down some common interface patterns, showing you the pros and cons of a particular interface style. Finally, it lays out some ground rules for what a good interface design looks like, how it behaves, and how to successfully hide implementation details. I view this book as an extension of Large Scale C++ Software Design. A definite read for those who want to improve the quality of their software designs.

  • High Performance Computing by Kevin Dowd and Charles Severance – The book is no longer being published, but I managed to get my hands on a used one at a reasonable price. The book has very in-depth coverage of compilers and processor architecture, and how to exploit them to eek out every last bit of performance. Much of what’s in there still applies today despite the 1998 publishing date. For anyone looking to achieve maximum performance, this book is for you. Just a word a warning: it’s not easy to achieve.

Writing Portable Code

  • Write Portable Code by Brian Hook - I’ve been writing code for a number of different platforms for a long time, so this book didn’t introduce anything new to me. However, it is the only book that I’ve ever seen that brings together all the topics necessary for portable design under one cover. The book is well written, articulate, and did a wonderful job of talking about the various levels of compatibility between platforms, files, and other small details that can cause much headache when you don’t know too look for them.

C++

  • Exceptional C++ by Herb Sutter – Simply put: if you haven’t read this, then you think you know how to program in C++. This book is packed with useful advice and points out the subtle errors you may have introduced into your own C++ code, especially in regards to exception handling.

Python

  • Python in a Nutshell by Alex Martelli – This the Python book used by the majority of employees in my company. It provides a great introduction to Python, it’s syntax, language features, and then goes on to talk about a number of useful Python libraries in the standard distribution. If you’re a programmer and want to learn about Python, then this is the place to start. The only topics the book lacks is on packaging and C extension modules. Fortunately, there are a number of great references on the Internet to cover those topics.

Clojure

  • Clojure Programming by Chas Emerick, Brian Carper, and Christopher Grand – There are several books on Clojure out there now, but this is the one I recommend to folks. It has comprehensive coverage of Clojure, a wealth of examples, and is very well written.

Linux

  • Linux Application Development by Michael K. Johnson and Eric W. Troan – This book is exceptionally well done. It covers many Linux-related topics… from creating daemons to interacting with terminals and process groups. It’s well organized, well-written, and in-depth. I really wish I had this book years ago when I started working with Linux.

Compilers

  • Engineering a Compiler by Keith Cooper and Linda Torczon – Unlike most books listed here, this is a college textbook on writing compilers. It is not an easy read, and isn’t meant to be. It is, however, a good book on compilers, their construction, the algorithms involved, optimizations, and a wealth of other topics. While many of the books on this list I could get through in a month or less, this one took over a year to complete. One standout feature of this book is that it is more up-to-date than others, and I think the authors communicated the topics well–even for a non-CS major like myself. Note: the link is for the second edition, but the one I read was the first edition.

Writing

This may seem like an odd category to have for a guy who is focused on technology. But as William Zinsser said in On Writing Well:

Clear thinking becomes clear writing: one can’t exist without the other. It is impossible for a muddy thinker to write good English. He may get away with it for a paragraph or two, but soon the reader will be lost, and there is no sin so grave, for he will not easily be lured back.

We’re in a position where we need to communicate ideas, issues, and resolutions to people of non-technical backgrounds; the better we can communicate, the less friction and frustration you encounter and you reach an outcome more quickly. And, at least for me, most of the issues I’ve encountered were not technical, they were misunderstandings or misinformation because someone failed to communicate the issues clearly. So I read about writing and practice the art of writing to help myself communicate more clearly.

  • The Elements of Style by William Strunk and E.B. White – One of the thinnest books you’ll ever read and still manages to be packed with more information than books twice its size. It’s an excellent read and a great starting point for anyone who wants to improve their writing. Like any book on writing, it’s easier to read than achieve.

  • Style: Lessons in Clarity and Grace by Joseph Williams and Gary Colomb – I consider this book a follow-on to The Elements of Style. It goes quite a bit further in many areas but still focuses on clear, deliberate, and elegant writing. It’s surprising how often we write prose that is mushy, ambiguous, and evasive. This book highlights those instances and provides many great examples of how to add clarity. It also talks about the ethics behind writing and our duty as writers to not mislead our readers.

  • On Writing Well by William Zinsser – An excellent guide to writing nonfiction. It doesn’t go to quite the depth of Style: Lessons in Clarity and Grace, but it’s a little easier to read and is still packed with wholesome advice on writing.

Over time, I’ll up date this page with more recommendations.