Must Read CS Books For Self Self-Taught Programmers
In light of past discusion about Self-Taught Programmers vs CS-Educated Programmers:
What are must read CS books (or other resources) that help you in your daily work? (so I don't mean code complete or head first design patterns)
I'm a Self-taught programmer and I think I'm missing some knowledge of algoritmes and discrete math. but perhaps there are other great subjects/books (compilers etc)
EDIT: Thanks everybody for the great suggestions
EDIT 2: The list so far (unsorted)
http://sharetext.org/YUE
62 comments
[ 2.5 ms ] story [ 107 ms ] threadhttp://research.microsoft.com/en-us/um/people/simonpj/papers...
- After learning functional programming I realized how much of my programs do just mapping or folding over data. You start to spot the cases where this is not immediately obvious after some FP practice.
- After learning logics programming, I realized how much of my programs do a poor man's version of backtracking.
Maybe one of those languages is so much fun that you'll eventually change your 'lifestyle'. E.g. I use Haskell in many cases where I'd previously use Python or C.
[1] Of course, it doesn't always come natural. C++ STL does provide maps and folds, but since pre-C++0x doesn't have lambdas, using them requires more effort.
It'll reinforce some concepts from math, and lead you toward writing code in a manner that's considered good practice in other languages - such that it's generally maintainable and testable. Similarly, if you're familiar with Design Patterns, you'll see that a lot of patterns are attempts to implement functional concepts in OO languages. That said, as a fan of Haskell I'm definitely biased, and a lot of that can be said for other functional languages as well.
"Real World Haskell" is also very good, but probably not the best place to start if you haven't written in a functional language before.
definitely a lot less hand-holding than learnyouahaskell, but they complement each other pretty well.
The book is somewhat life changing, in the questions that it asks. You might find yourself thinking about things differently, such as what it is to be conscious, can we ever achieve artificial intelligence, is there such a thing as fate, how was J.S. Bach able to produce such stunning compositions, etc.
It's quite heavy going however, but there's a slightly more succinct, terse version which he wrote a few years ago, called "I Am a Strange Loop". This book takes the point he was trying to make in the first book, and expands on it while adding clarification. It does lack a lot of story that the original contained, so it's not a complete replacement however.
While I think of it, there's also Operating System Concepts by Silberschatz, Gagne and Galvin - http://www.amazon.com/Operating-System-Concepts-Windows-Upda.... It's an extremely detailed look at how operating systems work, down to the lowest level, and it explains a large number of things that we interact with on a daily basis.
I'd recommend skipping this book and instead reading the Intel x86 documentation. It was vastly more useful to me while writing my own operating system than anything I read in Operating System Concepts.
Structure and Interpretation of Computer Programs - Abelson, Sussman, and Sussman
Introduction to Algorithms - Cormen, Leiserson, Rivest, and Stein
The Art of Assembly Language - Hyde
a digital logic book (not sure which is most recommended), and an architecture book (see reply by tftfmacedo)
Modern Operating Systems - Tanenbaum
Introduction to the Theory of Computation - Sipser
Compilers: Principles, Techniques, and Tools - Aho, Lam, Sethi, and Ullman (a.k.a. "Dragon Book")
Programming Language Pragmatics - Scott
A database design book (one that covers Relational Algebra, not just a book on SQL), and maybe a book on Networks. Also, Roy Fielding's paper on REST is both academic and applicable (and more approachable than you'd expect of a Ph.D paper). If you want to go all the way, an undergraduate program usually also has Calculus, Discrete Math, Linear Algebra, and Statistics. Some schools would also require Physics and Differential Equations. I'm sure I'm missing some topics, too, particularly electives.
If you can get through those and the associated problem sets, you'll have a better foundation than most.
In fact, I'd recommend this book first, for it gives self-taught programmers a taste of nearly everything in computer science (and thus equips them to know which branch they'd like to pursue next).
Computer Architecture: A Quantitative Approach - Hennessy and Patterson
Thinking Forth - Brodie
start with algorithm analysis and basic data structures etc in CLRS. (ch 3,4,10,11,12) and then go back and fill in the more advanced concepts. dasgupta, papadimitriou, vazirani is good too http://www.cs.berkeley.edu/~vazirani/algorithms.html
for the compilers book, it's necessary to go through the assembly, and some of sipser (need DFA/NFA/context free grammars), as well as structure and interpretation of computer programs.
OS could come after the algorithms and preferably after assembly but before the compilers book.
Prolog and Natural-Language Analysis - Fernando C. N. Pereira and Stuart M. Shieber
The PDF is available from the publisher: http://www.mtome.com/Publications/PNLA/prolog-digital.pdf
It also serves as a great introduction to Prolog and logics programming.
http://www.amazon.com/gp/offer-listing/0262192500/ref=tmm_hr...
...I got mine for like $2, and I've been very happy with it.
You can find some resources, mostly books, in the following links
http://stackoverflow.com/questions/194812/list-of-freely-ava...
http://stackoverflow.com/questions/1711/what-is-the-single-m...
Don't take this as a recommendation, because I haven't read it, but Stephen Marsland's Machine Learning book appears from a glance at the table of contents to be a much more modern attempt to provide the same type of coverage as Mitchell. But again, I can't speak to its quality.
Chris Bishop's Pattern Recognition book is also very good, but it's not the same sort of book. Bishop is exhaustively deep on the narrower range of ML that he covers, but you won't get the same sort of coverage of the wider view of the field.
This is the first time I hear about Marsland's book, so I can't comment on that.
First is Structure and Interpretation of Computer Programs[1], which you can read online, and the associated course at MIT, which is 6.001[2]
Second is the famous 'Dragon Book', Compilers: Principals, Techniques and Tools[3] and the associated course which is 6.035[4]
Extras would be the Python book 'How to think like a Computer Scientist'[5]. MIT course 6.00[6] uses the book as a reference, and the courseware is again available online.
Other than that - the usual suspects on learning C (K&R), UNIX (TAOUP[7]), the bash shell along with grep, sed, awk, more algorithms(CLRS[8]), functional programming and machine learning. Take your time, it takes years to build the relevant experience and knowledge and you are never done.
I love the MIT courses. Work and learn at your own rate. I feel that it is important to implement all the code yourself even if it looks easy in a lecture - there are little things you pick up as you write algorithms out.
Even though I had worked through SICP I still watched all the lectures again and implemented all the examples with benchmarks and unit tests. I usually set aside one day on the weekend to work on study, and usually an extra evening or two mid-week to read papers and books. Once you get into the routine it is great.
It might be the best approach to set yourself a timetable and weekly schedule, just like in UNI (ie. every Saturday plus Tuesday and Thursday nights) and work through the MIT courseware and associated books in order (6.00, 6.001, 6.035). The more advanced MIT courseware is an excellent bonus.
[1] http://xrl.us/sicp
[2] http://xrl.us/6001
[3] http://xrl.us/dragonbook
[4] http://xrl.us/6035
[5] http://xrl.us/thinkcs
[6] http://xrl.us/6000
[7] http://xrl.us/artunix
[8] http://xrl.us/clrs
For the record the shortened URLs are not affiliate links, and I'm not trying to make any statement about affiliate links. Here are the original URLs:
[1] http://mitpress.mit.edu/sicp/full-text/book/book.html
[2] http://ocw.mit.edu/courses/electrical-engineering-and-comput...
[3] http://dragonbook.stanford.edu/
[4] http://ocw.mit.edu/courses/electrical-engineering-and-comput...
[5] http://greenteapress.com/thinkpython/
[6] http://ocw.mit.edu/courses/electrical-engineering-and-comput...
[7] http://www.faqs.org/docs/artu/
[8] http://www.amazon.com/dp/0262032937/
1. Didn't know that HN would trim the long links
2. Remember the shortcodes/aliases used at xrl.us (such as the MIT course names), although browser smart address bars and Google is just as easy.
Thanks for putting the links up, I don't need to update my comment.
(1) MIT has also posted lectures for "Intro to Algorithms" taught by Leiserson (one of the authors of the famous textbook). The course number is 6.046J[0].
(2) You mention shell scripting and sed/awk/grep...can you recommend any resources for those?
[0] http://ocw.mit.edu/courses/electrical-engineering-and-comput...
1. Understand the philosophy behind UNIX. ie. everything is a file and it is small apps that are very good at a single task that can be combined through pipes etc. to process larger tasks (this has lost its way somewhat in Linux, but still holds true)
2. Look at your computer usage through development, sysadmin, etc. and find parts that you want to automate, and then set out to write scripts to complete these tasks. for eg. in each one of my projects I have a script called start.sh which has a bunch of tasks implemented (eg. backup, serve, dns (to update dyndns for callbacks), push, diff, deploy, stage (run remote commands) etc.). Remember that git is itself a set of shell scripts, as are most server management commands. Take a peak inside each of these to learn how they are implemented.
3. Once you have a good understanding of what you want to implement, just go for it. Learn along the way by using Bash scripting, regular expressions, an understanding of UNIX/Linux, sed, awk, yacc/bison (to analyze code and extract info). You will end up building your own collection of shell scripts, environment variables, .vimrc, ssh, curl (you can do almost any API request and auth with curl and a shell script - automate tweets, RSS feeds) etc. (I have been meaning to publish my own, the most recent one I wrote greps my code for TODO's and pushes them to a simple webapp where I can view them, sort them, etc. along side my 'personal' todo list)
4. You need two sets of resources, one is for learning, the other is for reference which you keep handy. Here are my own recommendations:
Learning:
The learning style book comes down a lot to personal preference. You can go wrong, so get a feel for each topic by reading online tutorials and then scan the TOC and sample chapters of books that look good. A subscription to O'Reilly Safari comes in handy. There are now also a lot of screencasts online, try searching YouTube for the topic with 'screencast' or 'tutorial', once you find a good screencast publisher look at the rest of his/her videos.
You can also get the O'Reilly books on special in bundles sometimes, check their website
There is no book that really introduces UNIX and then covers most of these topics as I described. ie. 'UNIX for Developers'.
* UNIX:
- FreeBSD handbook: http://www.freebsd.org/doc/handbook/
- Linux Documentation Project: http://tldp.org/LDP/
- Linux Command Line and Shell Scripting Bible: http://www.amazon.com/Linux-Command-Shell-Scripting-Bible/dp...
- UNIX In a Nutshell (I haven't read this in a while but it is on my shelf): http://oreilly.com/catalog/9781565924277
- Learning UNIX (also O'Reilly): http://www.amazon.com/Learning-UNIX-Operating-System-Fifth/d...
* Bash:
- http://linuxcommand.org/
- http://bash.cyberciti.biz/guide/Main_Page (better, and v good)
- Learning the Bash shell: http://oreilly.com/catalog/9780596009656/
- Advanced Bash Scripting (online): http://tldp.org/LDP/abs/html/
- YouTube playlist: http://www.youtube.com/view_play_list?p=2284887FAE36E6D8
* Regular Expressions:
- Mastering Regular Expressions (this is such a great book. I...
SICP
Art of Computer Programming
C Programming Language
Introduction to Algorithms
Land of Lisp
-- Extracted from my wishlist - http://flipkart.com/wishlist/dhavaltrivedi
http://greenteapress.com/thinkpython/thinkCSpy/html/
Algorithms -> Algorithms + Data Structures = Programs by Wirth (worth its weight in gold if you can get past the Pascal syntax)
OS -> Operating System Concepts by Silberschatz et al (The dinosaur book)
CS Theory -> Introduction to Automata Theory, Languages, and Computation by Hopcroft, Ullman
Programming Languages Theory -> Programming languages: design and implementation by Pratt et al
Database Theory -> Database Design by Wiederhold
Architecture -> Structured Computer Organization by Andrew S Tanenbaum
"If you can write a compiler, you can write any program."
Hence, I'd get compiler books. Modern Compiler Implementation in Standard ML, SICP has a couple of sections on compilation, there's a computational theory book that I don't have on hand which would be useful to this end too.
"His research goal was to understand why operating systems were so much more difficult than compilers"
http://research.microsoft.com/en-us/people/thoare/
The Mythical Man Month by Fred Brooks really helped me learn to think about large projects from a personnel and planning perspective. There are some ideas there that have become part of the CS canon; "no silver bullet" and the slightly sexist but accurate metaphor for throwing more people at an overdue project, "nine women can't make a baby in one month." The Mythical Man Month was written in 1975, but it holds up remarkably well.
http://www.amazon.com/Little-Schemer-Daniel-P-Friedman/dp/02...
FYI: it is the first book in a "trilogy" -- but your next book could be either of the other two (their only prereq is The Little Schemer). Listed below:
Reasoned Schemer: http://www.amazon.com/Reasoned-Schemer-Daniel-P-Friedman/dp/... Seasoned Schemer: http://www.amazon.com/Seasoned-Schemer-Daniel-P-Friedman/dp/...
http://sharetext.org/YVA
Aside from that, there are typically only 1-2 extremely well regarded books in any given area. If you're going to be doing something specific, grab the appropriate book.
eg:
Compilers - Dragon Book
AI - Russel/Norvig's Artificial Intelligence: A Modern Approach
Oh.. everyone needs a whiteboard, as well - they're quite useful
http://csapp.cs.cmu.edu/ http://www.amazon.com/Computer-Systems-Programmers-Perspecti...
http://www.reddit.com/r/books/comments/ch0wt/a_reading_list_...