I’ve read a lot of programming books over the years. My favourite programming text books are generally short, clear, teach you something valuable and don't add unnecessary fluff.
Here is a short list of the books that I look back on most fondly.
The C Programming Language, Kernighan and Ritchie.
Up until I read this book, most programming books I had read were huge. There is a certain part of the tech publishing industry (and by extension the tech book buying public) that seem to judge the value of a book based on the number of pages it has.
Before I read this book I fell into the same mindset. I’d read books like “Teach yourself Game programming in 21 days” or “The C/C++ Bible” which were huge books. The more pages a book has, the more you can learn from it, right? This book taught me that insight and value are not proportional to page count. In fact shorter books are often easier to process and better written.
Since then I’ve had a preference for shorter technical books. The shorter ones generally do a better job of choosing what points to include and explaining them succinctly, rather than including everything and then discussing with maximum verbosity.
Theory of Programming Languages or something similar, ???.
I can’t actually remember either the name or the author of this book - it was something like “Theory of Programming Languages” - but it’s probably the book that has been most influential on my programming career and sparked my interest in different programming languages.
I never owned the book, but I picked it up in the library one evening while I was in college and ended up reading the entire thing over the next couple of days. And then I went back and read it again. It was eye opening.
It was a book about programming languages and thinking about them more abstractly. It focused on 4 different classes of programming languages and went into detail about 1 language of each type - imperative (Pascal), object-oriented (C++), functional (Lisp) and logic-based (Prolog). This book taught me to think about programming languages more abstractly, in terms of what language features they support, how they implement them, and their general approach to computation.
It decoupled the language’s syntax from it’s features and made it much easier for me to learn new programming languages.
The Little Schemer, Daniel P. Friedman and Matthias Felleisen.
This is a wonderful little book that through a series of short, repetitive, incremental examples teaches you to think about computation in a functional, recursive way. It’s framed as a series of questions and answers. I found it really engaging and it’s one of those books that changed how I think about programming.
Python Essential Reference (2nd edition), David M. Beazley.
Short and small, this book somehow managed the trick of being a good tutorial while simultaneously being a good reference, all without turning into a tome (I had the second edition, later editions doubled the books size so I suspect later editions don't maintain the character of the 2nd edition). When I first started doing python development I kept this book close to hand all day, every day.
Best of Ruby Quiz, James Edward Gray II.
A book full of interesting little problems along with discussion of various solutions (derived from the ruby quiz website. This example/solution format was really good way from me to improve my ruby code, and analysing the differing approaches to solving each problem was both instructive and fun.
Data Mining: Practical Maching Learning Tools and Techniques with Java Implementations, Ian Witten and Eibe Frank.
There are several good, practical books on Machine Learning around now. But back when I was doing my Phd there weren’t. There were plenty of books about Machine Learning but they were all very theoretical. You really had to decode a lot of theory and notation if you wanted to implement a ML algorithm. This was the first one that explained how the various algorithm worked through working code examples, and focused on the practical elements of using Machine Learning algorithms - stuff like feature selection, evaluation etc. I grokked ML a lot better after I read this book than I had from reading the various classic texts that take a more rigorous, theoretical approach.
The Joy of Clojure, Michael Fogus and Chris Houser.
This is the only recent book on the list. It focuses in idiomatic functional problem solving in clojure. It’s the only book I’ve read in recent years that’s had a really profound effect on how I think about programming. It’s not an easy read. When I first tried to read it I found myself lost before I finished the first chapter. So I went and read a couple of other clojure books first and then came back and tried it again. Once I’d read the other clojure books and written some substantial clojure programs I found this book a rewarding read.