I'm relatively new to CS (4 years) and I've seen a lot of great book recommendations here. But every discipline has it's most fundamental books ... e.g. philosophy -> Socrates, Plato, Aristotle, civil law -> code civil, christianity -> bible, etc. one should read to get a truly deep understanding.What are those books for CS?
[+] [-] reacweb|6 years ago|reply
[+] [-] einpoklum|6 years ago|reply
Also, I'd add, at least:
Introduction to Algorithms / Cormen, Leiserson & Rivest (and recently also Stein)
[+] [-] vips7L|6 years ago|reply
I found Operating Systems: Three Easy Pieces to be better.
http://pages.cs.wisc.edu/~remzi/OSTEP/
[+] [-] jammygit|6 years ago|reply
[+] [-] amelius|6 years ago|reply
[+] [-] omarhaneef|6 years ago|reply
For instance, there is a whole subset devoted to turing machines, the halting problem, finite state machines, provability, incompleteness, the set of all sets, diagonalization proofs etc
There is a whole subset devoted to programming languages: computational complexity, reducing the time spent in loops, and so on.
Then there is a whole bunch spent on best practices: git and other version control, review, commenting style.
Then there is this actual thing called programming: learning different languages, arguing when functional is better than object oriented, please build a web server in prolog as an exercise, and so on.
Then there is a bunch about operating systems, and where the hardware meets the software, and garbage collection, and parsing and all that stuff.
Then databases are their own thing: boyce-codd normal form, ACID properties, is the web a database? how do you prove the ACID properties? Distributed databases, and B-trees time for storage and retrieval.
These are just various sort of "verticals".
I myself like to think of it in terms of specializations: data science/machine learning is one, web apps are another, mobile apps are another and so on. Each specialization depends on what useful thing you are trying to achieve.
[+] [-] Anon84|6 years ago|reply
https://news.ycombinator.com/item?id=20920018
[+] [-] crimsonalucard|6 years ago|reply
Sort of like how Set theory and Category theory make up the fundamental basis of all math, the fundamentals of computer science are encoded within your first example:
>For instance, there is a whole subset devoted to turing machines, the halting problem, finite state machines, provability, incompleteness, the set of all sets, diagonalization proofs etc
[+] [-] bo1024|6 years ago|reply
So the closest parallels are original research papers like Turing's and Shannon's; but you're probably better off reading more recent textbooks.
That said, to balance out the heavy emphasis on programming and engineering books here, some recommendations:
- Sipser. Introduction to the Theory of Computation.
- Russell, Norvig. AI: A Modern Approach.
- For algorithms I don't have a preference. There is Dasgupta-Papadimitriou-Vazirani; Cormen-Leisersen-Rivest-Stein; Kleinberg-Tardos; and more.
A bit farther from core CS, I also like:
- Cover, Thomas. Elements of Information Theory.
- Li, Vitanyi. An Introduction to Kolmogorov Complexity and Its Applications
[+] [-] einpoklum|6 years ago|reply
[+] [-] kingkongjaffa|6 years ago|reply
You need to know numbers and simple algebra to tackle trig, you need to know all that to tackle calculus or linear algebra, you need to know those to tackle differential equations.
I would argue CS is closer to philosophy.
Sure you have programming building blocks like variables, loops, conditionals, objects blah blah.
But you quickly head into patterns and conventions that started out as someones opinion on how things should be set up, rather than some fundamental principle.
[+] [-] qntty|6 years ago|reply
Computer Systems: A Programmer's Perspective has a lot of good explanations of hardware/os subsystems that can be hard to find detailed explanations of elsewhere. I especially like the sections on virtual memory.
[+] [-] srijanshetty|6 years ago|reply
[+] [-] archielc|6 years ago|reply
This one's for you if you want to learn or just recap principles of computers (and read on evolution as well). I just started reading it and found it suprisingly easy to follow. It's perfect if you like things explained step-by-step and in a simple way.
[+] [-] todd8|6 years ago|reply
However, I bought this book in 2013 and was disappointed. I kept the book in the hopes that my high school and college aged kids might get something out of it. This is a book appropriate for someone new to programming. I don't consider this a book for computer scientists that already have a university degree, since it provides only a very basic introduction to Boolean algebra, logic gates, computer arithmetic. If you know what a NAND gate is and what a XOR instruction does you don't need this book.
For the practicing professional or a serious CS student interested in bits and bytes I might recommend Hackers Delight, Second Edition by Hennry S. Warren Jr.
[+] [-] ninjacatex|6 years ago|reply
Definitely would recommend!
[+] [-] moonfleet|6 years ago|reply
[+] [-] jtms|6 years ago|reply
[+] [-] onemoresoop|6 years ago|reply
[+] [-] FillardMillmore|6 years ago|reply
It's an extensive and well-rounded look at various fundamental system administration topics with examples included from multiple different *nix distributions (topics like work management, logging, networking, security, the kernel, systemd, permissions, etc.). If you're at all interested in Linux, this is a great book to have on your shelf.
https://admin.com/
[+] [-] madhadron|6 years ago|reply
I dispute this idea. For some disciplines, this may be so. For other, such as physics, biology, chemistry, mathematics, civil engineering, poetry...actually, for most disciplines they aren't based on fundamental books. They're based on a living community of practice.
In these disciplines a book is important only insofar as it can be used to increase your abilities. No one goes and studies the textual details of Landau & Lifshitz as a guide to anything, any more than they do so with TAOCP.
Rather than worry about fundamental books, worry about opening up black boxes at a steady rate.
[+] [-] pacbard|6 years ago|reply
[1]: https://en.wikipedia.org/wiki/Paradigm_shift
[+] [-] TheRealPomax|6 years ago|reply
The question as posed does not strike me as one of worry, but of curiosity: what ARE the seminal works that the different fields point to as being the "bibles" of their discipline? Comp. Sci. has Knuth, Russel and Norvig, etc. Other fields most certainly have their own, and knowing which those are is interesting and worth getting an answer to.
[+] [-] znpy|6 years ago|reply
I'd say: every discipline has it's most fundamental memes
[+] [-] playing_colours|6 years ago|reply
1. Historically foundational: books that brought important ideas, introduced a new branch, progressed the maths significantly. You can read them these days, but their content, proofs, language, etc. is not up to date. Examples: Elements by Euclid, Philosophiae Naturalis Principia Mathematica by Newton, Disquisitiones Arithmeticae by Gauss.
2. Modern foundational books: The ones that can be used for studying now. Books that are clearly written, popular, cover their subject well. Examples: Visual Complex Analysis, Spivak’s Calculus, Linear Algebra Done Right, Hardy’s An Introduction to the Theory of Numbers.
[+] [-] throwaway_bad|6 years ago|reply
They are usually hugely influential in their times but have been refined or made easier to digest since. If you care deeply about your field you should read them at some point to see how ideas evolved historically.
English: Shakespeare
Biology: Darwin's Origin of Species
Math: Euclid's Elements
For OP's topic, I'd say Shannon's "A Mathematical Theory of Communication" is up there for computer science.
[+] [-] physicsyogi|6 years ago|reply
The one thing that I've found with some of these "fundamental" books is that there are gems of information that can be very helpful for specific problems.
For instance, Landau and Lifshitz's statistical mechanics book has first-rate description of entropy and multiplicity. And TAOCP has an incredibly thorough discussion of combinatorics that I found invaluable.
[+] [-] ztree|6 years ago|reply
Then I studied a matrix of math books, along with other CS books regarding compilers, operating systems etc. My aim was to get good enough understanding to comfortably digest the famous research papers.
I am yet to find definitive books that teach a way of thinking on their own merit as a single book. Cs like others is a matrix of knowledge that clicks as a whole 'chunk' of understanding, changing the way you have thought about things like programming in general. I'm having a hard time explaining this.
If you're not a CS graduate, I highly suggest simply going through academics of places teaching theoretical CS.
[+] [-] fredophile|6 years ago|reply
[+] [-] guiraldelli|6 years ago|reply
If I had to say one text that is the fundamental one, I would go with a paper: “On Computable Numbers, with an Application to the Entscheidungsproblem” [1], by Alan Turing.
---
But if you just started your course in Computer Science, then I will give you some “bookshelf advice" based on my experience. I had the pleasure to study all the books I am going to recommend you, and most of them I was able to read cover-to-cover during the university years. And they are also in my bookshelf for reference.
The book order does not represent rank of importance.
* “Introduction to the Theory of Computation”, by Michael Sipser.
* “Graph Theory”, by Reinhard Diestel. * “The Algorithm Design Manual”, by Steven Skiena. * “Computer Architecture: a Quantitative Approach”, by Hennessy and Patterson.* “Modern Operating Systems”, by Andrew Tanenbaum.
* “Artificial Intelligence: a Modern Approach”, by Russel and Norvig.
* “Modern Compiler Implementation (in ML)”, by Andrew Appel.
I would like to also recommend “Concrete Mathematics”, by Graham, Knuth and Patashnik, but I remember to not feel it the most pedagogical book on the subject.
Good luck!
---
[1]: https://www.cs.virginia.edu/~robins/Turing_Paper_1936.pdf
[+] [-] cr0sh|6 years ago|reply
Certainly that one, but I would add a couple of others:
"https://en.wikipedia.org/wiki/The_Laws_of_Thought" (George Boole) - lays out boolean algebra; fundamental to everything in computing
"https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_a... (Claude E. Shannon) - basically lays out the equivalence of switching circuits to boolean algebra, fundamental to electronic computing
Note in fact many of Shannon's works and research could be considered "fundamental"...
[+] [-] jamil7|6 years ago|reply
[+] [-] agentultra|6 years ago|reply
Structure and Interpretation of Computer Programs
Purely Functional Data Structures
Programming in the 1990s
A Logical Approach to Discrete Math
[+] [-] purple_ducks|6 years ago|reply
I'm guessing like most people who bought it, it sits collecting dust on the shelf.
Youthful naivety is the only reason I bought it. Completely impenetrable but look, "I'm a real™ software engineer now"
[+] [-] robto|6 years ago|reply
[0]https://www.nand2tetris.org/book [1]https://www.nand2tetris.org/
[+] [-] artimaeis|6 years ago|reply
It's a book that explores hardware from the ground up. It's one of the most insightful books I've found for getting a real intuition for hardware.
[+] [-] srijanshetty|6 years ago|reply
- Theoretical CS: - Compilers: Principles, Techniques, and Tools (The Dragon Book) - Introduction to the Theory of Computation, Sipser
- Programming: - Java Concurrency In Practice, Brian Goetz - Generics in the Java Programming Language, Gilad Bracha - Professor Frisby's Mostly Adequate Guide to Functional Programming - Unix for Poets - Modern C++
[+] [-] mrbrowning|6 years ago|reply
- Discrete Mathematics And Its Applications, Kenneth H. Rosen (this is more foundational, but it's definitely targeted at a CS audience and touches on things like automata theory)
- Types and Programming Languages, Benjamin C. Pierce
- Semantics of Programming Languages, Carl Gunter
[+] [-] faizshah|6 years ago|reply
[+] [-] dougb5|6 years ago|reply
[+] [-] andrelgomes|6 years ago|reply
Data Structures and their relationship with each other to be a great technical programmer. These books (just highlight not everything) I would think -> Algorithms Sedgewick, Lisp Programmers Manual, Designing Distributed Systems. .To be a great collaborative programmer (in a work enviornment) -> Pragmattic Programmer, Code Complete, Mythical Man Month, A Philsophy of Software Design by Ousterhout. For philsophy of programming itself -> The Soul of a Machine
Edit: Programming is very broad and operates in many context from the technical, social, to the ideas behind it. I would say it is almost to early to have those definitive fundamental books
[+] [-] carapace|6 years ago|reply
2. "Programming Pearls" by Jon L. Bentley IMO this is the most concise yet accessible gateway to the inner Mysteries of Computer Programming. Read between the lines, the prime thesis is implied not explicit.
3. "Thinking Forth" by Leo Brodie (Available as a PDF here: http://thinking-forth.sourceforge.net/ ) Most software is grossly too large. This book shows how to grok and extract the essence of your problem into minimal code. (Chuck Moore had a 3D wireframe CAD program he used to carry around as a deck of punch cards in his shirt pocket.)