More recently, _Land of Lisp_. I already knew much of the material, but a very fun read. (Nice stickers, too!) I'd suggest this as a starting point for people new to Lisp, maybe even before _The Little Schemer_ (!).
I read most of chapters 3, 4, and 5 of SICP in one night and the following morning. (I'm on the second pass, doing most of the exercises, and nearly done with chapter 2. I'm taking a break, though.)
_Thinking Forth_, by Leo Brodie et al.
_The Awk Programming Language_ by Aho, Weinberger, and Kernighan.
_Programming Pearls_ and _More Programming Pearls_ by Jon Bentley.
I couldn't put _CTM_ (http://www.info.ucl.ac.be/~pvr/book.html) down, either. It took a while to get through, though - It's quite large. I tend to read two or three books in tandem and switch between them, but I was on that sucker 100% cover to cover. What a wonderful book!
I'm currently reading _Erlang and OTP in Action_ by Logan, Merritt, and Carlsson. I just got it in the mail yesterday, but quite good so far.
Also: When you're reading hard programming books, do the exercises! You don't have to do them all, though at least half is a good idea. It reinforces what you've read, and shows you what you actually know vs. what you just think you do. I tend to read the book first, then do exercises on the second pass.
SICP is astounding. Thoroughly worked through the first three chapters years ago. I'm constantly revisiting the later chapters.
I haven't worked through CTMCP, but that book is written in a lovely, compelling style with eye-opening statements on nearly every page. I'm also also finding that it's the ultimate Clojure book.
Monads aren't that hard, they're just one step too general - at first, it's not clear what their examples have in common. It helped when I realized I'd already written "monadic" code in OCaml and Scheme, and with pipelines in shell scripts. (Getting away from the avalanche of category theory terminology mixed with nonsense about burritos and space suits also helped. The epiphany itself matters, not the stepping stone!) Also, starting with a simpler monad (e.g. Maybe) makes the plumbing clearer.
For interpreters / compilers, I prefer the treatment in EoPL to SICP's. There's an awesome "converting an interpreter to a continuation-passing-style interpreter to a CPS-based compiler" section in (only) the first edition of EoPL.
What really impresses me about CTM is how much deep material it ties together, from all over the place, yet the book is still extremely easy to follow. Somebody just starting in CS could benefit tremendously from reading its take on concepts when their other textbooks stump them. It's one of the most readable textbooks I've seen. (PAIP is another.)
I seriously considered quitting my job or taking a leave so that I could spend a couple of months with CTM and SICP without being distracted by work.
Glad to hear Land of Lisp is fun. It's on my TBR list.
Since the first 2 schemer books can each be read in about a week (they shouldn't be read faster) it's a shame for anyone not to read them.
Incidentally, "NB." is the comment marker in J (http://jsoftware.com/). That makes me smirk.
Personally I dislike tutorials and the pedagogy that comes along with that style. Even when well done they seem wordy presentation of the trivial and obvious.
Serious computer science books (e.g., Knuth's Art of Computer Programming, Hank Warren's Hackers Delight) take careful reading and study; I read them for pleasure, but it is a different pleasure that I get from, say, a Lee Child's Jack Reacher novel.
I think there are good reasons for this situation. The interesting aspects of programming are complex, involve a deep understanding of multiple levels of abstraction, and require considerable background knowledge. This is incompatible with a mindless read.
Older books aren't necessarily better, but those remaining have been through a generation or two of garbage collection already, making it easier to find the good ones. Excellent books have been published recently, of course (http://www1.idc.ac.il/tecs/, http://landoflisp.com/), it's just easier to find them in hindsight.
Books about parsing techniques* rather than ANTLR (or whatever) specifically, language semantics and implementation techniques rather than an awful 200 lb. Wrox book with a mug shot on the cover, etc. tend to stay relevant for much longer. Rather than reading yet another API guide, check out _The Art of the Interpreter_ (http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-...). Also, CiteSeer (http://citeseerx.ist.psu.edu/) is a gold mine.
I haven't gotten _Hackers Delight_ yet, but it's on my list.
* Recommended: Dick Grune's _Parsing Techniques, a Practical Guide_. Lots of deep content, but would still be worth it for the bibliography alone.
There is something like "Gerry Susman is a research fellow at MIT. Guy Steele is a jolly good fellow".
I was of the same opinion until I read "Programming Pearls" by Jon bentley. The way it opens up a problem statement, thereby making you think is truly fascinating. If you haven't read it, please do.
His 1982 book, Writing Efficient Programs, and the 1981 precursor, Writing Efficient Code, ought to be read by every C programmer. Sadly, they are now out of print and hard to find. Writing Efficient Programs is a breezy tour of the tricks of the trade, but it is a serious list of hints (some subtle, some not) for making efficient programs.
[Edit: I've actually posted a short review of it after I finished reading it - http://eli.thegreenplace.net/2010/01/09/book-review-coders-a...]
_Masterminds of Programming_ wasn't very good, though I enjoyed the Chuck Moore interview.
I wish Arthur Whitney had been in _Coders at Work_.
I nominated him but he fell through the cracks. I think the book is weaker for it.
There's a wonderful story (which you probably know but it's worth repeating) that Roger Hui, the J guy, was asked who the best programmer was. He responded by saying that Peggy Lee was once asked who the best jazz singer was and she responded, "You mean besides Ella?" (By analogy, Roger's answer was "You mean besides Arthur?")
I submitted it to HN, as well. (I thought I had already.)
Why do you say this? I thought it was very accessible.
Not sure what you mean by hardcore hacker though, unless you mean....most of the programmers in the book come from an era where assembly code and primitive machines were the only tools they had?
I found the part about L. Peter Deutsch (mostly) giving up programming for music particularly interesting.
Stroustrup's _The C++ Programming Language_, twice in a row, because I didn't want to be left out for not having taken Computer Science.
Butelhof's _Programming with Posix Threads_, because another book referenced its explanation of why Win32 threading had a bug because it could not, at the time, signal and wait on a mutex in an atomic way. There was something deep to find in those rowboats and bucket stories.
GoF's _Design Patterns: Elements of Reusable Object-Oriented Software_, because when I complained to a mentor that I was struggling to organize a dozen scientist programmers, he handed it to me, laughing.
John Robbins, _Debugging Applications_, first edition, because it was the first time for me that code didn't have the disclaimer, "of course you should insert error-handling code here." Basic x86 assembly in one chapter!
Books that I've really read and enjoyed:
JavaScript the Good Parts http://oreilly.com/catalog/9780596517748
Coders at Work http://www.codersatwork.com/
Programming Erlang: Software for a Concurrent World http://www.pragprog.com/titles/jaerlang/programming-erlang
On Lisp http://www.paulgraham.com/onlisp.html
The common theme: the authors reflect on the wyhs not just the hows. Programmer personality matters.
- Prolog and Natural-Language Analysis. An enjoyable introduction to Prolog and Natural Language analysis:
http://www.mtome.com/Publications/PNLA/pnla.html
http://www.mtome.com/Publications/PNLA/prolog-digital.pdf
- The Reasoned Schemer. I didn't read the other Schemer books, but liked this one very much. Simple and to the point.
- Purely Functional Data Structures, for showing how simple and elegant functional data structures can be.
My copy of _Foundations of Statistical Natural Language Processing_ just arrived in the mail, too. :D
Purely Functional Data Structures is excellent.
You may already have heard of it, as it's a classic in the Ruby community. It feels more like a work of art than a mere programming book, but you'll learn an awful lot while reading it. :)
_Land of Lisp_, for example, teaches quite a bit about the language while still being fun.
Inside Macintosh (especially the phonebook edition), (terse, but well-written, and describing a revolutionary system), but also some of the later books. For example,mtgs series on QuickDraw GX is tedious in it's repetition, but if you skip that, it nicely describes a very much complete 2D Graphics system.
How to solve it.
The art of computer programming (volumes 1, 2, and 3). What helped here is that my public library had them, but they are nice to read, if you have the mathematical background (it definitely helps to read this in parallel with a study in number theory, combinatorics, etc)
Anatomy of Lisp.
The art of the meta-object protocol.
Out of the inner circle.
The Soul of a new Machine.
Unix Internals, the new frontiers.
Effective C++.
SICP.
More recently, I found the C# specification a page turner. Easy to read, and almost every section made me think about why they chose to do things different from Java the way they did (examples: complicate the grammar by including structs, having signed and unsigned ints).
It follows a team of engineers at Data General around 1980 as they race to build a new computer under incredible pressure. It's an incredible story and anyone who has worked on a tightly knit team under high pressure will relate.
These had high I-want-to-read-itosity, I thought:
Abelson and diSessa, Turtle Geometry
Abelson and Sussman, Structure and Interpretation of Computer Programs
Aho and Weinberger and Kernighan, The AWK Programming Language
Andrew Appel, Compiling With Continuations
Jon Bentley, More Programming Pearls
Jon Bentley, Programming Pearls
Leo Brodie, Thinking FORTH
W. H. Burge, Recursive Programming Techniques
Carriero and Gelernter, How to Write Parallel Programs
A. K. Dewdney, The New Turing Omnibus
Edsger Dijkstra, A Discipline of Programming
Richard Feynman, The Feynman Lectures on Computation
Friedman and Felleisen, The Little Schemer
Friedman and Wand and Haynes, Essentials of Programming Languages [1st edition]
James F. Gimpel, Algorithms in Snobol4
Paul Graham, On Lisp
Philip Greenspun, Philip and Alex's Guide to Web Publishing
Grune and Jacobs, Parsing Techniques: A Practical Guide
Daniel Hillis, The Connection Machine
Kernighan and Pike, The Practice of Programming
Kernighan and Pike, The Unix Programming Environment
Kernighan and Plauger, Software Tools in Pascal
Donald Knuth, Literate Programming
Glenn Krasner (editor), Smalltalk-80: Bits of History, Words of Advice
Susan Lammers, Programmers at Work
Wm Leler, Constraint Programming Languages
Liskov and Guttag, Abstraction and Specification in Program Development
Peter Norvig, Paradigms of Artificial Intelligence Programming
Chris Okasaki, Purely Functional Data Structures
Richard O'Keefe, The Craft of Prolog
P. J. Plauger, Programming on Purpose I. (and II and III)
P. J. Plauger, The Standard C Library
Jef Raskin, The Humane Interface
Stuart Russell and Peter Norvig, Artificial Intelligence: A Modern Approach
Toby Segaran, Programming Collective Intelligence
Toffoli and Margolus, Cellular Automata Machines
Niklaus Wirth, Project Oberon: The Design of an Operating System and Compiler
Witten, Moffat, & Bell, Managing Gigabytes
(mostly from my old list at http://wry.me/~darius/personal/books.html)Skipping stuff commented on elsewhere:
While _The New Turing Omnibus_ is probably nothing too surprising to people here (at least not the subset that also hangs out on LtU, etc.), it's got a lot of approachable 2-5 page summaries of many major topics in CS.
_The Craft of Prolog_ is quite good, though perhaps of less interest to non-Prologers. _The Art of Prolog_ is essential, however. It's an SICP-caliber book, focused entirely on declarative programming, constraint programming, DSLs, etc.
_Compiling with Continuations_ rocks. It's an ML treatment of CPS-as-an-IR, like Steele's _RABBIT_ and Krantz et al.'s _Orbit_.
Godel, Escher, Bach by Douglas R. Hofstadter
Just a wonderful narrative of so many related topics across computer science, mathematics, cognitive science, biology, physics, etc. etc. And the author does get into some programming techniques and data structures (recursion, stacks, functional programming).
http://www.amazon.com/Mythical-Man-Month-Software-Engineerin...
qualify as a programming book for this thread (maybe not)? It has no information on how to write "Hello, World" in any language, and little how-to information about coding, but a lot of information about effective programming, and it is a very interesting, readable book.
http://stackoverflow.com/questions/1711/what-is-the-single-m...
Not directly related, but here's a huge list of freely available programming books:
http://stackoverflow.com/questions/194812/list-of-freely-ava...
_Anatomy of LISP_.
I also did SiCP cover to cover in a few months when it first came out.
_SmallTalk 80: Bits of History, Words of Advice_. Fantastic stuff; reading about making those early 80s processors run ST efficiently is like watching early rocketry.
_The Unix Programming Environment_. This should date me.
_Threaded Interpretive Languages_ (during the FORTH craze of the early 80s). Cured me of FORTH.
Tannenbaum's book on MINIX (bought it the day it came out, had it signed by Tannenbaum at Computer Literacy in San Jose. What a crowd. I miss that store).
That's about it. Of course there are many other computer-related books that I couldn't put down, such as _A Few Good Men from Univac_ and _The Soul of a New Machine_. But these are not about programming.
I have TUPE too (and I was born in '82).
Larry Wall is a mad genius, I don't care if anyone says otherwise. Plus its frequently laugh out loud funny.
I learned two things from doing this: 1) PHP is a great language for beginners and 2) The details you read in a book like that won't stick with you forever, and you'll have to use the book as a reference anyways...
A book that really makes you think about algorithms and the kind of clever tricks that are sometimes needed to make things work fast.
From the preface: "This book presents the results of Project Oberon, namely an entire software environment for a modern workstation. The project was undertaken by the authors in the years 1986-89, and its primary goal was to design and implement an entire system from scratch, and to structure it in such a way that it can be described, explained, and understood as a whole. In order to become confronted with all aspects, problems, design decisions and details, the authors not only conceived but also programmed the entire system described in this book, and more."
However, looking back over some books I've read for ones that I read cover to cover without much of a break, one was programming in scala - I thought it was well written, but it was also an easy read as I was familiar with much of the material, and it was very relevant to what I was doing at the time. There are books that I've really enjoyed where at least some of the content was truly new to me, like "essentials of programming languages", and "concepts, techniques and models of computer programming" - I can't honestly say I read the latter without taking a break every now and again though. But both of these books are very enjoyable and present the material in really nice ways. I wish I'd had these as an undergraduate.
I did read the pragmatic programmer a long time ago, pretty much cover to cover. Trying to reread it now, it (and the other books I've attempted to read of theirs) seem like the pop psychology of programming books. I enjoyed it at the time, and felt it was worthwhile. Probably a better book for programmers starting out. When I attempted to read it again I found it patronising and self indulgent.
edit: grammar
Simply Rails 2 was the last book I read like this 2 years ago. We are now one of Engine Yard's case studies.
When I want to learn a new programming language or a new framwork, I always look for that kind of books. The last one I did was "Agile Web Development with Rails" a few years ago.
Expert C Programming, Peter van der Linden (a decade later).
Effective Java by Joshua Bloch.
This was the first programming book that actually made me laugh at times. The writer's style is wry and very accessible. His strong opinions and commentary kept me glued. Admittedly I didn't read every word but IMHO this is one of the classics.
Ditto for Sedgewick's "Algorithms" book.
I look up the ONE solution I need, read the associated 2-3 pages, and put it away for another few months.
TCP/IP illustrated Unix network programming Advanced Programming in the unix environment
One of my favorites in Beautiful Data was about the architecture of the Mars lander. Enthralling stuff.
http://www.amazon.com/Java-Good-Parts-Jim-Waldo/dp/059680373...
http://www.amazon.com/PHP-Good-Parts-Delivering-Best/dp/0596...
It's inspired by _why's Poignant Guide to Ruby.
- Skiena's Algorithm Design Manual. Lively presentation of standard algorithms, with some very fun war stories thrown in. I found it a lighter read than CLRS and TAOCP (those are books you study).
- Segaran's Programming collective intelligence. Quick paced introduction to data mining in Python. The code in the book is very informal but easy to understand.
I read The Little Schemer in three or four sit-downs. (I think the author advises not to read it in one sitting.)
1) Metaprogramming Ruby.
2) The Art of Rails.
3) Ruby Design Patterns
4) Services-Oriented Architecture in Ruby
These stick out for me. Even if the last one in the list felt a little "rushed to production", it still covered important topics you won't find anywhere else. Plus I find when a book has typos (either in the text or in the code), that just makes me engage with it a little bit more.
Really? I wasted almost an hour double-checking my code due to a typo in an algorithm in _Programming Collective Intelligence_ (pg. 35, should end in "return num/den", not "return 1.0-num/den".) That's just sloppy. I added it to the errata page (http://oreilly.com/catalog/errataunconfirmed.csp?isbn=978059...).
It makes me feel that while the author's explanations are pretty good, the code samples are rather dodgy. I've switched to looking up the relevant mathematical formulas and converting them to code myself.
when a book has typos, it makes me want to throw it in the fire.
I don't understand your "makes me engage with it a little bit more" reaction, though. I really don't. Could you explain?
2) The Pragmatic Programmer
Code Complete. Practice of Programming.
Cathedral and the Bazaar. Open Sources. Hackers and Painters. Joel on Software. Coders at Work. Just for Fun.
SICP seems to be really well written so far, but it's not the kind of book you're going to read in one sitting.
* _Why's Poignant Guide to Ruby[1]
* The Tao of Programming[2]
[1]: http://mislav.uniqpath.com/poignant-guide/book/[2]: http://www.canonical.org/~kragen/tao-of-programming.html
Why's guide has enough non-text/geeky humor to keep me reading. And, it's mostly pictures! You're learning, but it doesn't 'feel' like you're learning.
The Tao of Programming flows differently than other books, which blast you with information. Instead of telling you stuff directly, it is anecdotal. Rather than didactic, it's like a parable.
On topic: Paradigms of Artificial Intelligence Programming by Norvig was a cover-to-cover session for me. It does not try to teach programming but to think about the structure of a solution.
It appears to be a bit expensive at the moment, but it's commonly used as a textbook, so there's a plentiful used market for it.
http://www.amazon.com/Understanding-UNIX-LINUX-Programming-P...
Can't overstate its usefulness to me. Programming was hard, Think Python made it easy.
EDIT: The anecdotes in the book were entertaining, and the content interesting.
I have yet to see any author of a programming book that possesses a writing style that will keep me reading. However, often it's not important, as there are other reasons to keep turning the page. ;-)
The original "Java In a Nutshell" - it was dry reading, but at the time is was sooo useful.
C++ Primer Plus by Stephen Prata - this was the book that got me into programing "as a career" so to speak. I picked it randomly off the shelf and it turned out to be foundational :)
Pro C# 2008 and the .NET 3.5 Platform by Andrew Troelsen (there's a newer edition about .NET 4 which I haven't managed to read yet)
Recently I've been reading "Functional Programming: Application and Implementation" with alacrity. Only 50 pages or so in, but very good so far.
The publisher is Manning, from which I'm currently reading another book (iPhone and iPad in Action) and it's pretty awesome too.
1st time: WTF? 2nd time: the light went on.
2. Clean Code
3. Metaprogramming Ruby
2. Advanced programming in the unix environment