The Best Software Development Books Ever

Todd Reed

I was recently grazing through the Safari Books Online library looking for good software books to read and came across Apprenticeship Patterns. Skimming the table of contents, I came across section 6.3—“Study the Classics”. In this pattern the authors recommend finding and reading the best literature from your field and focusing on the “long-lived books”:

When you pick up a book and the first thing you wonder is how out of date it is, you’re reading the wrong kind of books.

This is great advice. In general, the great books—the ones that you remember a decade after you’ve read them—have content and style that keeps them relevant for an era or longer. I was disappointed though that Apprenticeship Patterns didn’t offer a suggested reading list of classics, with the exception of mentioning that The Psychology of Computer Programming was considered a classic by one of the authors. So, to fill the void, here’s my list of the best software development books ever1—the classics—in no particular order:

  1. The C Programming Language, Second Edition, by Brian W. Kernighan and Dennis M. Ritchie

    I wouldn’t normally put a book about a specific programming language in this list, but this is the exception. The C programming language has a special role in the history of software development. Arguably, C is the most popular programming language of all time; and though most programmers don’t use C anymore, C still permeates our universe. Every relevant operating system used today is written in C, and the foundations of almost every platform/framework in widespread use are written in C. Pretty much everything running on your computer and the server your computer is talking to is executing C code at some level2. You’re only half a programmer if you don’t know C, because you can only play with the top half the world’s software stacks. C is today’s assembler; knowing C helps you understand how things work. The historical and current significance of C, and the fact that The C Programming Language is co-authored by C creator Dennis Ritchie, make this the definitive C guide, and a de facto classic. But The C Programming Language deserves “classic” status for another reason. It is so concisely and elegantly written, innumerable subsequent programming language books have tried to mimic and emulate its style3. Grokking this book will teach you not just C, but also how to be a better writer, and by corollary a better programmer.

  2. The Mythical Man-Month: Essays on Software Engineering, Anniversary Edition, by Frederick P. Brooks, Jr.

    This book was written before software methodologies became fashionable and were spelled with capitalization. And, unlike most recent books on methodology that rationalize their rituals with (mostly) hand-waving, fabricated jargon, and marketing-like language (yes, I mean those “agile” ones4), The Mythical Man-Month doesn’t try to baptize its readers into some cult. Regardless of what methodology you may practice, the MMM is an essential read to gain some perspective and diversity in your thinking about how software can be successfully written5.

    (Of note, Brooks has a new book out: The Design of Design. I have my copy, but haven’t read it yet.)

  3. Peopleware by Tom DeMarco and Timothy Lister

    This is, hands down, the best management book I’ve read. Granted, I haven’t read many management books—two, maybe three. But that’s because this one is so good I didn’t need any others6. If you’re a manger of a development team, read this book to learn what you’re probably doing wrong. If you’re a developer, read this book to influence your manager or prep yourself for becoming a manager. I don’t agree with everything in this book, because I firmly believe that there’s more than one way to successfully write software. A lot of advice given also caters to “big” companies, and may not apply so much to start-ups and small teams.

  4. Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John M. Vlissides

    This is a catalog of object-oriented design patterns. Today’s software frameworks implement many of the patterns from this 15 year old book, so nowadays we seldom have to ourselves. But, whenever you start to implement something that starts getting hairy, it’s worth consulting Design Patterns. Even if it doesn’t have a pattern for your particular case, it will put you in a frame of mind conducive to modelling your problem in an elegant fashion.

  5. Structure and Interpretation of Computer Programs, a.k.a. SICP, a.k.a. the Wizard Book by Harold Abelson and Gerald Jay Sussman

    I was fortunate to have used SICP as the text in my first year as an undergraduate at the University of British Columbia. The department had just created new curriculum for their introductory programming course based on the MIT curriculum that also used SICP. While most of my peers were taking the traditional course that taught Pascal, me and about 20 other students were siphoned off to be guinea pigs for the department’s pilot class using Scheme and SICP. At the time, I wasn’t so impressed. But in my subsequent years at university, I came to appreciate and realize how much I had learned from Scheme and SICP. Now Scheme is my favourite programming language that I don’t use.

    Although Scheme is the language of instruction in SICP, the book isn’t about Scheme per se—it’s about the fundamentals of programming: abstraction, modelling, recursion, etc. Scheme is just the vehicle for teaching (albeit a darn good one—most languages can’t do what Scheme can). I’m hesitant to recommend this book to someone who’s already learned to program, as the book is geared towards academic study and could be a grind to work through outside an academic setting. You can read SICP online if you’re inclined though.

  6. Compilers: Principles, Techniques, and Tools a.k.a. the Dragon Book by Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman

    Just like I consider knowing C a prerequisite to calling oneself a real programmer, having at least once written a compiler (or translator, or interpreter) is also a prerequisite. This is the book on the subject7. Don’t read it till you have to though, because you probably won’t be able to finish it. It’s the type of book where you read just the sections you need when you’re implementing that particular aspect of your compiler (or translator, or interpreter).

  7. The Art of Computer Programming, Volumes 1-3 by Donald E. Knuth

    You need the box set, if for no other reason, to put on your desk as an ornament, to impress others, and pay homage to Knuth. Should you ever need to implement a random number generator using the linear congruential method, you may actually take Volume 2 out of the box and open it (carefully!).

  8. The Best Software Writing I

    This is a collection of essays from various authors selected by Joel Spolsky. It’s casual reading, but insightful—and sometimes funny. I loved the comic contribution, Excel as a Database, by Rory Blyth8.

  9. Hackers: Heroes of the Computer Revolution by Steven Levy

    Hackers is a chronicle of early hacker culture. Reading it won’t make you a better programmer9, but it’s an entertaining read if you consider yourself part of the hacker community and you’re at all curious about where that community evolved from.

    (The 25th Anniversary edition of Hackers was recently released. There’s little new content in the anniversary edition, except for a new afterward. Part of me wishes this book was extended to fill in the last 25 years of hacker culture, but I don’t think that would be possible. The point in time that Hackers leaves off is really the beginning of a new era in software development quite different from the early pioneering era. In some ways, the hacker community has collapsed since then, but in others ways it exploded.)

Okay, that was boring and unoriginal. I expect most of these books to be on everyone’s “classics” list. My real motive here is to find the classics I’ve missed. If you’re reading, let me know what I need to add to my list.

That I’ve read (with one exception—or is that three exceptions). ↩︎

Java, Python, Ruby, Perl, and PHP programs are all executing on a runtime implemented in C (and sometimes C++ too). ↩︎

Need I say more than “Hello, world!” ↩︎

Don’t interpret my jab at agile methodologies as my definitive position. It’s more complex than that, but that’s for another time. ↩︎

Yes, there’s more than one way to write great software. ↩︎

I’m kidding. Sort of. ↩︎

Well, it was, and I think it still is. ↩︎

I’d link to it, but the site is down or gone right now. You’ll just have to find the book or google it. Or maybe this will work again in the future: ↩︎

Well, it might. In the afterward of Hackers, author Steven Levy writes “Through chance encounters, email, and tweets, people constantly tell me that reading Hackers inspired them in their careers or their thinking.” So, indirectly at least, reading Hackers might make you a better programmer. ↩︎