A Computer Science Undergraduate Education for Under $1,000

Tagged as Books, Lists, Self-Learning
Written on 2008-06-09 18:52:59
In the style of my former post on a Math Undergraduate Education, this post proposes a list of texts suitable for a rigorous and well-rounded foundation in Undergraduate Computer Science. A future post will cover the philosophical details and practical implementation of such an approach.

This list skews towards theory rather than practicality (or Computer Science as opposed to Programming, if you prefer) but tries to maintain a suitable balance. Consequently, outside study of particular languages (e.g. ruby, php, html, css, javascript, erlang or haskell, python or lua) is assumed. It is advised to work on practical projects (setting up source code repositories and servers, open source software contribution, web development, etc) as applicable since these subjects are covered at best loosely during the course of study.

This list of 24 texts costs about 900 dollars when bought used off of Amazon.com. Click on the book's title to get forwarded to it's Amazon.com page. The ordering of the list loosely conforms to increasing difficulty but it is not a recommendation as to structure. I will probably delve into those details in the aforementioned future post.

How To Design Programs by Matthias Felleisen, Matthew Flatt, Robert Findler and Shriram Krishnamurthi
Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Sussman
Paradigms of Artificial Intelligence Programming by Peter Norvig
Algorithms by Sanjoy Dasgupta, Christos Papadimitriou and Umesh Vazirani
Introduction to Algorithms by Thomas Cormen, Charles Leiserson, Ronald Rivest and Clifford Stein
Computer Networks by Andrew Tanenbaum
Programming Language Pragmatics by Michael Scott
Computer Organization and Design by David Patterson and John Hennessy
Introduction to Computing Systems by Yale Patt and Sanjay Patel
Operating System Concepts by Abraham Silberschatz, Greg Gagne and Peter Galvin
Operating Systems: Design and Implementation by Andrew Tanenbaum and Albert Woodhull
The Humane Interface by Jef Raskin
Code Complete by Steve McConnell
Real-Time Rendering by Tomas M'Oller
Artificial Intelligence by Stuart Russell and Peter Norvig
Introduction to the Theory of Computation by Michael Sipser
Modern Cryptography: Theory and Practice by Wenbo Mao
Hacker's Delight by Henry Warren
Purely Functional Data Structures by Chris Okasaki
Compilers: Principles, Techniques, and Tools by Alfred Aho, Monica Lam, Ravi Sethi and Jeffrey Ullman
Lisp In Small Pieces by Christian Queinnec
Programming Languages: Application and Interpretation by Sriram Krishnamurthi
Types and Programming Languages by Benjamin Pierce
Concepts, Techniques, and Models of Computer Programming by Peter Van Roy and Seif Haridi

There are a few caveats to this list that should be noted.

1) As mentioned it does not presume to teach language-specific or platform-specific knowledge. It is slanted towards theory and books on how to write C or HTML, do Linux Kernel Development or learn the Win32 API, or work with OpenGL or TCP/IP should be purchased separately.

2) Since it does not deal heavily with specific languages, it does not make any prescriptions about what languages one should know. Generally, I believe it's good to know a language which epitomizes each of the major programming paradigms whether these paradigms are valid or not (as Krishnamurthi posits in PLAI). This means at least one OO language, one stack-based language, one functional language, and one logic/constraint language. I'd recommend Smalltalk for Object Orientation, Forth for a stack language, Erlang or Haskell for a functional language, and Prolog for a constraint language. Beyond that it would probably be reasonable to learn C as a good representation of the von Neumann architecture and "for culture" and hypothetically python, perl, or ruby to learn a web/glue/scripting language.

3) The list could certainly be shorter. It leans towards functional programming, lisp, and programming languages due to my own personal interests and some material could be omitted from those areas correspondingly. Notably, Distributed Systems and Databases are conspicuous absences from my list. This is because I have yet to find any sort of consensus about quality books on either subject. I'm not interested in Databases but I'm certainly interested in Distributed Systems. Computer Networks is about as close as this list gets.

The beauty of this list, if there is one, is that the basis is strong enough that one could jump off in any direction after it's completion. If you were interested in video games get more books on rendering and physics, if you're interested in cryptography and security get more books on that, etc, but the foundation should be strong enough for any direction you'd like to go in. This list may get updated in the future. It's far from perfect but it does seem to me like a pretty reasonable place to start.
comments powered by Disqus

Unless otherwise credited all material Creative Commons License by Brit Butler