I took this list from What CS majors should know.
I think it is fun to list things I don't know so I did it =D. I actually found it to be a cool exercise -- maybe I should do a fun graphics project and learn about Open GL!
i wrote this because, while i think the things on this list are potentially worth knowing, and I actually think it's an awesome list of project ideas as well as good food for thought for people developing CS curricula (many of the things I don't know are great exercises!) -- I thought it was really weird to say that every CS student should know all of them. I have a CS degree and I learned very few of the things I do know inside my degree.
I classify "do know" as anything that I have a reasonable grasp of or at least some basic experience with -- the kind of experience I'd expect a CS student to be able to get. If I say I don't know something, it means either I know pretty much nothing about it (for "graphics", I have never written a graphics program), or that I haven't ever had the need to do the specific task that Might suggests, ("compile a Linux kernel")
things I don't know:
- Every computer scientist should be at least moderately comfortable using one theorem prover.
- Graphics and simulation
- how to program C properly (I can write it improperly!)
- Smalltalk, Prolog
- understanding of the GPU model of high-performance computing
- Computer scientists should understand a computer from the transistors up.
- students should learn CUDA and OpenCL.
- be able to implement the following cryptography algorithms, as well as the common pitfalls in doing so: [long list of algorithms]
specific tasks that he suggests that I have never done:
- how to properly configure a firewall with iptables.
- MPI is a prerequisite.
- RSA is easy enough to implement that everyone should do it
- Student should also write a console web client that connects over SSL.
- Every student should create their own digital certificate and set up https in apache.
- use a centralized version control system like svn
- Configure and compile the Linux kernel, Compile and configure a DNS daemon like bind, Cut and crimp a network cable
- every computer science major should implement an interpreter
things I do know:
- how to acquire a sufficiently random number for the task at hand (sorta)
- how to salt and hash passwords for storage
- how to use GPG; (barely)
- how to use public-key authentication for ssh;
- how to encrypt a directory or a hard disk.
- Software testing.
- .. every programmer should be comfortable with designing usable web interfaces in HTML, CSS and JavaScript. (I can hack things together that mostly work)
- map-reduce
- distributed version control systems like git.
- A working knowlege of debugging tools like gdb and valgrind
- every computer scientist should grasp the fundamentals of machine learning.
- Bayesian networks, clustering and decision-tree learning.
- how to set up a LAMP stack
- multivariate calculus, (and differential equations for good measure).
- linear algebra
- fluent in basic Unix, Troubleshoot a connection with dig, ping and traceroute.
- Maintain a web site with a text editor. (but, I feel compelled to interject, I strive to not do that)
- Install and administer a Linux distribution.
- how to program C improperly
- the basics of a bunch of programming languages
- generative programming (macros); lexical (and dynamic) scope; closures; continuations; higher-order functions; dynamic dispatch; subtyping; modules and functors; and monads as semantic concepts distinct from any specific syntax.
- enough number theory to study and implement common cryptographic protocols
- a solid grasp of formal logic and of proof. fluent in formal mathematical notation, and in reasoning rigorously about the basic discrete structures: sets, tuples, sequences, functions and power sets.
- how to design algorithms
- finite-state automata, regular languages (and regular expressions), pushdown automata, context-free languages, formal grammars, Turing machines, the lambda calculus, and undecidability.
- the difference between P, NP, NP-Hard and NP-Complete.
- how to write an interpreter
- how to use wireshark
- how kernels handle system calls, paging, scheduling, context-switching, filesystems and internal resource management. (at a basic level, at least. certainly i would like to know more about these things.)
- some security basics
- (some of) the fundamental data structures and algorithms that power a database engine