
Books every self-taught computer scientist should read - ericmoritz
http://eric.themoritzfamily.com/books-every-self-taught-computer-scientist-should-read.html
======
phillmv
Speaking as an actually credentialed computer scientist, this list is
ridiculous.

First and for all, only one of these books is actually about theoretical
computer science, and even then.

Secondly, (feel free to disagree on this one) K&R is recommended more as a
prestige book. So much of C is in the toolkit and libraries that I think it's
a little silly to be recommending a 30 year old intro that is actually kind of
hard to read.

Thirdly, this question comes up all the time. Here's an actually serious
version of this question:
[http://cstheory.stackexchange.com/questions/3253/what-
books-...](http://cstheory.stackexchange.com/questions/3253/what-books-should-
everyone-read)

If you only care about actually practical issues to your life as a programmer,
give this list a shot <http://news.ycombinator.com/item?id=3320813>

Addendum: Although I'm credentialed as a CompSci, I really work as an
engineer. The difference? Scientists read papers (Avi Bryant)
<http://vimeo.com/4763707> and think about the nature of our work (Greg
Wilson) <http://vimeo.com/9270320>

~~~
ericmoritz
I apologize for any offense that I may have given by using the phase "self-
taught computer scientist".

This article is my personal recommendation of books that I often recommend to
junior developers that are smart but didn't complete a degree and often find
their knowledge of basic computer science lacking.

~~~
tptacek
As a self-taught C software developer, I came here to say the same thing
Phillip said.

To it, I would also add that C isn't the "latin" of computer science (if any
language is going to prove to be that, it's Lisp, but it's too early to say,
other than to say that isn't going to be C).

I'd also suggest that the best book to follow up K&R is Hansen's _C Interfaces
and Implementations_.

If I wanted to teach someone to be a computer scientist, I'd look for a book
that would help them read papers. I'd also point them towards compiler theory,
not so much because it's fundamental computer science (it's a vital applied
discipline), but because it exposes you to more real computer science than
most other domains.

~~~
ericmoritz
Do you have a book recommendation to help someone read papers. I spent an
couple evenings going over MIT course notes on discrete mathematics to attempt
to read a paper on Conflict-free Replicated Data Types <[http://hal.archives-
ouvertes.fr/docs/00/55/55/88/PDF/techrep...](http://hal.archives-
ouvertes.fr/docs/00/55/55/88/PDF/techreport.pdf>);

What I would give for a book at that time that would help me translate the
following:

    
    
        merge (X, Y ) : payload Z
           let ∀i ∈ [0, n − 1] : Z.P[i] = max(X.P[i], Y.P[i])
    

Into

    
    
        def merge(X, Y):
           Z = ... new object ...
           for i in range(len(X.P) - 1):
               Z.P[i] = max(X.P[i], Y.P[i])
           return Z
    

I eventually figured it out but it was a bit rough trying to figure out what
all the symbols meant.

~~~
phillmv
Well… it depends on the paper! Some stuff might need more than a single course
of background to fully understand.

For more rudimentary papers, any undergrad course on discrete mathematics
should get you started. I personally was forced to read
[http://www.amazon.com/Discrete-Mathematics-Applications-
Susa...](http://www.amazon.com/Discrete-Mathematics-Applications-Susanna-
Epp/dp/0534359450) \- and it's pretty decent.

~~~
ericmoritz
Thanks for the recommendation. That was one of the text books that I looked at
but the sticker shock steered me towards free MIT course notes.

~~~
arghnoname
I don't know if it is true about that book in particular, but if I'm buying a
textbook as a resource I usually look for the international editions. They
sell near identical versions of the books (shuffle the problem sets around) in
other places around for much, much less.

------
tzs
One thing I've not seen yet is a list of books or online resources to take
someone from beginner to expert in computer science. I've just seen lists like
the submitted list or the lists in the Stack Exchange discussion that phillmv
linked to, which are suggestions for books or articles or papers that everyone
(in someone's opinion) should have read.

Anyone seen a CS equivalent of either of the following?

1\. Gerald 't Hooft, the Nobel Prize winning physicist, maintains this list:
<http://www.staff.science.uu.nl/~hooft101/theorist.html>

That list gives an ordered progression of links to online material meant to
take a talented and ambitious person from high school to research level
quantum field theory and string theory.

2\. The "How to Become a Pure Mathematician (or Statistician)" list here:
<http://hbpms.blogspot.com/>

That list starts assuming high school mathematics, and gives a series of
stages to go from that to advanced graduate level, giving for each area of
mathematics at each stage lists of books and online material appropriate for
that stage.

~~~
neilparikh
I too would be interested in a CS equivalent of those resources.

Also, thanks for that first link! That could be useful to prepare myself for
6.002x.

------
Jun8
I haven't read _Mastering Algorithms in C_ (I have the perl version) but if
you want to mention one book on algorithms, that's got to be Skiena's
_Algorithm design Manual_ (<http://www.cs.sunysb.edu/~algorith/video-
lectures/>). I also like Jeff Erikson's algorithm lecture notes
([http://www.cs.uiuc.edu/~jeffe/teaching/algorithms/notes/all-...](http://www.cs.uiuc.edu/~jeffe/teaching/algorithms/notes/all-
notes.pdf)) that comes as a 800+ PDF file.

~~~
okamiueru
I have to second Skiena's book. I had three books: the famous Cormen tome,
"Algorithm Design" by Kleinberg and Tardos, and Skiena's "Algorithm Design
Manual" available when learning advanced algorithms. I'm still amazed at how
Skiena's book covers both the basics in a far better pedagogical way than the
other two, as well as serving as a really nice lookup utility for tackling
specific problems (the second half of the book is jammed packed with short
problem description, as well as a overview of approaches and considerations).
I kept looking up the same topic in all three, and ended up reading the
Algorithm Design Manual.

That said, Cormen's book is famous for a reason, but more often than not, I
felt it gave way for mathematical rigor than plain language.

Note: The second edition of Skiena's book is significantly improved over the
first... well, besides the quality if the paper.

edit: Meant second edition of Skiena's book, not Cormen's. Sorry.

~~~
tptacek
Skiena's is my favorite computer book of the last 5 years; it's radically
different (and I think better) than CLR.

TAOCP is, considered on the whole, an even better work, but I end up using it
way differently; I've consulted Skiena to solve problems, but TAOCP I more or
less flip through and then read 10-20 pages of at random; I am _never_ sorry I
did.

------
lee
Yea mean "every self-taught PROGRAMMER should read".

Computer science is very different than day-to-day "real world" programming.
Computer science is more akin to applied mathematics... its the study of
algorithms and computation.

What your books teach is programming, building software and such.

~~~
scott_s
See my reply to phillmv elsewhere in the thread.

------
reginaldo
I have a set of honest questions to make:

I understand what it means to be a self-taught programmer, which I was from
ages 13 to 17, before I got into college and, in some sense, still am today,
as many of the things I learn and have learned for the past few years were
"self-taught" (or, as I prefer to say, taught me by the authors of books,
papers, and blog posts I read).

Some people like to call themselves self-taught hackers, software engineers,
etc. And that is ok too.

But what does it mean to be a self-taught computer scientist? Is there some
criteria, e.g. do you have to publish a peer reviewed paper or something like
that?

~~~
ericmoritz
When I say, "self-taught computer scientist" I had in mind someone, much like
myself that did not go through college to earn a comp-sci degree but instead
learned on the job and solves problems scientifically rather than by brute
force.

I agree with you that it is a bit a self-applied label that could be offensive
to those who finished college and earned a degree. Much like someone calling
themselves a doctor without getting a PhD.

~~~
reginaldo
You provided a good definition: solves problems scientifically rather than by
brute force. I believe the essence of science comes from being able to think
(and report your thinking) in a structured way. Meaning it is about content,
but it is also about form.

And just so we can get this out of the way, I'm not in any way offended by
people applying labels to themselves in good faith, I'm only slighted offended
by people who are offended by that.

------
gtani
There's a _few_ of these lists, depending on what aspects of
science/engineering/coding you're interest is

[http://www.reddit.com/r/compsci/comments/gprp0/is_there_a_li...](http://www.reddit.com/r/compsci/comments/gprp0/is_there_a_list_of_the_canonical_introductory/)

<http://news.ycombinator.com/item?id=3011964>

[http://geekswithblogs.net/MarkPearl/archive/2011/05/19/summa...](http://geekswithblogs.net/MarkPearl/archive/2011/05/19/summary-
of-computer-theory-important-things-to-know.aspx)

<http://news.ycombinator.com/item?id=3382962>

\---------------

[http://www.reddit.com/r/compsci/comments/j10m3/im_an_experie...](http://www.reddit.com/r/compsci/comments/j10m3/im_an_experienced_developer_looking_to_master/)

[http://www.reddit.com/r/compsci/comments/jyz6z/i_want_to_lea...](http://www.reddit.com/r/compsci/comments/jyz6z/i_want_to_learn_actual_computer_science_not_just/)

<http://matt.might.net/articles/what-cs-majors-should-know/>

[http://www.reddit.com/r/compsci/comments/kb3sa/what_every_co...](http://www.reddit.com/r/compsci/comments/kb3sa/what_every_computer_science_major_should_know/)

------
InclinedPlane
Read Refactoring.

[http://www.amazon.com/Refactoring-Improving-Design-
Existing-...](http://www.amazon.com/Refactoring-Improving-Design-Existing-
Code/dp/0201485672)

In my view it is the single most important programming book in existence. Yes,
other books will teach you other, incredibly important things. Other books
will teach you the specifics of one technology or another. Other books will
open up your mind on the very nature of programming (especially learning
functional programming). And other books will teach you all of the incredibly
important stuff that isn't siting at a keyboard and typing in code. But
personally I'd rather work with someone who thoroughly groks refactoring even
over someone who thoroughly groks functional programming.

------
impendia
I have to disagree with The Little Schemer, despite the fact that I took
freshman CS with Matthias Felleisen (one of the two authors), thought his
course was brilliant, and absolutely swore by Scheme by the time I was done.

I felt the book paled in comparison with his lectures. The book is, in some
sense, too short; it doesn't have enough examples, and it also doesn't discuss
essential language features such as _let_ / _local_. Also, it has a shortage
of long examples (pretty much everything there consists of a single function).

Also the book is ridiculously easy for the entire first half (approximately),
and then suddenly dumps you into the deep end (they present the Y combinator).

~~~
ericmoritz
What I got out of The Little Schemer wasn't really how to write Scheme but
more how to solve problems recursively.

At least for me it excelled in that aspect. As a method for teaching Scheme, I
am certain it leaves much to be desired.

~~~
impendia
> What I got out of The Little Schemer wasn't really how to write Scheme but
> more how to solve problems recursively.

They do explicitly claim in the book that that is their goal!

------
mrchess
Programming Pearls is also an amazing gem you should read as early in your
career as possible. If you end up heading into software, also check out The
Mythical Man Month. Although dated, the lessons are timeless.

~~~
dfan
Programming Pearls was the book I came here to recommend. (Assuming that the
original poster really meant "programmer" rather than "computer scientist".)

------
swannodette
Unlike a lot of folks here I mostly agree with the list - I'm a self-taught
programmer as well. But don't stop with the The Little Schemer - grab The
Seasoned Schemer as well, and if you can make it through The Reasoned Schemer
you'll learn quite a few things that many programmers know nothing about.

I still think that Rich Hickey's list, <http://www.amazon.com/Clojure-
Bookshelf/lm/R3LG3ZBZS4GCTH> is the best collection of self-taught programmer
must reads I've encountered.

------
daviddaviddavid
Mastering Algorithms in C will go down in history as one of the most horribly
formatted books ever. The code samples in this book are positively unreadable
due to comments that go on for pages. To be fair, the content is good. But the
formatting is so annoying that it's hard to sink into that content.

~~~
ericmoritz
I read it on my Kindle so I assumed the bad formatting was caused by
reformatting to fit the Kindle.

------
ctruman
Okay, now I am confused. This article basically directly explained my
situation. I learned by doing, not by studying or taking classes. I have a
HUGE whole in my knowledge regarding algorithms, uncommon C of features, and
things classified as true "Computer Science".

Anyway, I was thinking about reading these books. That is, until I saw
phillmv's comment. There has been a lot of debate and suggested lists of books
to read on this comment thread, but no concrete suggestions. I went from 3
suggested books to a few hundred. I know there are no magic books that make
you a master of Computer Science, but does anyone have a concrete quick list
of what is necessary for filling in the blanks in a self taught programmer's
education?

------
Joeri
If the focus is more on software engineering than computer science, i'd
recommend "code complete" and "patterns of enterprise application
architecture".

------
sayemm
"Joel recommends SICP, The C Programming Language, The Unix Programming
Environment, and Introduction to Algorithms as solid books for programmers who
want to brush up on their fundamentals and potentially do well at programming
interviews." - <http://itc.conversationsnetwork.org/shows/detail4144.html>

------
kurrent
I would suggest the following book as a precursor to all of these books: Code
by Charles Petzold.

It is genuinely one of the best books I have ever read.

------
j_col
Those are Amazon affiliate links in the article. Getting this on the front of
HN will get you a few clicks.

~~~
ryandvm
That seems like fair compensation for assembling a list of books that, I may
be interested in reading. Do you actually find this objectionable?

~~~
ConstantineXVI
The only time there's really a valid reason to complain about affiliate links
is if you're rewriting links posted by others; and even then IMHO disclosure
is enough to clear you. Otherwise, affiliate links are serving their purpose
properly (encouraging bloggers to post links to Amazon; and Amazon
compensating the bloggers for the referral).

------
Stwerner
I have The Little Schemer, but have had trouble figuring out the best way to
use the book. Do you just read it from cover to cover? Or do you cover up the
right hand of the page and try to come up with an answer (maybe even typing it
into the repl) before looking?

~~~
ericmoritz
I read it cover to cover. For most of the chapters I read the left side,
answer the question in my head and then looked to the right to see if I was
right.

Having just learned Clojure using "The Joy of Clojure", If there was anything
I needed to verify, I translated the code into clj and pasted it into a
Clojure REPL.

------
cl8ton
I would add "Numerical Recipes in C" to the list. I have owned this book for
many years and get allot of use out of it.

<http://bit.ly/zHQyeC>

------
ldesegur
Add to the list Structure and Interpretation of Computer Programs, which fits
perfectly following The Little Schemer, and you're all set.

------
darasen
As a self taught programmer were I to read all of the books "every programmer
should read" I would never have time to actually program.

------
veyron
The author definitely should have included Algorithms in C++ [Sedgewick] and
Introduction to Algorithms [CLRS].

------
dhconnelly
I guess you really meant programmer, but I think this is a great list.

------
Varun06
what if somebody starts with some other language such as Java or Python. Is
mastering in C must to be a good programmer?

~~~
ericmoritz
No, I don't think so. Those books were chosen not because they're good at
teaching you C but rather because they're good at introducing you to concepts
like memory layout, data structures and algorithms.

------
bborud
That was very far from what I expected :)

~~~
ericmoritz
I am sorry. What did you expect?

------
funkah
The Little Schemer made me understand programming in a functional style much
better than I did before reading it. It also solidified my opinion that I
really would not like working in that style at all.

------
Spearchucker
A scientist researches. Was that intentional?

