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-...
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
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.
I'll be the first to admit that university is bullshit and mostly acts as a social signifier. Like I mentioned above, I'm credentialed, and I'll put that on my business cards but between you and me and the internet at large I mostly work as a software engineer.
There are even many problems with talking about "computer science" because for the most part it's treated like a branch of mathematics and its academic circle really hates dabbling in messy empirical data.
Yet, there's a degree of rigour in it. There's an actual underpinning behind a lot of this stuff.
So! Can you be a self taught computer scientist? Certainly! K&R and The Little Schemer just have almost nothing to do with it - even if they might make you into better programmers :).
This gets repeated again and again on HN, but it's not true. I am a CS researcher, and I always have messy empirical data. Systems research almost always has tons of experimental results. A large chunk of our papers are dedicated to the experimental design and results.
I have made this point many times before:
One of these days I'm going to actually set up a blog, write this point up as an essay, and be able to point to it.
My own personal definition of computer science: everything concerned with computation, both in the abstract and in the implementation.
These two branches do talk to each other, but not much.
You got systems research pretty much head-on, but I would stress the design and implementation part more. That is, CS systems research tends towards engineering, where we claim we made a better whatzit, and then we need to provide a suite of experiments to support our claim.
I'm just talking from my own (very) limited personal experience, though, and the Greg Wilson video I linked to (albeit it's been two years since I last watched it).
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.
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])
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])
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... - and it's pretty decent.
+1 for the book recommendation - I also have a copy of that.
I think you may be confusing "Computer Science" with "Software Engineering".
I got a nice piece of paper, but it's not like my day to day job involves much of what I learned during school.
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.
Also, thanks for that first link! That could be useful to prepare myself for 6.002x.
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.
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.
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.
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?
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.
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.
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.
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).
At least for me it excelled in that aspect. As a method for teaching Scheme, I am certain it leaves much to be desired.
They do explicitly claim in the book that that is their goal!
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.
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?
It is genuinely one of the best books I have ever read.
(this link is from a story that just recently made the frontpage on hacker news)
Eric, how's the affiliate marketing going?
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.