Jiri Novotny recently published his list of 30 books everyone in the software business should read. A friend linked it on Facebook and asked us what we thought.
I wasn't impressed because there aren't enough software books in the list and some of the books seem trendy or interchangeable with better titles. Jiri lists some excellent books, and I have many of them, but it seems wrong to call out these 30 as special. (My bias towards technical founders surely doesn't help my opinion.) So now I'm on the hook to come up with a top 30 list of my own. Oops.
The Internet is chock full of good reading lists. For example:
- The first and second highest rated questions on Stack Overflow are about books.
- Jeff Atwood of Coding Horror and Stack Overflow fame has a recommended reading list.
- Clojure creator Rich Hickey published a list of influential books that helped shape Clojure.
- Hacker News not only has recurring discussions about books, but actually recommends books in the site's footer.
The trouble is a top N list of books doesn't make any sense. It's better to see a book as a very personal, very non-interactive conversation with an author. You don't inject a book and reify the ideas in your neurons. One book may be absolutely top in a subject, but if you have trouble understanding the author, or you're not ready for the ideas, you must try other books.
A top N book list only makes sense as a proxy for a top M idea list.
That's too much work for this post, so I'm compromising by tracing some influential books in my life and what ideas I took from them. The specific books will be different for you—perhaps you fell in love with software through the Internet rather than a home computer—even if the ideas are the same.
|Love and discovery of software|
|I have power! Understanding the machine, Static typing, Imperative languages|
|Good taste (My code is shit!)|
|Reading code, Finding community (Dr. Dobb's and BYTE in the pre-Internet)|
|Dynamic typing, Objects, GC, VMs, Domain languages|
|REPL, Functional languages, Unification, Back-propagation|
|Networks, Distributed computing, Processes, Memory, Security|
|Actors, Macros, MOP, Type systems|
|Human interfaces, Usability, Cutting corners|
That's 22 books covering a large swath of ideas. I'd swap out books if I were learning for the first time: Erlang instead of Hermes, Ruby instead of Smalltalk and Clojure instead of Scheme are easy swaps. Nobody needs "C Chest" anymore—the Internet has changed everything. Also, given the complexity of modern multi-core hardware, it may be better to skip hardware and imperative languages (and imperative OO languages) to make more room for topics such as lazy evaluation and software transactional memory.
With so many important ideas missing from the list, it's going to be a challenge to choose just 8 more books. Here are my choices in case anyone wants to help: