Hacker News new | past | comments | ask | show | jobs | submit login
My Top 100 Programming, Computer and Science Books: Part One (catonmat.net)
254 points by bootload on Apr 26, 2015 | hide | past | web | favorite | 60 comments

I'm a little skeptic; how many books has one to read to make a useful 100-book recommendation? Most of these books need a lot of time to skim, read, reflect, exercise, etc.

For example, surely he is going to recommend math books. It can be argued that most of the value of a math book is in its end-of-chapter exercise set, and that takes time. If discrete mathematics book A is more amenable to a 30 minute random page read and book B has a lot of insight in working through the questions after chapter 7, how can he reliably evaluate that, across a lot of published books in the area? And then jump to grammar, and then to programming languages, and then to best practices, and repeat that?

I mean, I love these posts, because they give me a list of books to research and "collect" in a wish list. But aren't they perpetuating the most cited books? Won't everyone end up thinking that the dragon book is great?

I'd much rather have a comparison of five good books on a given theme, with pros and cons.

EDIT: What would be great is, have several people at HN pick the subject area that they dominate, select about five books, and do a cross analysis (like, A is great for theory, B is a little bit weaker on that but a great introduction, and C has awesome exercises that compliment them. If that's too much, D is a very good summary of all three, without so much depth). That way we could all have a great, broad, crowdsourced set of book recommendations.

Yeah, skepticism makes sense. But "The New Turing Omnibus" and (IIRC?) "Programming Pearls" are structured so you can read them in bite-sized pieces. In fact, the books on this list seem unusually readable; at least the ones I've read.

And "The New Turing Omnibus" seems really under-cited to me. Maybe same with the "The Little Schemer" (and successors like "The Seasoned Schemer").

That said, all these books also have necessary flaws. (After all, they're single-author and in print; you can't build on most without law enforcement trying to come after you.) A good review would list negatives as well as positives.

Post author here - I've been collecting and researching science, math, physics, programming books since 2001 or 2002, so that is close to 15 years of book research. I'm really passionate about high quality books. I carefully evaluate every book that I'm about to buy, seek reviews, online previews and opinions. Then I make the purchase.

I did a degree in physics just for fun so I went through many math and physics books, but I'm really most passionate about computers, software development and programming so most of my recommendations are going to be on that.

I don't claim to have read every single book from cover to cover and worked through every problem but I can make educated recommendations, and I've gone through every book that I recommend. I've spent unreasonable amount of time looking for new books that are not top cited. Some of my recommendations will be top cited books but many won't be. Top cited books get my attention but they're not always good.

Talking about dragon book I'm probably not going to recommend it. It's not fun. You can't get things done with it in any reasonable amount of time. I've actually been thinking of writing my own book on compilers where you get things done quicker with less theory and it's fun. The problem with dragon book is that people recommend it just because they've heard of it. Hardly anyone has actually read it.

For the math books I'm not going to recommend standard text books much. My recommendations are going to be books such as Counterexamples in Topology, Counterexamples in Analysis. Those are super fun books to work through as counterexamples warp your mind a little bit, and you get that tiny adrenaline rush when you get it. Another example is To Mock a Mockingbird. It's not a text book, it's not a top cited book, but it's so fun. Another example Street-Fighting Mathematics.

For the physics books I'm also not going to recommend too many standard text books. I also won't recommend popular science books as they're mostly stupid and won't stretch your mind a little bit. They may blow your mind a little bit but they won't stretch your mind. Example physics book recommendations include Thermodynamics by Enrico Fermi, just beautiful explanations of the most the basic thermodynamic concepts. Another example is Quantum Paradoxes by Yakir Aharonov and Daniel Rohlich. I'll stop here as it's too many spoiler alerts. :)

Let's take a look at the books that I recommended in the first post.

1. The New Turing Omnibus - I read this book cover to cover in one evening. It's such a fun read and introduced so many concepts. I enjoyed one of the chapters about Busy Beaver Problem so much that I spent a few days implementing Busy Beaver in several languages and wrote a program that visualizes how the Beaver travels on the tape: http://www.catonmat.net/blog/busy-beaver/

2. The Little Book of Semaphores - I read this book back in 2002 or 2003 when it was just released in the 1st edition. I printed it for easier reading. I've a huge stack of printed pdf books and scientific papers (I just snapped some pics http://i.imgur.com/bjPgxMD.jpg, http://i.imgur.com/QJFumGl.jpg, http://i.imgur.com/FD2dx3L.jpg) and I just found the 1st editon of semaphores in my printed pdf stack (http://i.imgur.com/qe9hgHM.jpg). I worked through most of the problems.

3. Programming Pearls and More Programming Pearls - I just love the way Jon Bentley writes. I don't know what else to say. These two books really teach the basics of solving programming problems. It takes many years to master the basics in practice but these books teach the basics well. I once wrote a blog post (http://www.catonmat.net/blog/three-beautiful-quicksorts/) about Jon Bentley's chapter in Beautiful Code that he based on a chapter on quick sort in Programming Pearls.

4. The Little Schemer - I've gone through this book at least 5 times. Check out this photo that I just took of all the notes that I've made while reading it and the Seasoned/Reasoned Schemers (http://i.imgur.com/aeLEQh8.jpg). That is a lot of hours spent with these books. I enjoyed this book a lot and I copied out all the fun code examples and put them on GitHub (https://github.com/pkrumins/the-little-schemer), and I also wrote a blog post about deriving y-combinator based on one of the chapters in this book http://www.catonmat.net/blog/derivation-of-ycombinator/.

5a. The Elements of Style - I first heard about this book in 2006 or so when I got serious about becoming a great writer, started blogging and wanted to improve my communication skills. It's the most cited book and I gave in and bought it. It's really good because you can read it in a few hours and learn a lot. I follow many of the rules and guidelines in this book. I'm also going to recommend On Writing Well. Spoilers.

5b. The Elements of Programming Style - The Elements of Style + Brian Kernighan.

I wouldn't recommend a book that I don't trust is really well written. That just wouldn't be me. I stand behind my recommendations.

Hey, thank you for the thorough response.

Sorry, I was just trying to send the message of "perhaps we should take these recommendations with a grain of salt". But we should be doing that with everything, don't we? All in all, any of your book recommendations that I can reasonably evaluate for having read the book myself, they all seem quite good.

Mind you, I'm a complete stranger commenting on your free job without a lot of care :) and written words lose the tone easily. Perhaps it's me, but I read your justifications and I'm afraid my comment might have struck you the wrong chord. I didn't mean to bother you, and I'm sorry if that's the case.

I hope I don't miss the subsequent posts of the list.

Np. I just thought I'd share more insight about my passion. That comment came into existence by itself. :)

Thanks for the list and emphasizing the fun aspect of these books.

You're welcome!

One idiosyncratic list coming up.

Kernighan and Plauger, Software Tools, had a very big influence on my coding style and appreciation for the Unix Way.

If you want to learn more about Lisp macros, the exuberant book Let Over Lambda by Doug Hoyte is a fun read.

The best book to learn how to implement Forth-like languages is Threaded Interpretive Languages by R. Loelige. Dated and long out of print, but worth getting. Plus, as a Byte Book, it has one of those classic Byte drawings on the cover.

T is to Scheme what Scheme is to Lisp (kind of), and The T Programming Language by Jonathan Rees is the kind of book that cleanses your soul.

Donald Knuth's The Stanford Graphbase contains literate programs for several elegant graph algorithms.

Jim Sather's Understanding the Apple IIe is a terrific description of a computer from the bottom up, and shows you how deep knowledge of the hardware enables you to write software that breaks all the rules (viz. the recent demo that gets 1024 colors on an IBM CGA adapter).

On a more personal note, Puzzled Programmers by Michael Wiesenberg was a book published by Microsoft Press in the late 1980s. It contained 15 problems reminiscent of what you can find nowadays on Project Euler -- math problems for computer solution, but where brute force search is not enough. I spent many hours on them when I was in high school.

Do you mean the book on T by Stephen Slade? If Jonathan Rees did indeed write a book about it then can you share a pointer about it?

Sorry to get your hopes up, I meant the Stephen Slade book.

Ouch, that book doesn't seem easy to obtain through the usual online sources...

Wow you're not kidding. Out of print, no PDFs anywhere. I've placed an inter-library loan request, as my soul could use some cleansing.

My favorite one is Concepts, Techniques, and Models of Computer Programming:


I believe it's a terrific sequel to SICP, despite not using Lisp. The only little disappointment with the book is when they use Java as a canonical OO language to compare Oz/Mozart with. They should have used Smalltalk!

As a prequel to SICP, I love The Little Schemer.

I love The Art of Prolog too. As a modern successor to Prolog, https://probmods.org/ is awesome.

If we talk about theoretical CS, http://en.wikipedia.org/wiki/Computers_and_Intractability is terrific. Very short and elegant.

I'm working through SICP and the Little Schemer simultaneously and I think they complement each other well. I might have gotten bored if I tried to do the Little Schemer on its own at first, since it's primarily a mental exercise and with SICP you get some actual programming projects to do.

Entirely possible to do almost all The Little Schemer using Dr Racket, and I'd recommend that

I haven't yet read the book but I did try installing the Mozart system in my system and I had a bad experience about it. I remember seeing some segmentation fault error before giving it up.

Is it possible to follow along The Little Schemer with Clojure? I'm afraid I don't know any other lisp.

I believe I have seen some of The Little Schemer code translated into Clojure, and most of that looked pretty trivial changes.

But I doubt you would gain anything from doing that. If you know Clojure you can pick up what you need of Scheme (new concepts get added as you progress throu the book) almost immediately. It really is not a book on Scheme, but of thinking about problems in a recursive way.

Some of the TCO stuff, may not translate well either. IMHO it would be distraction from what the book is about.

The Little Schemer actually teaches you Scheme from the ground up, and as a Clojure Programmer myself I'm feeling right at home.

I've love to see a condensed list that focuses on the top books for a given context. The best 2-3 books to read when you are interested in learning how to program, the best 2-3 books for a new developer in his/her first professional job, the best 2-3 books for someone looking to move into a senior technical role, the best 2-3 books for moving from web to mobile, etc.

Doing that for each "specialty" would be amazing, but necessarily a team effort. Moving from desktop development to web development a few years ago was an interesting experience for me.

I actually wrote up a list for "college hires" last year if you need one https://medium.com/@the_ajohnston/three-books-developers-sho...

Absolutely, thanks for the list. I'll share my own personal one for that same context :)


I'd like to offer a partial thumbs-down to the one non-programming book suggestion: Strunk & White's Elements of Style has been criticized as, well, not the best possible advice, by G.K. Pullum, here: http://chronicle.com/article/50-Years-of-Stupid-Grammar/2549...

I think many of us could do worse than to follow S&W's writing advice, but I also think the book is given more reverence than it's worth, maybe just because it's been a tradition in English education.

There are much better books that do a similar job. Try out Writing Tools by Roy Peter Clark and A Sense of Style by Steven Pinker.

I did a similar post ages ago[1], although less ambitious at only 7 books. I've since read the Turing Omnibus and The Little Schemer and I was glad to see them on the list. I wish I'd had them when I was much younger. In addition to Programming Pearls I would also add "Software Tools" by Kernighan and Plauger.

I never read The Elements of Programming Style but very early in my career I chanced into the single-page excerpt "Brian Kernighan's Programming Style Tips"[2] which has probably been the single most influential document on practical programming I've ever read.

Edit: Almost forgot, Programming Erlang by Joe Armstrong was also a landmark book for me, and if I were to redo my list I'd certainly add it.

[1] http://www.youell.com/matt/writing/?p=4 [2] http://ellard.org/dan/www/libsq/ref/style.html

I read The Elements of Programming Style early in my career, and in the context of the early '80s I remember it to be superb. And fairly short.

"Hacker's Delight" by Henry J. (Hank) Warren. Despite the unfortunate title[0], it teaches (with code) numerous tricks, algorithms, ideas, that really improve performance and function of programs.

[0] not "hackers" as in those who try to crack into systems, but rather as in those who enjoy writing professional, clever, and efficient code.

Get the 2nd edition, of course. It's three times as long.

I don't know if I've ever really learned anything from Hacker's Delight, though. It's more of a cookbook. If I learned anything it's that a lot of dead CPU architectures were hard to program.

Asking about favourite computer books is also something I often do in interviews, whether I am the interviewer or interviewee. Partly to find out about if we share a common perception of relevant books but also to find out about books I am not aware of or to get a new insight into.

So I very much like this post and found several books to add to my reading list. :)

I did once blog about whether teams/departments should have a required reading list http://blog.flurdy.com/2011/04/required-reading.html . (Note that post was 4 years ago so the suggested list would have quite a few tweaks and was aimed at devs in my then niche)

I've done this before, and nearly every time the person has said to me "Oh, I haven't read a programming book since university. I do all my reading online".

It seems to be a common thing, which is a shame. I've always been fond of books, and unless you're pirating some classic texts and reading them as PDF's on your computer it feels like people miss out on a lot of quality content.

How often do you come across this? Admittedly, when I've been directly involved in interviewing this has almost always been for people under 25 coming into a junior level role.

I know but different people learn and keep up to date in different ways (or not at all) so for me it is not a yes/no criteria on whether they get hired/approved by me. Just another piece of data to evaluate on.

And similarly unfortunately the majority I encounter don't read many if any books. If people only read books then that is perhaps an issue as well. And reading a specific technical book about a specific software version is also usually a waste of time in my opinion. Read howtos online and experiment away instead.

I do tend to interview more mid-to-senior level of which how they keep up to date is more relevant. I am not expecting new grads to have read the entire backlog of Pragmatic bookshelf if any. Nor am I expecting anyone to have read the bricks (gang of four, Fowler's application patterns etc) cover to cover. But for example seniors not having heard of these bricks or the Clean Code and Pragmatic Programmer books is a red flag. If they know of them but disagree with them then that is fine, but not heard of them at all is weird.

In a previous job they sent me Clean Code and a couple of other books in the post to read a few weeks before I started. Which was a good sign that I was joining the right company, even if I had already read them all previously :)

The Little Schemer is a very fun book! If you are thinking about learning Lisp, go for it. At least, give it a try. It's quite different from most books out there, but it's very good nonetheless. I read it last year while in the train and it's quite entertaining.

EDIT: I forgot to explain why it's such a good book: it teaches you how to think in Lisp. It doesn't focus at all in the syntax.

    |                                    |
    |      This  space reserved  for     |
    |            JELLY STAINS            |
    |                                    |

I don't understand your comment. Sorry. Could you explain?

That's the classic joke from this book. End of first chapter, p. 13.

Only the true Little Schemer fans will understand my comment.

Go cons a piece of cake onto your mouth!

As someone who has never touched Lisp, why is thinking in Lisp good?

Functional programming/paradigm. It's a pretty nice language to learn it (my intention was to learn Clojure, but I read this book first so that I had an small base).

But today, one can learn functional programming also with other languages than Lisp.

The book isn't really about lisp, it's about thinking in terms of higher order functions and recursion, which apply in any functional language.

The same people have also written The Little MLer (http://www.amazon.com/The-Little-MLer-Matthias-Felleisen/dp/...).

Which is also brilliant, but is more about thinking in terms of types (more advanced type systems, then C/C++/Java etc).

Should make a good warm up for learning the likes of OCaml and Haskell

Almost all the exercises can be done in Haskell with a small amount of syntactic adjustment

The cool thing about learning in Lisp (or Scheme) is that the language doesn't really get in the way. It's less about learning the syntax of a language and more about focusing on the algorithms/concepts.

For instance, it's a great manifestation of lambda calculus.

Free online: Programmers at Work, by Susan Lammers (1986), https://programmersatwork.wordpress.com/about/ interviews the creators of dBase, PacMan, Postscript, Mac OS, DOS, Word, VisiCalc and more.

I'm so glad to see The Little Book of Semaphores on here, especially in the top 5. I didn't expect to see it on a list like this, but I found it to be immensely helpful. In my OS class last semester, my prof mentioned it almost in passing, so I don't think many people paid much attention to it, but it solidified my understanding of threading immensely, especially in anticipation of the thread pool we had to write.

Also awesome to see The Little Schemer on here. That was also a book that was recommended in passing in my comparative language class and again I don't think people paid much attention to it. But I learned a lot from it as well.

I'm looking forward to following this list.

I got excited for 100 books, then I saw "Part one" and got excited for 20-50 then I got to the article and was like 5!? Well, regardless, thanks for recommendations and looking forward to the next 19 parts.

Another vote:

Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages

for people like me who spent most of their career with 1-2 languages this is very eye opening.

If you didn't read yet I would totally recommend these two:

- 7 languages in 7 weeks, as it makes you know and understand decisions about inclusion/exclusion of some language features, for instance why/when to use dynamic typed languages vs statically typed - Programming Language Pragmatics, 'the bible' for those looking for understand programming language implementation

I personally didn't like the 7 languages book, to me it was a bit too shallow flavour of languages. The only take away from the book I had, was that IO looked to be a very sweet language to play with.

It was a textbook for a class I had on programming languages thou, and the class ended up not being the stuff I wanted to learn about so that may cloud my judgement.

Where's Knuth? Surely you want to focus on the timeless concepts, they'll never let you down.

It really isn't a good read. I own the first three volumes. They are really just useful as a relatively comprehensive reference text explaining a lot of base CS algorithms and structures.

Not sure why you got downvoted. My vote for Knuth too.

Please hurry and upload part two, as i'm about to finish every book in the first part.

Has anyone read the Art of Prolog -- i have it collecting dust but when I bought it I was intrigued?

Good start to the list, but pkrumins does that mean there are going to be 19 more posts?

No Richard Stevens?


Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact