Even though there is so much information on the internet, I’ve still found books to have been an invaluable resource in my programming career. I’ll share my favorites, but I’m also really curious about yours!
Martin Fowler - Refactoring
Personally, I think refactoring is not only an essential task of programming, but also a ton of fun! Martin Fowler’s Refactoring goes into all sorts of refactorings, from relatively simple refactorings like inlining a variable to more complex ones like introducing a special case. It explains these refactorings systematically while still being very informative and an easy read.
Reference: Refactoring and Catalog of Refactorings
Uncle Bob - Clean Code
One of the most influential programming books I’ve ever read, it really made think more about how I structure and write code. Things like: trying to have all code within a method be on the same abstraction level, really was an eye opener. While I don’t necessarily agree with everything that’s in the book, I still think much of it holds up quite well.
Reference: Clean Code: A Handbook of Agile Software Craftsmanship [Book]
Krzysztof Cwalina, Jeremy Barton, Brad Abrams - Framework Design Guidelines
This book describes the design challenges and the solutions the people who designed the .NET Framework have come up with (whilst also acknowledging some of their failures). It was not only very informative for understanding why the .NET Framework is designed as it is, the wisdom contained in this book applies to many more languages and platforms.
Reference: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 3rd Edition [Book] and Framework Design Guidelines | Microsoft Learn
+1 for Martin Fowler 's Refactoring and for Uncle Bob! Uncle Bob’s article on the Liskov Substitution Principle really opened my eyes to the potential pitfalls of inheritance (a Square is not a Rectangle) and made me much more inclined to composition over inheritance.
Before those two, a big eye-opening book for me was Anti-Patterns: Refactoring Software, Architectures, and Projects in Crisis. It made me realize that I had recently constructed a solution which was an instance of the Blob anti-pattern. I refactored it, and was later told by an employee of the client that my code was the most readable by any consultant she had ever seen.
I value the The Pragmatic Programmer most memorably for introducing the DRY principle.
I could go on (I’m a self-confessed biblioholic, after all), but I’ll stop now.
Three jump to mind for me:
The PickAxe: This was the canonical book on learning Ruby and I read it cover-to-cover many times. I found it to be outstanding. Obviously very language-specific but still!
Crafting Interpreters: I’ve read this recently and found it to be one of the most enjoyable programming books I’ve read in a long time. Clear, easy-to-follow but super powerful, and I love the challenges at the end of each page.
Ruby Under a Microscope: Another great book on understanding the internals of a programming language - this time Ruby.
I’ll update this as I think of more though
Mastering Regular Expressions - I used this book to learn regular expressions. Explains the basics in the first chapters, but then moves on to more advanced topics on how to create efficient regular expressions and how they work in different languages. I really enjoyed the deep dive into those advanced topics.
CSS: The Definitive Guide - CSS has a lot to it, but this book does a great job of going through each part of CSS and explaining each one in detail. It’s one of my all-time favorites because not only it’s great at explaining CSS, but everything related to it. After reading it, I not only felt I knew a lot of CSS, but also that I knew a lot more about fonts, animation, image and color. Made me really like CSS.
There are probably more that were great, but these 2 are the ones that come to mind.
+1 for Mastering Regular Expressions! That’s one I need to reread.
Of the two I carried around with me for years, the first was Steve McConnell’s “Code Complete”. The second (which didn’t help as much as the former) was Eric S. Raymond’s “The New Hacker’s Dictionary”.
One paper (not a book as such) that significantly influenced me is Kenneth E. Iverson’s “Notation as a Tool of Thought”
There are other programming books that I’m currently reading, but they’re outside the scope of the original question.
Hey @jmorganws - that’s great, thanks so much for the recommendation. Will certainly add that to the pile.
What a great thread, I’ll be here a lot for sure :D.
The first one that really opened my eyes was Clean Code for sure. More recently, I found 99 bottles of OOP perfect to deepen my understanding in SOLID, and make me go all-in in TDD too.
@pernambucano Nice! @kytrinyx will be pleased to hear that :)
I am not an old guy, but started the in the industry fairly early and educated myself as best as I could with professional books.
Back in the days I’ve read Code Complete 2 and it was a good starter.
Another excellent starter was Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development Hardcover by Craig Larman. (there is newer edition, but back than I’ve read that one).
I found GRASP Patterns (specially Low Coupling and High Cohesion) far superior to any SOLID ideas.
Fast forward 15 years later when I read Clean Code and found the book very basic and idiotic. I think Uncle Bob is overrated.
Going back to the early 2000s, I’ve read the GoF and “Pattern-Oriented Software Architecture” books. Back then I was smitten with the ideas presented there. I even got to meet some of the writers of those books.
Somewhat later in the early 2010s I found those books (the POSA’s) more “Not Applicable” than useless or wrong or complicated. Regarding design I reverted back to my early university instincts, back to the 90s. I found out that is actually called Domain-Driven Design (DDD).
I also became disillusioned by certain ways of working. I did not gave up and discovered Behaviour-Driven Design (BDD) own my own. Later I found books about it.
One can screw up in many ways:
- Hack and design spaghetti mountains
- Pompously build well crafted and architected mountains that nobody needs. Or just need a small functionality and the rest becomes cancerous growth.
Getting the requirements right became the most important thing for me. Latest books that I found excellent on this topic:
User Story Mapping: Discover the Whole Story, Build the Right Product by Jeff Patton (Author), Peter Economy (Author, Editor) - Favourite book.
- Writing Great Specifications: Using Specification By Example and Gherkin by Kamil Nicieja
- Behavior-Driven Development with Cucumber: Better Collaboration for Better Software by Richard Lawrence (Author), Paul Rayner (Author)
The thread is about “best books on programming”. I’ve ended up ranting.
Here in the end I will share a good technical book about programming:
Previously I found TDD as trivial (BDD and DDD is my main thing), but this book showed how to influence design with the right TDD (Detroit style of course ). Note: One can apply the concepts presented in the above book in any language not just C#.
Thanks so much for posting such a comprehensive and brilliant list of information on resources to delve into.
I am mid-way through the ‘Headfirst Go’ and really enjoying it. It’s been really good to build up from the ground up.
I recently enjoyed the recently released 2nd edition of Code: The Hidden Language. It provides a nuanced but accessible introduction to how computers work from the bottom up from and how code plays into it, highlighting Boolean logic, logic gates, semiconductors, and finally software. It made a few things click for me that were only semi-articulated before.
Of all the programming books I’ve read, two came to mind immediately because they were an absolute joy to go through:
Eloquent Ruby by Russ Olsen - which I think would be an interesting read for anyone interested in OOP, even if they have no intention of ever using Ruby.
Deep Learning with Python by François Chollet - which is by (very) far the most approachable book about DL I’ve ever come across.
I just started reading O’Reilly’s Programming Rust: fast, safe systems development and so far it is also extremely pleasant to read.
Crafting Interpreters is an AWESOME book. One of those books that can get you excited about programming again. I think an excellent final exercise for any language track would be to implement tree walk interpreter, maybe for the Exercism programming language haha. Something simpler than Lox though.
Also agree with Martin Fowler’s Refactoring. Got my copy from one of those take a book leave a book boxes not knowing how popular it was. Great read.
I’m also a rustacean so I’d be remiss if I didn’t mention Jon Gjengset’s Rust for Rustaceans. It’s an especially useful book for learning how to do effective API/Library design in Rust.
Totally agree with this!
I love this. @taiyab has been wanting a “final boss” style exercise for ages - maybe this is the one! If you fancy starting a new topic on this (so we don’t derail this one entirely!) then I’d be up for chatting about it more. I bet @ErikSchierboom and @kytrinyx would love this too
Oh, and welcome to the forum
Some of the books I wanted to mention have already been suggested by other fellow devs, so let me offer a suggestion from my country.
As an indian who started programming in my early school days, I found Let Us C to be a helpful entry point to the world of C programming.
What surprises me is that the book has been revised many times (running 18th edition now!) and with many readers in the Asian geographies. I think this book is translated to many regional languages, thereby making it easy to jump start programming without the knowledge of English language.
Kudos and mad respect to YPK, the author.
Two really good JS books that I gladly recommend to anyone to read are:
I’m currently reading the The Rust Programming Language. I think this is an insanely well written educational book. Very easy to follow, and makes you really excited about Rust. It also mentions some basic topics on Systems Programming langs that I didn’t know about, but can do the research after this.
I’ve been reading Modern Software Engineering by David Farley with some friends and would highly recommend it. I’ve been on the Uncle Bob train most of my career, but recently have been straying away from his work. I think he has essential concepts to share, but there is a deeper conversation past his books I think David Farley captures well. It’s been really helping me put my career and thoughts on programming into a new perspective.