Undergraduate Computer Science Reading List
My friend and coworker Buzz Andersen posited awhile ago that there exists a programming canon, a body of literature with which software developers and computer scientists are expected to be familiar.
Having interviewed a lot of people (and I mean a lot) and been interviewed myself a few times, Buzz’s point resonated with me. I’ve noticed that many recent university graduates have not been exposed to material that is considered fundamental to computer science and programming by many in the industry. A lot of schools have sacrificed the teaching of this material in favor of more IT development oriented courses, and really done their students a disservice in the process.
Since I’d rather see more kick-ass programmers and computer scientists than fewer, here’s my list of books that I think should be on the bookshelves of all computer science undergraduates. These books are, of course, my own favorites, and they exclude a lot of the books I’d include in a list of graduate-level books. Feel free to chime in in the comments if you think I’ve missed something important.
Note: The cover images are all linked to Amazon, all other links point at the homepage of the books on the web (or Wikipedia).
The Fundamentals |
|
---|---|
Introduction to Algorithms by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein This book is a bit dense as an introduction, but serves as an excellent reference. Supplement it with a good algorithms and data structures book, such as Bruno R. Preiss’ excellent and free Data Structures and Algorithms with Object-Oriented Design Patterns. |
|
The Art of Computer Programming by Donald Knuth This is a book most people (including myself) have probably browsed through or skimmed, but never read. Nevertheless, it sits in the background in many CS programs, informing the way introductory computer science is taught. Alternatives for introductions to CS vary from school to school, but many use SICP. My personal favorite is the text used at Harvey Mudd College, “Computer Science: Abstraction to Implementation”, aka “Computer Science for Smart People.” |
|
The C Programming Language (2nd Edition) by Brian W. Kernighan, Dennis Ritchie, Dennis M. Ritchie This is the canonical introduction to C, the lingua franca of systems programming, and a favorite source of interview questions. |
|
Artificial Intelligence: A Modern Approach by Stuart Russell and Peter Norvig AI is a fascinating field, and this book covers a lot of ground. Incidentally, Peter Norvig is the Director of Research at Google. |
|
Operating System Concepts (aka The Dino Book) by Abraham Silberschatz, Peter Baer Galvin, Greg Gagne I work in an OS group, so OS books are important to me. This is the book my OS class at Mudd used, and I still refer to it at work. |
|
Modern Operating Systems by Andrew S. Tanenbaum An alternative to the Dino Book. |
|
Computer Networks by Andrew S. Tanenbaum If you can’t joke about what the “U” in UDP stands for, you need to pick up a book on networking. Any good book will do. |
|
Compilers and Programming Languages |
|
Compilers (aka The Dragon Book) by Alfred V. Aho There’s a new edition of this book coming out soon. For many years this was the standard in teaching compilers, though recently “Engineering a Compiler” has become more popular. |
|
Engineering a Compiler by Keith Cooper, Linda Torczon Often plugged as the modern alternative to the Dragon Book, this book has proven popular in recent years as the Aho book has grown increasingly out of date. |
|
The Little Schemer by Daniel P. Friedman A whimsical introduction to Scheme and functional programming. In my opinion, CS graduates should at least be familiar with one functional programming language. |
|
Software Engineering |
|
The Mythical Man Month by Frederick P. Brooks If you want to understand why throwing more engineers at a project may actually make the project take longer, this is the book to read. |
|
Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (aka The Gang of Four) Also known as the GoF (Gang of Four) book. There are also a variety of “Design Patterns in X” books for various languages, which may help make the various abstractions clearer. |
|
UNIX |
|
Advanced Programming in the UNIX Environment by W. Richard Stevens and Stephen A. Rago Recently updated by Rago, the 2nd edition of this book is truly excellent. At the very least this is a required reference if you’re programming on a UNIX-based system or just want to understand the design of the API’s. |
|
Unix Network Programming, Vol. 1 by W. Richard Stevens In much the way APUE is the classic for learning UNIX programming, this is the classic for learning network programming. |
|
Unix Network Programming, Vol. 2 by W. Richard Stevens Whereas the first volume teaches you how to get your computer to talk to others on a network, this one teaches you about interprocess communication (or how to have programs on a local computer communicate). |
|
Design of the UNIX Operating System by Maurice J. Bach Contains great descriptions of many of the parts of the old AT&T Unix System V. Given the increasing complexity of Unix systems, this a good introduction to the design of an actual operating system from when such things were much simpler. |
|
Lions’ Commentary on Unix by John Lions SCO is not entirely evil, having given permission for the republication of this book in 1996. This book contains the source code for the 6th Edition UNIX kernel with excellent commentary on the code and a description of the PDP-11 architecture on which it ran. |
|
Theory |
|
Introduction to the Theory of Computation by Michael Sipser The theory of computation is all about computability and complexity. In other words, it asks what can be computed, and at what cost? This comes up in programming surprisingly often, as tasks that are deceptively simple for people (like finding the shortest route between several stops on a map) can be quite complex for computers to perform. This book serves as a good introduction to the field. |
|
Computers and Intractability : A Guide to the Theory of NP-Completeness by M. R. Garey, D. S. Johnson Another introduction to the theory of computation, with lists of common hard problems. |
Other lists of readings in computer science and software development:
September 22nd, 2007 at 4:32 PM
Excellent list. I’m a sophomore majoring in computer science and feel as if the curriculum is lacking a bit in certain areas. You were spot on by saying some schools are sacrificing the fundamentals to focus more on IT-centric areas. Thus, I’ve decided to be proactive and fill these gaps myself.
I’m currently working through SICP (while trying to wrap my head around GEB), which I’ve seen recommended quite often.
October 11th, 2007 at 10:27 PM
Add SICP and Bentley’s Programming Pearls to the list and you’re done…
February 11th, 2009 at 8:39 PM
My all time favorite computer book is
“Peopleware: Productive Projects and Teams” by DeMarco and Lister.
Not a technical book, but once a programmer has the technical skills, the next step is managing other programmers. Great insights. Fast fun read. Unfortunate that it’s full price even after all these years.