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.
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:
http://news.ycombinator.com/item?id=968013
http://news.ycombinator.com/item?id=690798
http://news.ycombinator.com/item?id=1131606
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.
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).
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.
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])
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.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.
http://www.amazon.com/Haskell-Logic-Maths-Programming-Comput...
I think you may be confusing "Computer Science" with "Software Engineering".