What books should be on my "personal CS degree" reading list?
November 6, 2006 7:33 AM   Subscribe

I'm trying to come up with a reading list for a "personal comp. sci. degree" (along the lines of Josh Kaufman's "personal MBA" reading list). What books should be on my list?

I'm already a professional programmer, and I've been doing it for quite some time now. And not to be cocky, but I think I'm pretty good at it; I'm the lead developer in my department, and I'm the co-lead of a pretty successful open-source project.

Still, I never studied computer science (in college I majored in literature). In some sense I think this puts me at a disadvantage — not in terms of hireability or pay grade or anything professional, but when I'm talking to other programmers, it often seems there's a shared vocabulary I'm missing.

So I'd like to come up with a reading list of essential computer science books. I'm thinking big here: I'd like to spend at least the next year or two reading heavily, and I read very fast. If possible, I'd like to put together a list that rivals what one would read in a graduate CS program.

So, hive mind, what should I read?
posted by jacobian to Computers & Internet (33 answers total) 106 users marked this as a favorite
"Algorithms in C++" by Robert Sedgewick. Also available in other programming languages. It's a great introduction to data structures and searching.
posted by skwm at 7:45 AM on November 6, 2006

Godel, Escher, and Bach: An Eternal Golden Braid, perhaps? I'm still trying to finish my undergrad CS, but it's a book I've enjoyed immensely.

Also, perhaps a book on automata theory and languages would be in order. They seem to be pretty important in the "higher" level computer sciences.
posted by patr1ck at 7:45 AM on November 6, 2006

perhaps try to find a list of actual CS textbooks from some program. I enjoyed most of my university texts.

I'd recommend "Computer Architecture: A Quantitative Approach" by Hennessey and Patterson.
posted by GuyZero at 7:48 AM on November 6, 2006

For general textbooks, all the volumes (but esp. vol. 1) of Knuth's The Art of Computer Programming, and Abelson and Sussman's Structure and Interpretation of Computer Programs, will get you pretty far (reading and understanding either of these books is almost a computer science degree in itself).

For a basic background in AI, Russell and Norvig.
posted by RogerB at 7:52 AM on November 6, 2006

posted by paradroid at 7:55 AM on November 6, 2006

Don't forget the video lectures of SICP!
posted by jmhodges at 7:56 AM on November 6, 2006

I'm still going through an undergrad Software Engineering degree (only one year left!), and these are the books that I think helped me the most.

As far as technical books are concerned, Head First Design Patterns is by far the most useful book I've ever read. Whether you're fluent in design patterns or you think they're just a buzzword that people use, this book's approach is about good object oriented software organization, and it uses design patterns to achieve it (as oppose to being preachy, like most books about design patterns tend to be). Anything in the Head First series is gold. These books tend to use "unusual" examples and stories, and even anthropomorphization to get the ideas to stick in your head.

Best Software Writing I (edited by Joel Spolsky) has a number of very insightful, and interesting essays and anecdotes about software development.

The C Programming Language by Kernighan and Ritchie. C is a de facto common language, and it's still used all over the place. I believe that understanding basic C helps you understand any other programming language that can be thrown at you; and there's no book that describes or explains the C language as clearly and efficiently as this one.
posted by DrSkrud at 8:00 AM on November 6, 2006

Right now I'm working through The C Programming Language by Kernighan & Ritchie, which was recommended to me by several of my nerd friends as something that every programmer should read. I've seen it recommended by serious uberprogrammers as their favourite CS book ever.

I'm also a coder with a literature degree and no formal qualifications, and I'm finding that this is filling some of the gaps in my knowledge.
posted by tomsk at 8:00 AM on November 6, 2006

Oh. I forgot some people haven't read K&R. :)
posted by kcm at 8:04 AM on November 6, 2006

Lots of good suggestions so far, particularly the Knuth books. Don't forget to cover the fundamental bases that typically form the core of the CS major:

* Algorithms
* Data structures
* Operating systems
* Computer Architecture
* Formal languages & Computability (finite state machines, context-free grammars, etc)

If it hasn't been done to death when I get home this evening, I can post the names of the texts I used for these classes during my undergrad CS degree. Also, strictly on a practical level, getting to know design patterns would probably be a good idea.
posted by rkent at 8:04 AM on November 6, 2006

I'd second the Russel/Norvig AI book and the Hennessey / Patterson book on Computer Architecture. The second edition of the Russel/Norvig is an improvement on the first, which is what I used when I had AI. Also get the Silberschatz / Galvin / Gagne Operating Systems, which is great for the underpinnings of OSes, and pretty much all you'll need unless you're designing one.
posted by graymouser at 8:13 AM on November 6, 2006

I found Tanenbaum's "Modern Operating Systems" rather good for understanding OS's, but I haven't read the above mentioned book and can't compare those.
posted by Glow Bucket at 8:19 AM on November 6, 2006

Best answer: How about some of the other stuff you'd probably study doing CS? AI, OR, Networking... it's not all programming and programming theory.

