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]
+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.
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.
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.
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.
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.
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:
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#.
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.
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
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.
Two really good JS books that I gladly recommend to anyone to read are:
Eloquent JavaScript which was an amazing starting point for me to learn JS “properly”. And this is the first programming book I read.
JavaScript - The Definitive Guide (7th edition) - which I consider to be the JS Bible I have it next to my desk and open it regularly.
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.
Despite having some JS experience, I’m going through JavaScript - The Definitive Guide to fill my knowledge gaps and I quite like it so far too. I’m finding the pace really good, in that introduces some concepts briefly early and then expands on them later.
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.