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.

  • Becoming a Better Programmer by Pete Goodliffe – Another book along the lines of The Pragmatic Programmer and Practices of an Agile Developer. There’s some overlap with those books, but has some practices that are it’s own. The book is well-written and an easy read. And like the other two books, it’s a good reminder about the things we should be doing.

  • 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.

Embedded Systems / Portability

  • 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.

  • MicroC/OS-II: The Real-Time Kernel by Jean Labrosse – µCOS is a fantastic and wonderfully simple operating system. And while it’s not free to use, this book shows the source code behind one version of the operating system along with explanations of the architecture, structure, and implementation. The best thing about this book is how real it makes concepts you’ve read about in your Operating Systems class. This walks through the implementation of real constructs, such as mutexes, and shows how it all ties in to make an efficient system.

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, Anna Ravenscroft, and Steve Holden – 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. Note: link updated to new version of the book.

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. Note: this book in increasingly becoming out-of-date, but everything in it is still relevant. The only catch is that there are some better ways of doing things now that you’d miss if you make this the only book you read.

  • Clojure for the Brave and True by Daniel Higginbotham – This book is an easy read and does a great job of introducing CLojure concepts in a fun and witty manner. It is more of an introductory book, but it’ll definitely get you moving in the right direction.

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.

  • The Linux Programming Interface by Michael Kerrisk – This is very much like Linux Application Development above, but more in-depth. The two books together are pretty comprehensive and make for an excellent reference in building Linux applicaitons that harness everything Linux has to offer.

  • A Practical Guide to Linux Commands, Editors, and Shell Programming by Mark Sobell – The first of two books I recommend to those not familiar with Linux and navigating the Linux environment. I’m generally not a fan of these kinds of books, but Mark’s book is in-depth, well organized, and very informative. This one covers the basics of getting around as a normal user and provides a lot of information about the general layout and operation of a Linux system.

  • A Practical Guide to Fedora and RedHat Enterprise Linux by Mark Sobell – The second of two books I recommend to those not familiar with Linux and navigating the Linux environment. This book focuses on Fedora and RHEL/CentOS with the aim of giving you tools to begin administering the system. It is not a complete treatise on how to manage every aspect of a RHEL system, but it covers a lot of ground given the books nominal size and provides a solid foundation.

Networking

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.