from Hacker News

What Every Computer Science Major Should Know

by sindoc on 8/24/11, 4:49 PM with 29 comments

  • by elehack on 8/24/11, 6:45 PM

    I would bump up compilers to their own level.

    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.

  • by pmiller2 on 8/24/11, 6:23 PM

    This reads to me much less like "What every CS major should know" than "Wouldn't it be nice if all CS majors knew...." What I mean by that is I'm not sure it's possible to learn all of that stuff in 4 years at any school anywhere, but it's all useful in certain very broad contexts.

    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.

  • by sindoc on 8/24/11, 7:07 PM

    Keywords that I believe would be worth mentioning:

    - 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

  • by silentbicycle on 8/24/11, 6:55 PM

    You mention version control in passing, but it probably deserves more emphasis. CS majors who aren't comfortable using version control are likely to be at a disadvantage.

    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.

  • by Siah_twitter on 8/24/11, 5:48 PM

    I think probabilistic learning (or machine learning) should have its own section. Recommder systems, sentiment analysis, and graphical models do not really fall into the traditional understanding of AI. It is more stats than CS and logic.
  • by tef___ on 8/24/11, 5:13 PM

    many cs majors are underexposed to operational and system concerns

    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

  • by tbekolay on 8/24/11, 5:24 PM

    The only thing that I had in my undergrad education that I miss in this list is experience with an assembly language. It probably fits in best in the discussion on Architecture: programming in an assembly language, at the very least, makes programmers appreciate high-level languages and makes them think about the underlying hardware.
  • by sindoc on 8/25/11, 2:25 AM

    Data Structures and Algorithms

    ------------------------------

    + 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/
  • by Mavrik on 8/24/11, 6:01 PM

    Missing: "How to install, use and administer Windows."

    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.

  • by petey on 8/26/11, 7:51 PM

    Do you think that malware deserves its own section? Or might it be simply a related field? I have yet to hear of a computer security course that does (real) forensics or encourages creativity to better understand the criminal mind.
  • by gameweld on 8/24/11, 5:15 PM

    * Software engineering (version control) - Is that the best lesson we have to offer?

    You mention probability in the beginning, but make no mention of machine learning.

  • by fpgeek on 8/25/11, 2:22 AM

    Sadly, every computer science major should know that going into patent law is one of the better bets.
  • by scc4fun on 8/24/11, 11:49 PM

    The OWASP Top 10 Security Vulnerabilities.