The Books That Every Programmer Should Read
I read relentlessly.
– Rich Hickey, creator of Clojure
Several years ago1 I did a talk at HackConf titled “The Books That Every Programmer Should Read”2. Back then the conference was geared mostly towards young aspiring software engineers, so I wanted to present on a topic that they’d find useful. Early on in my career access to high-quality educational resources on programming was very limited - the Internet was quite barren by modern standards and there were very few online resources, foreign books were very hard to procure in Bulgaria, and there weren’t that many experienced people to learn from. I’d tackle every book I could lay my hands onto, and as a result I wasted a lot of valuable time that I could have utilized better. On the bright side - after a while I could immediately tell if some book was going to help me level up my skills or not. I wanted to share my experience and help others prevent some of my mistakes, even if we live in a very different world today, and books might be starting to lose some of their relevance.
While, I didn’t feel that my talk was particularly special in any way, it became one of my greatest hits and I’ve been often asked to discuss certain aspects of it. Another thing that I’ve been asked to do was to put all the “good” books I mentioned during the talk in a list that people can easily refer to.
The Central Message
The central message of my talk was very simple - there are plenty of programming books out there, but the majority of them are not worth your time and you’d probably not learn much from them. I tried to give everyone a simple recipe to spot great books and hone in on them. A good book:
- ages very well
- covers topics that are applicable in a broad spectrum of programming languages and frameworks
- is written by practitioners (as opposed to academics/professional writers)
- goes way beyond the basics and teaches you how to effectively use a certain technology
- explains complex concepts in simple terms
- challenges the way you think and pushes you to expand your mind
I made the case that in general no one should read more than 1 reference per some technology (and for frameworks even this might be too much) and that usually there are only a couple of references in a certain domain that are much better than everything else out there.
I’ve also tried to make the point that after a certain point it doesn’t pay off very well to dig deeper and deeper into the same subject matter, and that you should consider expanding your knowledge horizontally - e.g. if you’re an OOP expert you should start exploring functional or logical programming; if you’re a back-end developer you should learn about the front-end technologies and so on. Ultimately, ideas matter much more than any concrete implementation of those ideas.
The Reading List
It was probably not apparent in my talk, but I had picked some of my favourite books in all the areas that I consider essential for the success of a programmer - e.g. CS fundamentals, operating systems, effective usage of a language/technology stack, software design, etc. Just to be clear - you don’t really need to read a dozen books on CS fundamentals or operating systems. Furthermore - some of the books listed in each section cover more or less the same ground. Just pick whatever seems most interesting to you.
One really important thing to understand is that the list that follows is just a sampling of the type of books that any (good) programmer should read. This article (and the talk) could have easily been named “The Type of Books that Every Programmer should Read” or “The Makings of a Good Book on Programming”. Still, naming remains the hardest problem in our industry and some titles are more catchy than others. I’ve noticed that too many people focus on the fact that some particular technologies are mentioned (e.g. Unix, C and Ruby). Obviously not all developers should know C and Ruby, but when discussing what makes a good reference book some concrete examples are always useful.
Bellow is a listing of all the “good”3 books my talk, grouped by categories.
CS Fundamentals
- Inside the Machine
- Code: The Hidden Language of Computer Hardware and Software
- Concrete Mathematics
- Structure and Interpretation of Computer Programs
- How to Design Programs
- The Algorithm Design Manual
- Introduction to Algorithms
- Compiler Principles, Techniques and Tools
Operating Systems
- Modern Operating System
- Advanced Programming in the Unix Environment
- Unix Network Programming, Vol. 1, Vol. 2
- UNIX and Linux System Administration Handbook
- The Design and Implementation of the FreeBSD Operating System
References
Note: Please ignore the specific technologies references here. My point was to simply list a few good reference books as a baseline for all of you, not to promote any particular languages.4 Still, I do believe that’s it valuable for everyone to gain some insight into the languages that shaped our industry (e.g. Lisp, C, Smalltalk), even if you’re never going to use them directly/professionally. Understanding the history and the circumstances that lead to some modern development is certainly going to make you a better programmer.
- The C Programming Language
- Programming Ruby
- The Well Grounded Rubyist
- Learn You a Haskell for Great Good
- Practical Common Lisp
- Land of LISP
- The Little Schemer
- LISP (LISP In Small Pieces)
Effective Usage
Note: Again, please ignore the references to specific programming languages. They are here for illustrative purposes only.
- The Elements of Style
- The Elements of Programming Style
- Effective C++
- Effective Java
- Java Concurrency in Practice
Software Design
- Code Complete
- Domain-Driven Design
- Clean Code
- Refactoring: Improving the Design of Existing Code
- Practical Object-Orientetd Design in Ruby
- Growing Object-Oriented Software Guided by Tests
Productivity
Project Management
Meta
The Greatest Hits
I realize the list looks daunting and probably few people will have the time to go over all the books in it. Many of them are definitely not light bedside reading material. I have to admit there are some (many) books on the list that I didn’t finish myself. If I had to narrow down the list to the 3 most important (impactful) books there those would be:
- Structure and Interpretation of Computer Programs
- The Elements of Style
- Code Complete
- Thinking, Fast and Slow
Seems, I’ve made an off-by-one error, but you’ll forgive me.
The Sequel
There are many great books that I didn’t mention in my HackConf talk (mostly due to time constraints). I’ll guess I’ll have to do a follow-up blog post for them. Generally speaking, I wanted to give people an idea of what a quality book means and I was certain they’d be able uncover more of those. Teach a person to fish and all that jazz…
That being said, I wouldn’t mind following up on my original talk with a sequel that expands on the basic ideas I outlined there and refines the list of books presented. There were a couple of topics that I intentionally avoided (peopleware/soft skills, leadership), so there’s definitely some more ground to cover. Not to mention I read quite a few other great books since 2015. And I should probably do it in English next time!
Epilogue
I think this is the only blog post that I’ve planned to write for 5 years before it became a reality. Better late than never, right? It took me quite a while to get to it, but this gave me extra time to reflect on my talk. Sometimes even I manage to find a different message in my presentations after ruminating on them for a while.
I hope this post will inspire you to do some quality reading during the lockdown5 and introduce a bit of joy in your life. It’d be nice of something good came out of it. By the way, why don’t you share in the comments your favourite books? I’d love to get some reading ideas myself!
-
Way back in 2015. ↩
-
You can find a recording of the talk here. (it’s in Bulgarian) ↩
-
In the talk I kept comparing some books that I consider “bad” to books that I consider “good”. ↩
-
I’m actually quite fond of promoting Lisp(s) - it’s an amazing and rather underappreciated language. ↩
-
As I write this in Spring 2020, much of the world’s population is under lockdown, because of the ongoing COVID-19 pandemic. ↩