What Every Computer Science Major Should Know
matt.might.net
matt.might.net
Implementing intepreters is cool. But the key value of studying compilers is that it provides you with the tools to build robust, extensible input processing (and, to a slightly lesser extent, data processing and output) code. If programmers are confident with using regular expressions and context-free grammars as appropriate, even if it's just coding up recursive descent parsers, I think they can produce much better input processing in their software.
And a large quantity of software needs to parse input, and possibly turn it in to different output, at some point in its execution.
Of course, I may lack perspective, having been a math major (or due to some other deficiency in my background), but I consider myself pretty comfortable with about half the list and somewhat familiar with about half the remainder. How much of it did I learn as an undergrad, though? Not very damn much, and I don't think I would have even been exposed to it all even if I had done CS instead of math.
- Lambda Calculus - Reflective and Meta-programming - Meta-object Protocol - Closures - Continuations - Monads - Arrows - First-class Everything - Stack and Register-based Programming - XML - Linear Algebra - Fractal and Wavelet Image Compression - Regular Expressions - Clojure - LaTeX
NB. The concepts to which the above keywords refer, may or may not have been covered by the article. The keywords themselves are however absent.
Additional reading suggestions:
- Jon Bentley's Programming Pearls - Tom Mitchell's Machine Learning - Douglas Hofstadter's Gödel, Escher, Bach - Brian Kernighan and Rob Pike's Unix Programming Environment
I was about to add GEB, but realized it doesn't quite fit under any category.
I could add a "general" reading list, but do you think it fits in a category?
It is there that formal systems are brought up and CS majors should be aware of the hierarchy and limitations of formal systems, which are discussed in GEB.
If I were to place GEB under an arbitrary category, I would probably suggest ``Philosophy of Computation.''
[1] http://www.amazon.com/Incompleteness-Phenomenon-Martin-Golds...
What's more, GEB presents Aristotelianism vs. Platonism in the context of _computation_.
_That_ is a question CS majors should at least be aware of.
The question of whether computations can _ever_ be brought to have consciousness.
Then again, given my limited knowledge, I am far from being an authority on the topic and look forward to gaining more insight by hearing other opinions.
OCaml may work as an alternative to SML.
You could also mention Information Retrieval, alongside Machine Learning.
Compilers/parsing/interpreters/etc. could really be its own top level item.
Learning to use profilers / performance optimization. _The Practice of Programming_ covers this (and many other things!) quite well.
All in all, a great list. Probably also useful to suggest starting points for people (like myself) who are self-taught.
I agree that OCaml and SML are roughly interchangeable for educational purposes. I picked SML because it's slightly "cleaner."
As a compilers prof, I agree that compilers should be its own item, but politically, that's a tough sell. Teaching compilers needs to be sold in the service of another end for most faculties.
Also, I think most people fail to appreciate how useful compiler techniques are outside of "compilers". Even just knowing a little about lexing and parsing goes a long way.
For Prolog, I'd also recommend _The Art of Prolog_ by Sterling & Shapiro and/or Clocksin's _Clause & Effect_.
so i'd add Jim Gray's 'Why Do Computers Stop and What can be done about it' http://www.hpl.hp.com/techreports/tandem/TR-85.7.pdf
Also, 'Reflections on Trusting Trust' is a good one to add under security. I'd also recommend 'What's your threat model?' http://iang.org/ssl/wytm.html
I'll make that an explicit point under architecture and PL.
------------------------------
+ Disjoint Sets and Union-Find
+ In-Memory Sorting:
- O(n * log n) (e.g. Quicksort)
- O(n) (e.g. Bucket Sort)
+ External Sorting (e.g. Polyphase Sort)+ B-Trees
+ AVL Trees
+ Graph/Tree Search/Traversal:
- Depth-First
- Breath-First
Reading:http://en.wikipedia.org/wiki/Introduction_to_Algorithms
Discrete Mathematics
--------------------
+ Equivalence Relations
+ Recurrence Relations
Formal Logic
-------------
+ Propositional
+ First-order
+ Second-order
+ Common Fallacies
Also
----
+ EWDs: Dijkstra's Systematic Manuscripts:
- http://www.cs.utexas.edu/users/EWD/It is awfully sad how many of self-called "hackers" are unable to reconfigure an IP address on worlds most-popular desktop OS.
I have trouble trusting such "engineers" with ability to design great software when they couldn't even educate themselves on both major world perspectives on OS design.
That means it is the one most likely to be officially supported everywhere you go. You get to your new job, you'll find a Windows box on your desk, set up by IT, configured the way they like it--and the way they want it to stay.
If you run OS X or Linux at home, and only use Windows on boxes provided and administered by someone else, why learn how to administer Windows boxes? None of us have time to become experts in every technology we encounter as users. Not knowing how to reconfigure an IP address on Windows seems no worse than not knowing how to change a spark plug on a rental car.
I don't have any idea how Windows 7's (or Vista, or OS X, etc. hell, I vaguely remember how to do this on my *nix box) networking software works, but I guarantee you I could google it and solve my problem in minutes.
But these types of skills/knowledge is different from understanding a computer scientist would require. I would be more worried if someone who claims to know networking doesn't know popular protocols or algorithms like for example the sliding window protocol.
The issues you face in designing, understanding and analyzing such algorithms will change you more than understanding where windows stores the setting to configure one of their protocol parameters.
You mention probability in the beginning, but make no mention of machine learning.