Russell & Norvig: Artificial Intelligence: A modern approach seems to be most recommended, most people in this lab have a copy.

Sonka, Hlavac & Boyle: Image processing: Analysis and Machine Vision (I've linked to the UK amazon page here because it seems to cost a bomb in the US).

Tanenbaum et al: Computer Networks Theory of computer networks, remarkably readable.
posted by handee at 8:20 AM on November 6, 2006

Tanenbaum's Operating Systems book is also supposed to be good but I haven't read it.
posted by handee at 8:21 AM on November 6, 2006

In my mind, computer science is all about the algorithms:
Introduction to Algorithms, Second Edition by Cormen, Leiserson, and Rivest. Not an easy read, but a little easier than TAOCP. TAOCP is a great work, but it's huge, and not the type of thing a typical CS undergraduate would read cover-to-cover. Really, you're looking for any book that makes you think about and analyze why something is O(n log n) v. O(n^2).

CS is a little bit about the math, to:
Concrete Mathematics by Graham, Knuth, Patashnik.

I also must recommend the previously mentioned Hennessey and Patterson and Abelson and Sussman books.

In some ways, it really depends what you're looking for. Some people say "computer science" when they mean "programming". Some mean "software engineering". And some people mean "math". You're going to have to decide what you mean.
posted by IvyMike at 8:32 AM on November 6, 2006

Computer Systems: A Programmer's Perspective. I am a CS professor and long to teach a course from this book, though I haven't had the chance yet. A second on the Introduction to Algorithms book mentioned by IvyMike as well.
posted by procrastination at 8:36 AM on November 6, 2006

I liked the second edition of Introduction to Automata Theory, Languages, and Computation, which I found quite good. It is a bit "mathy", but I enjoy math :)

For something a little different, an excellent introduction to Cryptography is Cryptography and Network Security by William Stallings.

Also, I will vouch for anything by Hennessy and Patterson.
posted by homer2k1 at 8:45 AM on November 6, 2006

Best answer: Better than merely a reading list, do the MIT OpenCourseWare in Electrical Engineering and Computer Science (or at least those courses that interest you). Course descriptions contain textbooks and reading materials, usually available through Amazon, plus lecture notes and exam materials.
posted by paulsc at 8:53 AM on November 6, 2006 [1 favorite]

This book introduces all terminology and does a very good comparison of programming languages:
Programming Languages
posted by wolfkult at 9:06 AM on November 6, 2006

Jeff Atwood [Coding Horror] Recommended Books for Programmers

Joel Spolsky's [Joel On Software] Programmers' Bookshelf

