This article is part of the article series "My Top 100 Programming, Computer and Science Books."
<- previous article next article ->

I was recently interviewed by Fog Creek and one of the questions was about my favorite programming, coding and development books. I got very excited by this question as I'm a huge book nerd. I'm crazy about science, computer and programming books. Every few months I spend a day or two researching the latest literature and buying the most interesting titles. I can probably go on forever about my favorite books. I've so many.

I was so excited about this question that I decided to start a new article series here on catonmat about my top 100 programming, software development, science, physics, mathematics and computer books. I'll do five books at a time as breaking huge tasks in tiny sub tasks is the easiest way to get things done.

Here's my bookshelf just to prove my nerdiness:

My super nerdy bookshelf.

In the first post in the series I'll re-share the same five books that I recommended in my Fog Creek interview. I expect this article series to go on for quite some time so if you're interested in this topic, you can subscribe to rss feed of my blog and follow me on twitter for updates.

Enough talking. Let's get to books!

#1 The New Turing Omnibus

The New Turing Omnibus.

A must read for anyone interested in computers. This excellent book contains 66 short essays on the most important and interesting computing topics, such as compression, Turing machines, recursion, formal grammars, non-computable functions, neural networks and algorithms. The writing style of this book is casual and it contains almost no math. It's my favorite book of all time.

I read this book cover to cover in one evening. I enjoyed one of the chapters about the 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. Here's my blog post about Busy Beaver.

Busy beaver puts another one on Turing machine's tape.

Author: Alexander K. Dewdney.

#2 The Little Book of Semaphores (free pdf)

The Little Book of Semaphores.

This book teaches how to think about multithreaded execution and how to solve synchronization problems. I highly recommend it, especially if you're self-taught and have never had an Operating Systems course. This book leads the reader step by step through a series of classical and not so classical synchronization problems. The style of this book is problem-hint-solution. In my experience this style of teaching is the best for quickly learning new concepts and problem solving skills. It's also a great fun to work through the problems and I've been recommending it to everyone ever since I found it.

Author: Allen B. Downey.

#3 Programming Pearls and More Programming Pearls

Programming Pearls and More Programming Pearls.

Classic programming books. Jon Bentley knows how to write clearly and enthusiastically about algorithms. These books are timeless and they teach you how to reason about problems, break them apart, and efficiently implement the solutions. You'll pass the Google interview if you read and understand these two books.

Author: Jon Bentley.

#4 The Little Schemer

The Little Schemer.

The Little Schemer teaches you a little bit of LISP in the most fun style ever. The book is a dialogue between you and the authors about hundreds of tiny Scheme programs and it teaches you to think recursively. This book will make you think and will stretch your mind a little. It's one of the most fun programming books ever written. You'll learn about car, cdr, cons, working with lists, lambda and y-combinator.

I've spent countless hours with this book. I copied out all the code examples and put them on GitHub (the-little-schemer repository), and I also wrote a blog post about deriving y-combinator based on one of the chapters in this book.

Only the true schemer fan will understand this message.

Authors: Daniel P. Friedman and Matthias Felleisen.

#5 The Elements of Style and The Elements of Programming Style

The Elements of Style and The Elements of Programming Style.

The Elements of Style is not exactly a development or coding book but a book on writing. To be a great developer you need to communicate clearly, simply and directly. Strong writing skills are essential to success. The book is just 100 pages long and you can read it in one evening. Re-read it every couple of months for full effect.

Authors: William Strunk Jr. and E. B. White.

The Elements of Programming Style is a classic programming book by Brian Kernighan. The form of this book is strongly influenced by The Elements of Style. It's an old book but mostly everything it teaches still applies today. It contains 70 rules of programming such as:

  • Write clearly – don't be too clever.
  • Say what you mean simply and directly.
  • Choose a data representation that makes the program simple.
  • Let the data structure the program.
  • Modularize...

Authors: Brian W. Kernighan and Phillip J. Plauger.

As a bonus, I recommend my own book Perl One-Liners, published by No Starch Press. My book teaches how to be fast in the command line and get things done quickly there. Being fast in the command line will save you thousands of hours throughout your career. Once you master one-liners, you'll be solving quick one-time tasks in seconds. I've seen programmers spend hours writing programs for tasks that can be done in 20 seconds with a one-liner. Don't be that programmer. Be like me.

Perl One Liners.

I hope you liked my first five book recommendations. Let me know in the comments what your favorite books are and until next time!

This article is part of the article series "My Top 100 Programming, Computer and Science Books."
<- previous article next article ->


Algorithmique Permalink
April 26, 2015, 20:55

Hello Peter,
Its a good idea, life is short and we need to choice rocks ;)

