I’ve always been a largely independent learner gleaning what I can from Wikipedia and various books. However, I fear that I may have biased my self-education by inadvertent omission of topics and concepts. My goal is to teach myself the equivalent of an undergraduate degree in Computer Science from a top university (doesn’t matter which one).
To that end, I’ve purchased and started reading a few academic textbooks:
- Structure and Interpretation of Computer Programs
- Introduction to Algorithms
- Artificial Intelligence: A Modern Approach
As well as a few textbooks I have left over from classes I’ve taken at a mediocre-at-best state university:
- An Introduction to Computer Simulation Methods
- Calculus: Concepts and Connections
- Computer Organization and Architecture
- Operating System Concepts
- A First Course in Database Systems
- Formal Languages and Automata
My questions are:
- What topics aren’t covered by this collection?
- Are there any books that are more rigorous or thorough (or even easier to read) than a book listed here?
- Are there any books that are a waste of my time?
- In what order should I read the books?
- What does an MIT or Stanford (or UCB or CMU …) undergrad learn that I might miss?
Software engineering books are welcome, but in the context of academic study only please. I’m aware of Code Complete and the Pragmatic Programmer, but I’m looking for a more theoretical approach. Thanks!
22
Answers
The Art of Computer Programming by Don Knuth
Biggest two omissions I see:
For operating systems I prefer the Tanenbaum instead of the Silberschatz but both are good:
And about the order, that would depend on your interests. There aren’t many prerequisites, automata for compilers is the most obvious one. First read the automata book and then the dragon one.
I don’t know all the books you have, but the ones I know are good enough so that may mean the others are decent as well.
You are missing some logic and discrete math books as well.
And let’s not forget some database theory books!
The best approach I’ve found is to pick your favorite University, go to their website, and check out the courses for the degree. Many of the big ones have their required readings published for each course. MIT’s Open Course Ware is a good example.
This, by the way, works for non-CS degree programs as well.
I don’t know how is it in the US, but in my country we study discrete mathematics and an introduction to graph theory before formal languages and automata.
Also, I don’t see any book covering computer networks… why don’t you try Andrew Tanenbaum’s Computer Networks?
Before anything else, read Computer Science: a Modern Introduction. This will give you a good grounding and overview of the subjects there are to pursue.
Introduction to Algorithms is very good. For an introduction to functional programming, I recommend working through ML for the working programmer.
Areas that differentiate the computer scientist from the programmer: a grounding in discrete mathematics, a basic understanding of VLSI and systems architecture, an understanding of the basics of cryptography and security, an understanding of computability theory, an understanding of information theory.
This is a pretty good list. The two topics I would definitely add to the mix are discrete math, and networks. Other topics that may be interesting to you are compilers, computer graphics, distributed operating systems. There are also cool sub-fields of AI, like computer vision and machine learning. And in order to handle all that, you definitely need linear algebra and probability.
And it goes without saying that you cannot really do computer science by just reading books. To really understand each topic, you have to do projects in it. I would also suggest looking at MIT’s Open Courseware, where professors post syllabus, lecture notes, and assignments.
school)
schools)
it)
Systems analysis and Design(Software
engineering from the business
perspective. The class was so so.)
Ethics.
Networking (teaches network
algorithms, bit patterns dealing
with network data).
There are some things that to comprehend them require help; not necessarily a Professor(tho they do that for a living), but maybe a friend that has taken the class or studied the field.
Reading books on these subjects doesn’t mean you know them. Doing math on the math, coding on the code, and so on is what helps you understand, and shows you know the subject in the end.
Books on Professional Software Development covering how software projects work, different methodologies, and design patters are great.
Web-design knowledge is also very useful when it comes to employment.
I don’t understand why you are trying to do this yourself though. Even a ‘mediocre-at-best’ university will be able to teach you the skills far better than you can teach yourself. It’s all about meeting people who have experience actually working in the computing industry.
It’s not about the university it’s about the effort you put in that determines how well you do.
My answer is perhaps unhelpful to you though because I don’t know where you are from. In Scotland where I live I got to go to University for free, this may not be the case for you.
I think you can use most of the other books for reference and just absorb Programming Pearls in its entirety. Doing so would make you better than 90% of the programmers I’ve ever met.
Concrete Mathematics
You should also have a book on general databases without going deep into the specifics of Oracle, MySQL, SQL Server, etc.
I’d recommend: Database Systems: The Complete Book
File Structures: An object oriented approach with C++
A lot of good info about block devices and file structuring which you won’t find in any of the books you listed. It got a few critical reviews on Amazon because people didn’t like his code examples, but the point of the book is to teach the concepts, not give cut and paste code examples.
Also make sure to get a book on compilers
Many courses at top universities don’t use a textbook because none of the available books are good enough. (I was educated at Princeton and taught for 8 years at Harvard.) When someone recommends a book, ask if the book is really good or if it is just the best available in the field.
For example, in compilers, I’m not a big fan of the ‘Dragon Book’; I never liked the approach, and the current edition is very outdated. I think you’d be better off with a book like Michael Scott’s Programming Language Pragmatics which although a bit scattershot is a lovely book to read. (I’ve never taught from it, so I can’t say what students think of it.) I don’t know of a really good book on compiler construction for the autodidact, although you might look at Cooper and Torczon’s Engineering a Compiler because it is up to date and written by two of the best compiler engineers in the business.
Sorry, you can’t replace four years of university by reading a book or a number of books, no matter how good the books are. If you could, why would anyone go to university?
First, I wouldn’t worry about it. But if you’d like a book to learn some of the abstract CS ideas, I’d recommend The Turing Omnibus or Theoretical Introduction to Programming.
If I were deciding between hiring two programmers and neither had much experience, but one had a CS degree and the other didn’t, I’d hire the one with the CS degree. But when you get to comparing two programmers with a dozen years of experience, the degree hardly matters.
MIT introduced their “OpenCourseWare” program several years ago. They put books/homework assignments/lectures on-line and so you can follow along with the MIT curriculum:
http://web.mit.edu/catalogue/degre.engin.ch6.shtml
I would add Introduction to the Theory of Computation to the list
I probably can’t suggest the best books, but there are several important subjects you are missing:
Some topics that might be considered more “optional” might be:
and recognition
The Elements of Computing Systems
This book takes you from the basics of hardware design all the way to writing programs in object oriented languages. Using a simulator, you build a complete computer. Then you write an assembler, an operating system, a compiler (for an object oriented language compiled to run on a VM) and then a game written using that language.
It’s a lot of work, but the authors have carefully made the task as simple as possible. You’ll have to work hard to work through this one, but it gives you a complete perspective of computer programming.
You can view some sample chapters, as well as play with the simulators here.
Highly recommended! (Even for CS graduates)
Concepts, Techniques and Models of Computer Programming seems to have the broadest overview I’ve seen of the various higher-level language programming styles and techniques.
The “Gang of Four” Design Patterns book. The Design Patterns course I took in college was probably the most beneficial class I’ve ever taken.
Even i’m in the same plane: studying computer science in my free time after work;
These are some of the books i have in my shelf right now
Will udpate this list further as soon as i finish them… 🙂