I'm Morgan McGuire (@CasualEffects). I've been working on computer graphics and games for 20 years at great places including NVIDIA, University of Waterloo, Williams College, Brown University, Roblox, Unity, and Activision.

See my home page for a full index of my blog posts, books, research, and projects.

Monday, May 12, 2014

A Computer Science Book Reading List

This is a list of good books on computer science.
Most are accessible to anyone with programming experience equivalent to an introduction to computer science course. Of course, everyone in the field has his or her own favorite books. There isn't a universally accepted list of "best", but I think all would agree that these are at least pretty good in both writing quality and technical content, and that you would not go wrong by reading them.


If you read one book from each category within CORE, SYSTEMS, and THEORY, then, congratulations: you've just completed the equivalent of an undergraduate major in computer science! Pick up a few from APPLICATIONS and you're at the Masters level. In my ideal CS department, this would be the main thread of the majors curriculum, to be augmented with mathematics and more computing application electives.

I made this list in the process of researching acquisitions for the Williams College library. I reviewed the curriculum (for topics) and syllabi (for book recommendations) of many of the top CS programs and liberal arts colleges, including: MIT, Cal Tech, University of Washington, Princeton, Stanford, Berkeley, Brown, Rice, Williams, Amherst, Swarthmore, Harvey Mudd, and Wellesley. I gave special emphasis for each topic to the schools and professors that specialize in it, e.g., Rice for compilers and programming languages. I also looked at various recommendation lists on the web and the Amazon best-sellers in each category. I was familiar with many of the books already. For the others, I reviewed the table of contents, read sections, looked at reviews, and particularly examined code samples. I then selected the book in each topic that I would want to use if teaching the course. For some topics, there were a few choices that had very high quality but very different approaches, so I listed all of those. If teaching that course, I would try one a year to see which worked best with the students. I generally didn't choose the best graduate textbooks or reference books, but instead the ones that would be appropriate for first encountering a topic, e.g., in an undergraduate course.

I'm also often asked for recommendations for professional programmers without CS degrees or undergraduates who want to learn more CS without necessarily taking courses or majoring. This is a nice list for those groups as well. Because of the way that CS books are categorized, it is hard to browse them in a library. Some are filed under "engineering," others under "math," "programming," "computer science," or the application area, such as artificial intelligence books appearing in psychology, cognitive science, and biology. So, think of this as the book shelf that I wish you could find in a library, with all of the short-lived "Learning Ruby in 21 Days" and "Visual Fortran 2012 for Dummies"-type books that normally clutter such a section removed.

For convenience, I've linked the books to Amazon for everyone and the Williams College library for my students (some are not yet at Williams, but are coming soon.) If you're reading through these book-club style, just choose one book from each category--whichever your library has or appeals to you will be fine. To keep the list approachable, I didn't include all of the well-respected books in each category but tried to choose one or two. Rather than making this a catch-all, I'll let others maintain their own lists of best computer science books---but I do appreciate recommendations, especially for application areas farther from my specialization in computational graphics.

Programming & Specific Languages
In the long run, it doesn't matter what language you begin with, and any book in this group is sufficient to get started. Skip on to the CORE section after reading one.

Introduction to Computer Science Using Python: A Computational Problem-Solving Focus
Dierbach
[Amazon] [Williams]
A Byte of Python
Swaroop
[Free!]
The Little Schemer
Friedman et al.
[Amazon]
The C++ Programming Language
Stroustrup
[Amazon] [Williams]
JavaScript: The Good Parts
Crockford
[Amazon] [Williams]
The C Programming Language
Kernighan and Ritchie
[Amazon] [Williams]
Java: An Eventful Approach
Bruce et al.
[Amazon] [Williams]


CORE

Computer Organization
Computer Organization and Design
Patterson and Hennessy
[Amazon] [Williams]

Data Structures
Data Structures and Algorithms
Aho et al.
[Amazon] [Williams]
Java Structures: Data Structures in Java for the Principled Programmer
Bailey
[Free!]
Data Structures and Algorithms
Wirth
[Free!]

Algorithms 
Algorithms
Dasgupta et al.
[Amazon]
Introduction to Algorithms
Cormen et al.
[Amazon] [Williams]
Algorithms
Sedgewick and Wayne
[Amazon] [Williams]

History of Computer Science
Alan Turing: The Enigma
Hodges
[Amazon] [Williams]
Hackers: Heroes of the Computer Revolution
Levy
[Amazon] [Williams]
The Universal History of Computing: From the Abacus to the Quantum Computer
Ifrah
[Amazon] [Williams]


THEORY

Theory of Computation
Introduction to the Theory of Computation
Sipser
[Amazon] [Williams]

Programming Language Theory
Programming Languages: Application and Interpretation
Krishnamurthi
[Free!]
Design Concepts in Programming Languages
Turbak and Gifford
[Amazon]

Advanced Algorithms & Data Structures
Advanced Data Structures
Brass
[Amazon] [Williams]
Probability and Computing: Randomized Algorithms and Probabilistic Analysis
Mitzenmacher and Upfal
[Amazon]
Randomized Algorithms
Motwani and Raghavan
[Amazon] [Williams]

Cryptography
Introduction to Modern Cryptography: Principles and Protocols
Katz and Lindell
[Amazon]

SYSTEMS

Architecture
Computer Architecture: A Quantitative Approach
Hennessy and Patterson
[Amazon] [Williams]

Operating Systems
Operating Systems: Principles and Practice
Anderson and Dahlin
[Amazon]

Networks
Computer Networks and Internets
Comer
[Amazon]

Compilers
Engineering a Compiler
Cooper and Torczon
[Amazon] [Williams]

Parallel Programming
Programming Massively Parallel Processors
Kirk and Hwu
[Amazon] [Williams]

Numerical Methods
Numerical Recipes: The Art of Scientific Computing
Press et al.
[Amazon] [Williams]

Databases
Database System Concepts
Silberschatz et al.
[Amazon] [Williams]
Fundamentals of Database Systems
Elmasri and Navathe
[Amazon]

Distributed Computing
Distributed Systems: Principles and Paradigms
Tanenbaum and Van Steen
[Amazon]

Software Engineering & Management
The Mythical Man-Month: Essays on Software Engineering
Brooks
[Amazon] [Williams]


APPLICATION AREAS

Machine Learning
Learning From Data
Abu-Mostafa et al.
[Amazon]
Understanding Machine Learning: From Theory to Algorithms
Shalev-Shwartz and Ben-David
[Amazon]

Artificial Intelligence
Artificial Intelligence: A Modern Approach
Russell and Norvig
[Amazon] [Williams]

Computational Graphics
Computer Graphics: Principles and Practice
Hughes et al.
[Amazon] [Williams]

Computer Vision
Computer Vision: Models, Learning, and Inference
Prince
[Amazon]

Human-Computer Interaction
Designing the User Interface: Strategies for Effective Human-Computer Interaction
Shneiderman et al.
[Amazon]

Computational Biology
Algorithms in Structural Molecular Biology
Donald
[Amazon] [Williams]
An Introduction to Bioinformatics Algorithms
Jones and Pevzner
[Amazon]

Game Engine Programming
Game Engine Architecture
Gregory
[Amazon]



Morgan McGuire (@morgan3d) is a professor of Computer Science at Williams College, visiting professor at NVIDIA Research, and a professional game developer. His most recent games are Rocket Golfing and work on the Skylanders series. He is the author of the Graphics Codex, an essential reference for computer graphics now available in iOS and Web Editions.