Sunday, October 23, 2011

Computer Science Classics

I have been trying to think of a list of "classics" in computer science. This is a far from complete list, but it is a good list nevertheless.

Wizard Book

  • Harold Abelson and Gerald Jay Sussman, Structure and Interpretation of Computer Programs. Second Edition, MIT Press (1996). Eprint [mit.edu]

This was the first computer science book I read, so it has a particularly special place in my library.

The deepest concept in this book was actually the idea that mathematics and computer science aren't different fields. This was new to me, as I was learning topos theory and C++/Java simultaneously.

The Church Encoding [wikipedia.org] demonstrates the effectiveness of lambda calculus.

And for people who are crazy (e.g., me) there is H.P. Barendregt's classic text The Lambda Calculus, Its Syntax and Semantics (Studies in Logic and the Foundations of Mathematics, Volume 103, 1985).

Dragon Book

  • Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman, Compilers: Principles, Techniques, and Tools. Second edition, Pearson Education (2006).

Again, this is a theoretical computer science book. This is also heavily mathematical (well, that's what computer scientists tell me!).

I don't have a copy, but I have browsed through portions of it.

For anyone thinking about writing a programming language, this ought to be read first. It will scare you straight! You'll never think about it again!

Minix Book

  • Andrew S. Tanenbaum and Albert S. Woodhull, Operating Systems Design and Implementation. Third edition, Addison-Wesley (2006).

This is a decent book on operating systems. I have a few minor qualms about it, but nothing major. It's wonderful when supplemented with other books, but alone I'm not too sure.

This presupposes knowledge of C, which one could refer to the C book by K&R.

The problem is: what books work well with it?

If an undergraduate came to me and said, "I know C but I want to learn about operating system internals. What do you recommend?"

I would recommend look at xv6 [mit.edu] first.

This gives you the basic idea of what an operating system is. It should be studied, along with (simultaneously) Maurice J. Bach's The design of the Unix Operating System (Prentice Hall, 1986).

Thus you have established a thorough knowledge of the algorithms and data structures underlying the Unix operating system, and you may begin to broaden your knowledge with other texts.

TAOCP

  • Donald Knuth, The Art of Computer Programming. Addison-Wesley.

There are (so far) 4 (ish) volumes published.

Knuth is a bad ass who introduced rigor to computer science. His algorithms are written in either a low-level language or a high-level language: MMIX assembly or English, respectively.

His exercises range from 5 minute puzzles to open research problems.

Quite possibly my favorite collection of books, definitely in my canon of texts.

It's hit-or-miss with most programmers, though. But one should admit: programming amounts to structured reasoning, and nothing helps more than mathematics!

No comments: