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:

3 Responses to “Undergraduate Computer Science Reading List”

  1. Kenny Says:

    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.

  2. Cartman Says:

    Add SICP and Bentley’s Programming Pearls to the list and you’re done…

  3. Rathbun Says:

    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.

Leave a Reply

Please spell "response" backwards: (required)