Computer Science

Computer Science - Great Readings

This document consists of great books or articles on computer science. Some are here because there is a course covering the same material; some are just great books that you should read at some point in your career.

Once you have made it through most of the curriculum, knowing whether a book is worth your time will become easier. Or, if you are struggling in one of the courses, perhaps reading a book on the subject will help.

Programming

Name Author(s)
Introduction to Computation and Programming Using Python 3e John V. Guttag
Think Python 2e Allen B. Downey
How to Design Programs 2e Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi
Structure and Interpretation of Computer Programs 2e Hal Abelson, Jerry Sussman, Julie Sussman
The Structure and Interpretation of Computer Programs (2021, JavaScript) Harold Abelson, Gerald Jay Sussman, Julie Sussman, Martin Henz, Tobias Wrigstad and Samuel Fang
Concepts, Techniques, and Models of Computer Programming Peter Van Roy, Seif Haridi
Design Patterns: Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
Refactoring Martin Fowler
Clean Code Robert Martin
Code Complete 2e Steve McConnell
The Pragmatic Programmer 2e Andrew Hunt, David Thomas
Programming Languages: Application and Interpretation Shriram Krishnamurthi
Programming and Programming Languages Shriram Krishnamurthi, Benjamin S. Lerner, Joe Gibbs Politz
Competitive Programming Steven Halim, Felix Halim
Introduction to computing in Java Robert Sedgewick, Kevin Wayne
How to Design Programs, Second Edition Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, Shriram Krishnamurthi

Math

Name Author(s)
Calculus Made Easy Silvanus P. Thompson
Ximera: Interactive Calculus Textbooks Ximera team
Discrete Mathematics with Applications (4th Edition) Susanna S. Epp
Discrete Mathematics: An Open Introduction Oscar Levin
Applied Discrete Structures Alan Doerr, Ken Levasseur
Grinstead and Snell’s Introduction to Probability Charles M. Grinstead, J. Laurie Snell
Linear Algebra for Everyone Gilbert Strang
The Art of Linear Algebra Kenji Hiranabe, Gilbert Strang

Systems

Name Author(s)
But How Do It Know? J. Clark Scott
Computer Systems: A Programmer’s Perspective (3rd Edition) Randal E. Bryant, David R. O’Hallaron
Modern Operating Systems (4th Edition) Andrew S. Tanenbaum, Herbert Bos
Computer Organization and Design: The Hardware/Software Interface (6th Edition) David Patternson, John Hennessy
Computer Networks (5th Edition) Andrew S. Tanenbaum, David J. Wetherall
Computer Networking: A Top-Down Approach (8th Edition) James F Kurose, Keith W Ross
Distributed Systems: Principles and Paradigms Andrew Tanenbaum
Operating Systems Design and Implementation Andrew S. Tanenbaum, Albert S. Woodhull
Crafting Interpreters Robert Nystrom
Principles of Compiler Design Alfred Aho, Jeffrey Ullman
Distributed Systems Reading Group Various
System Design: Design large-scale systems Various

Theory

Name Author(s)
Introduction to Computing: Explorations in Language, Logic, and Machines David Evans
Introduction to the Theory of Computation (3rd Edition) Michael Sipser
Introduction to Algorithms (3rd Edition) Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
The Algorithm Design Manual (3rd Edition) Steven Skiena
Algorithms (4th Edition) Robert Sedgewick
Category Theory: A Gentle Introduction Peter Smith
Category Theory for Programmers: The Preface Bartosz Milewski
An Introduction to Information Retrieval Christopher D. Manning, Prabhakar Raghavan, Hinrich Schütze
Computer Science: An interdisciplinary approach Robert Sedgewick, Kevin Wayne
DSA CS3: Data Structures & Algorithms (Coursenotes - Slides) The OpenDSA Project (supported by National Science Foundation)

Applications

Name Author(s)
Architecture of a Database System Joseph M. Hellerstein, Michael Stonebraker, James Hamilton
Readings in Database Systems (5th Edition) Peter Bailis, Joseph M. Hellerstein, Michael Stonebraker, editors
Database Management Systems (3rd Edition) Raghu Ramakrishnan, Johannes Gehrke
Transaction Processing: Concepts and Techniques Jim Gray, Andreas Reuter
Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World (3rd Edition) William Kent
The Architecture of Open Source Applications Michael DiBernardo (editor)
An Introduction to Statistical Learning Gareth James, Daniela Witten, Trevor Hastie and Robert Tibshirani
Deep Learning Ian Goodfellow, Yoshua Bengio and Aaron Courville
Bayesian Reasoning and Machine Learning David Barber
Language Implementation Patterns Terence Parr
Compilers: Principles, Techniques, and Tools (2nd Edition) Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman
Compiler Construction Niklaus Wirth
The Mythical Man-Month Fred Brooks, Jr.
Physically Based Rendering: From Theory To Implementation Matt Pharr, Wenzel Jakob, and Greg Humphreys

Tools

Name Author(s)
The Linux Command Line by William Shotts