1. http://matt.might.net/articles/what-cs-majors-should-know/
2. build a portfolio
2.1. publicly browsable code
2.2. per-project page
2.3. github or Google code
3. Technical communication
4. An engineering core
4.1. physics through electromagnetism
4.2. take up through multivariate calculus
4.3. differential equations
4.4. probability
4.5. linear algebra
4.6. statistics
5. The Unix philosophy
5.1. emphasizes linguistic abstraction and composition in order to effect computation
5.2. command-line computing
5.3. IDE-less software development
5.4. text-file configuration
5.5. recommendations
5.5.1. navigate and manipulate the filesystem
5.5.2. compose processes with pipes
5.5.3. comfortably edit a file with emacs and vim
5.5.4. create, modify and execute a Makefile for a software project
5.5.5. write simple shell scripts
6. Systems administration
6.1. Install and administer a Linux distribution
6.2. Configure and compile the Linux kernel
6.3. Troubleshoot a connection with dig, ping and traceroute
6.4. Compile and configure a web server like apache
6.5. Compile and configure a DNS daemon like bind
6.6. Maintain a web site with a text editor
6.7. Cut and crimp a network cable
7. Programming languages
7.1. best way to learn how to learn progamming languages is to learn multiple programming languages and programming paradigms
7.2. difficulty of learning the nth language is half the difficulty of the (n-1)th
7.3. every computer science major should implement an interpreter
7.4. Ideally, every computer science major would take a compilers class
7.5. specific languages
7.5.1. Racket (dialect of Lisp)
7.5.2. C
7.5.3. Javascript
7.5.4. Squeak
7.5.5. Java
7.5.6. Satandard ML
7.5.7. Prolog
7.5.8. Scala
7.5.9. Haskell
7.5.10. C++
7.5.11. Assembly
7.6. recommendations
7.6.1. generative programming (macros)
7.6.2. lexical (and dynamic) scope
7.6.3. closures
7.6.4. continuations
7.6.5. higher-order functions
7.6.6. dynamic dispatch
7.6.7. subtyping
7.6.8. modules and functors
7.6.9. monads as semantic concepts distinct from any specific syntax
8. Discrete mathematics
8.1. formal mathematical notation
8.2. sets
8.3. tuples
8.4. sequences
8.5. functions
8.6. power sets
8.7. trees
8.8. graphs
8.9. formal languages
8.10. automata
8.11. learn enough number theory to study and implement common cryptographic protocols
9. Data structures and algorithms
9.1. how to design algorithms
9.1.1. greedy
9.1.2. dynamic strategies
9.2. know both the imperative and functional versions of each algorithm
9.3. hash tables
9.4. linked lists
9.5. trees
9.6. binary search trees
9.7. directed and undirected graphs
10. Theory
10.1. Computational complexity
10.1.1. understand the difference between P, NP, NP-Hard and NP-Complete
10.2. models of computation
10.2.1. finite-state automata
10.2.2. regular languages (and regular expressions)
10.2.3. pushdown automata
10.2.4. context-free languages
10.2.5. formal grammars
10.2.6. Turing machines
10.2.7. lambda calculus
10.2.8. undecidability
11. Architecture
11.1. understand a computer from the transistors up
11.2. standard levels of abstraction
11.2.1. transistors
11.2.2. gates
11.2.3. adders
11.2.4. adders
11.2.5. flip flops
11.2.6. ALUs
11.2.7. control units
11.2.8. caches
11.2.9. RAM
11.3. GPU model of high-performance computing
11.4. recommendations
11.4.1. design and simulate a small CPU
12. Operating systems
12.1. recommendations
12.1.1. print "hello world" during the boot process
12.1.2. design their own scheduler
12.1.3. modify the page-handling policy
12.1.4. create their own filesystem
12.2. kernel
12.2.1. system calls
12.2.2. paging
12.2.3. scheduling
12.2.4. context-switching
12.2.5. filesystems
12.2.6. internal resource management
13. Networking
13.1. network stack and routing protocols within a network
13.2. mechanics of building an efficient, reliable transmission protocol (like TCP) on top of an unreliable transmission protocol (like IP)
13.3. understand the trade-offs involved in protocol design--for example, when to choose TCP and when to choose UDP
13.4. understand exponential back off in packet collision resolution and the additive-increase multiplicative-decrease mechanism involved in congestion control
13.5. recommendations
13.5.1. protocols
13.5.1.1. 802.3 and 802.11
13.5.1.2. IPv4 and IPv6
13.5.1.3. DNS, SMTP and HTTP
13.5.2. implement
13.5.2.1. an HTTP client and daemon
13.5.2.2. a DNS resolver and server
13.5.2.3. a command-line SMTP mailer
13.5.3. network sniffing w wireshark
14. Security
14.1. social engineering
14.2. buffer overflows
14.3. integer overflow
14.4. code injection vulnerabilities
14.5. race conditions
14.6. privilige confusion
15. Cryptography
15.1. Understand
15.1.1. symmetric-key cryptosystems
15.1.2. public-key cryptosystems
15.1.3. secure hash functions
15.1.4. challenge-response authentication
15.1.5. digital signature algorithms
15.1.6. threshold cryptosystems
15.2. recommendations
15.2.1. breaking ciphertext using pre-modern cryptosystems with hand-rolled statistical tools
15.2.2. implemment RSA
15.2.3. create their own digital certificate and set up https in apache
15.2.4. write a console web client that connects over SSL
15.2.5. know how to use GPG
15.2.6. know how to use public-key authentication for ssh
15.2.7. know how to encrypt a directory or a hard disk
16. Software testing
17. User experience design
18. Visualization
19. Parallelism
19.1. architecture
19.1.1. multicore
19.1.2. caches
19.1.3. buses
19.1.4. GPUs