These are more oriented towards the working software developer (so you've probably read them all already), rather than the academic CS person. They include such classics as Code Complete, The Mythical Man-Month, Peopleware, The Design Of Everyday Things, About Face, and the canonical Tufte stuff.
posted by matildaben at 9:07 AM on November 6, 2006

Some of the book recommendations above may be heavy going to stick through on your own. A complete distance learning course will do a better job of explaining things to someone without a live lecturer and classmates to ask. However, you do have experience in the field which should make things easier to understand.

It may be worth looking up study advice on how to read textbooks -- roughly, skim through a chapter first to get the layout of the area, and then go back for a careful read.

For a quick fix on the vocabulary, I suggest the old standby of a notebook in which you note down words you don't understand, to look them up carefully that same evening (when memory of how the word was used is fresh). The next day, and ever afterwards, you will be better equipped to understand what others say. On the other hand, I guess the programmers haven't failed to notice that you don't have a CS degree, and you could ask them directly "What does that mean?" "How important is it for me to know more about it?" Acknowledging someone's superiority in certain areas and showing a keenness to learn can get you a long way.
posted by Idcoytco at 9:22 AM on November 6, 2006

Best answer: Applied Cryptography
posted by kcm at 9:33 AM on November 6, 2006

Nice - all good books. I'd also recommend that you hit a solid book about lower-level architecture and organization. Tannenbaum has a decent enough one, and then supplement it with a specific assembly language book. In general, I'd look at a RISC instruction set first or a decent CISC (like 68K) before looking at x86 so you can get a feel for that.

Definitely read Code Complete. When I read it, I kept a couple page list of errata and suggestions to send off for the next revision.

Ray Tracing by Andrew Glassner is a great reference and a good way to kick some dust off your calculus and physics.
posted by plinth at 10:03 AM on November 6, 2006

If you want a more solid grounding in programming language theory, you could try reading the draft editions of Bob Harper's texts on the topic:
Robert Harper. Practical Foundations for Programming Languages. Working draft, 2006.
Robert Harper. Type Systems for Programming Languages. Draft, 2000.

[disclaimer: I'm current taking a class under him on this topic]

This is an area of CS that some people may not be very interested in, though, although it is pretty fundamental to the discipline. So far most of the books I see listed are either in the areas of systems or algorithms.

Also, my experience as a graduate student in CS is that while textbooks can give you a grounding in a topic you're not too familiar with, the real knowledge comes from reading papers, lots of papers. There's a plethora of them available at CiteSeer. You could perhaps check out the lists of most cited papers... there will be various gems in there that are seminal works.
posted by destrius at 10:07 AM on November 6, 2006

Response by poster: Many thanks to everyone who's responded already. Some great stuff here!

As a few people have noted, I may not have been clear enough about what I'm looking for. I'm really trying to find a bunch of material on the theory of CS, not the practice of programming. MMM, DoET, JoS, Tufte... great stuff, but I've been there.
posted by jacobian at 10:16 AM on November 6, 2006

I'd like to second (or more) the recommendation for Introduction to Algorithms, Second Edition by Cormen, Leiserson, and Rivest. This will give you a better understanding of efficiency in algorithms, which will help you both theoretically and practically. It covers the basic ideas (which I'm sure you understand and apply, at least intuitively, already), and reviews the best known algorithms for a bunch of different common scenarios like sorting, analyzing graphs. I recommend reading the general explanation, and skimming the later chapters to get a feel for how quickly common tasks can be done.

I'd also like to point you toward my favorite math/CS book of all time, Sipser's Introduction to the Theory of Computation. This one will only help you theoretically, but it's really neat theory. It introduces abstract machines, including finite automata and Turing machines, and shows you how to analyze the complexity of different problems using these machines. I find this area of math/CS theory exceptionally elegant, and Sipser does a great job of revealing its beauty.
posted by gorillawarfare at 10:21 AM on November 6, 2006

U.C. Berkeley has webcasts of several of their Computer Science courses. I've been listening to the CS61 series and getting a lot out of it.

SICP really is as wonderful as everyone says. It's all available for free online, but the book is also very nicely made if you like that sort of thing (I do).

You can learn a lot by just diving in and reading various computer science papers. I've started to make a point of, when I hear a paper mentioned as being interesting or important, looking it up and at least skimming it to see if it's worth reading. My personal favorite is John McCarthy's "Recursive Functions of Symbolic Expressions and Their Computation by Machine", the paper that introduced LISP. Guy L. Steele's "Growing a Language" talk from OOPSLA 98 is also a very fun read. The programming languages weblog Lambda the Ultimate has an interesting collection of more links to papers, with a focus on programming language implementation. Google Scholar will help you find more.

If you don't already know about it, you can learn a lot from the Wiki (not Wikipedia, the original one). It's more focused on software development than on computer science as such, but it got me started thinking about CS at least. Actually, now that I think of it, Wikipedia has some surprisingly good computer science articles too--I'd always assumed they wouldn't be that great, but I've read a few lately and learned a lot from them.

(Thanks for asking this, by the way. I've been trying to do the same thing myself, and I'm picking up some good advice from this thread.)
posted by moss at 10:22 AM on November 6, 2006

On a side note, I'm not too sure if what you're really looking for is a set of texts for a CS degree. I sort of think of comparing CS and programming like comparing architecture and construction; a person who wants to build houses may not have much to gain from a set of books discussing the underlying theories of architecture, aesthetics, form and function, etc. While there is definitely a lot you could learn from such books which would ultimately benefit you, you might find that most of the contents are really tangential to your goals and not practical to your purposes.

Then again I'm just a first-year grad student, so I may not know what the hell I'm talking about. ;)

On preview: Hmm, what do you mean by the theory of CS though? There could be several, for example:
- Theories of algorithms, and how to prove them mathematically.
- Internals of computer systems, i.e. computer architecture, OS internals, etc.
- Programming language theory like I mentioned above, which is about understanding what programming really means.
posted by destrius at 10:23 AM on November 6, 2006

After you've covered some sort of intro to algorithm analysis, and some sort of intro to languages and automata (for example, in the books I mentioned above :) you might want to check out Gems of Theoretical Computer Science. It's a collection of some of the keenest papers in theoretical CS. It makes for pretty challenging reading, but should be doable if you read some introductory material first. And if you're ever going to enjoy working on theoretical CS, you'll probably enjoy working through these papers.
posted by gorillawarfare at 10:28 AM on November 6, 2006

Late to the party, throwing in another vote for SICP as mentioned above. Definitely try to follow the UC Berkeley 61 series (A, B, C) including the assigned reading and coursework. This should be good for about a year's worth of study, but the courses are dense and cover material that is considered baseline knowledge among computer scientists. Of the languages that I use day-to-day, Python has been the best for combining theory and utility, and it comes with a great series of puzzles to boot.
posted by migurski at 12:05 AM on November 7, 2006

Wish I could remember where, but I once read an interview with Bill Gates who said he would hire anyone who had read the Art of Programming and done the problems in the book.
posted by blueplasticfish at 1:04 PM on November 8, 2006

Structure and Interpretation of Computer Programs

ANSI Common Lisp

On Lisp

Art of the Metaobject Protocol
posted by webnrrd2k at 1:12 PM on November 8, 2006

« Older Are cops required to use their lights? If not, how...   |   Does the Logitech/Slim Devices takeover matter? Newer »
This thread is closed to new comments.