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 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 KrishnamurthiStructure and Interpretation of Computer Programs by Harold Abelson and Gerald SussmanParadigms of Artificial Intelligence Programming by Peter NorvigAlgorithms by Sanjoy Dasgupta, Christos Papadimitriou and Umesh VaziraniIntroduction to Algorithms by Thomas Cormen, Charles Leiserson, Ronald Rivest and Clifford SteinComputer Networks by Andrew TanenbaumProgramming Language Pragmatics by Michael ScottComputer Organization and Design by David Patterson and John HennessyIntroduction to Computing Systems by Yale Patt and Sanjay PatelOperating System Concepts by Abraham Silberschatz, Greg Gagne and Peter GalvinOperating Systems: Design and Implementation by Andrew Tanenbaum and Albert WoodhullThe Humane Interface by Jef RaskinCode Complete by Steve McConnellReal-Time Rendering by Tomas M'OllerArtificial Intelligence by Stuart Russell and Peter NorvigIntroduction to the Theory of Computation by Michael SipserModern Cryptography: Theory and Practice by Wenbo MaoHacker's Delight by Henry WarrenPurely Functional Data Structures by Chris OkasakiCompilers: Principles, Techniques, and Tools by Alfred Aho, Monica Lam, Ravi Sethi and Jeffrey UllmanLisp In Small Pieces by Christian QueinnecProgramming Languages: Application and Interpretation by Sriram KrishnamurthiTypes and Programming Languages by Benjamin PierceConcepts, 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.