This is my list:
*-Kiselev's Geometry I&II(new Elements's book!)
*-The Art and Craft of Problem Solving(I've used 2nd ed) by Paul Zeitz(Psychological approach to mathematical problem solving)
*-Calculus(I've used 4th ed) by Michael Spivac (Unique book in calculus's world books!)
*-Discrete Algorithmic Mathematics(I've used 3rd ed) by Stephen Maurer, Anthony Ralston (Discrete + Algorithmic , Put it beside Concrete Mathematics;) )
*-The Art Of Probability by Richard Hamming (There are many many probability books but this one is the art of probability!)
*-Number Theory: A Lively Introduction with Proofs, Applications, and Stories(MatheMythical approach to the numbers)
*-Algorithms: A Creative Approach by Udi Manber (most inspiring algorithm's book forever!)
*-Computer Organization and Architecture_Themes and Variations by Alan Clements (Not so famous but really best COA book so far!)


May 03, 2015, 23:11

Thank you for this list, Algorithmique.

April 26, 2015, 21:48

Code (Petzold)
How to Solve It: Modern Heuristics (Michalewicz/Fogel)
Eloquent Ruby (Olsen)
Thinking Fast and Slow (Kahneman)

I have a copy of Pearls and periodically tackle some of the problems in it with Clojure. I am going to read The Little Book of Semaphores and I just bought a copy of The Elements of Style. (This has to be the third time I've seen this book recommended by another engineer.)

Nick Permalink
April 27, 2015, 02:26

Where do you find the time to read?

shahzaib asim Permalink
March 31, 2016, 14:00
on the clock in the above link of course :D xD

April 27, 2015, 02:32


This is my list:
1.Code Complete ( Steve McConne)
2.The Clean Coder: A Code of Conduct for Professional Programmers(Robert C. Martin)
3.Are Your Lights On?(Donald C. Gause , Gerald M. Weinberg )

April 27, 2015, 06:00

I have a few that I consider very good that most programmers have not read:

- Out of Their Minds: The Lives and Discoveries of 15 Computer Scientists

Exactly as it sounds, and a very fun read.

- A Mentoring Course on Smalltalk

Did more for my understanding of OOP than any other book in my collection, including Design Patterns.

- Functional C

One of the strongest discussions of the differences between functional and imperative programming. Out of print, but worth finding a copy used.

April 27, 2015, 09:29

Richard W. Stevens

google him

Tj Gabbour Permalink
April 27, 2015, 11:54

I don't have a favorite, but here's one...

The Elements of Computing Systems:

I use this to teach someone how computers work. Neither of us cared so far to run the simulation software; we just run everything by hand with our minds and whiteboards on the table. (Or when lucky, a whiteboard-like table surface.)

I find their assembly language rather unpleasant. But we got surprisingly used to their (binary) machine language, pretending we're the CPU control unit, quickly bored with longs trips to RAM and figuring out ways to make our job faster. (We also used a textual assembly I made up, as well as one using Clojure's EDN format.)

Same with the usual notation of logic gates. I just use boxes with names; I anthropomorphize them to distinguish them conceptually, rather than give them some weird visual shape.

Teaching is quite an undertaking. I prepare nice reference sheets (using Balsamiq) to visualize processes. I imagine I'll release them later.

This is a springboard for other texts, which I read to be able to answer questions. (Today, we're delving into input/output, which means I need to know more than "uh, the book says direct memory addressing." So I skimmed sections of books like: Hennessy & Patternson's "Computer Architecture", "See MIPS Run", Intel's "Software Developer's Manual", Ward & Halstead's "Computation Structures", Mano and Kime's "Logic and Computer Design Fundamentals".)

One theme that really comes out is, when you get to the register machine, it's like a board game. You wake up & start your turn, see what's around, do the thing, and end your turn. When we popped up briefly to a much higher level (Clojure) — with an explanation that followed how an interpreter works — it's kind of the same: you see a form and environment... well, there's a weird thing where you-as-eval call eval again (because the program is a tree rather than a list), so you awaken into into a new consciousness which starts its turn while you're still awake... but eventually you (hopefully) end your turn.

OKCarl Permalink
April 27, 2015, 12:42

I visit the Mathematica Demonstrations website in search of inspiration. Once there I download something close to my needs and then re-code it to my specifications. How do I go commercial with this effort? What book do I need to read to learn how to re-program Mathematica code in C, create a graphic user interface and, generally, go commercial? How do I transition from Mathematica enthusiast to making a living at coding?

titdymil Permalink
April 27, 2015, 13:47

Every time I return to your site I find something cool. You rock!

April 27, 2015, 15:08

It's great when people are able to put a list of great book titles together which is most helpful. There are a number of computer and programming books out there in hard back and eBook formats.

If you enjoy great books check out find me a book:

Zoeiro Permalink
April 28, 2015, 01:31

My "top":
SICP - Structure and Interpretation of Computer Programs
HTDP - How To Design Programs
CTMCP - Concepts, Techniques, and Models of Computer Programming

July 08, 2015, 18:41

All these books are great, I wish we could get a review of the most helpful sites to get them in pdf format. Fortunately most of them are available on Internet after googling for a while, but it would be even better if we could get them instantly in one shot.

Nagarjuna Permalink
August 11, 2015, 20:03

Is there any preference order in the list? Like the first book is your most favorite and the second one is second most and so on.

October 15, 2015, 07:01

I really like the Little Schemeer series and Programming style is also my favorite.

awerwer Permalink
April 17, 2016, 01:38


Learner Permalink
July 08, 2016, 16:29

I saw you write a review for some book on Amazon, I think it was programming pearls, and I came to your website from there. I saw you recommended "Programming from the ground up" and now I finally feel like I'm starting to learn how a computer really works.

Keep up the blog, and thanks a lot! This is going to change a lot for me :3

Leave a new comment

(why do I need your e-mail?)

(Your twitter name, if you have one. (I'm @pkrumins, btw.))

Type the word "security_455": (just to make sure you're a human)

Please preview the comment before submitting to make sure it's OK.