1. Systems administration
1.1. Install and administer a Linux distribution
1.2. Configure and compile the Linux kernel
1.3. Troubleshoot a connection with dig, ping and traceroute
1.4. Compile and configure a web server like apache
1.5. Compile and configure a DNS daemon like bind
1.6. Maintain a web site with a text editor
1.7. Cut and crimp a network cable
2. http://matt.might.net/articles/what-cs-majors-should-know/
3. Data structures and algorithms
3.1. how to design algorithms
3.1.1. greedy
3.1.2. dynamic strategies
3.2. know both the imperative and functional versions of each algorithm
3.3. hash tables
3.4. linked lists
3.5. trees
3.6. binary search trees
3.7. directed and undirected graphs
4. Programming languages
4.1. best way to learn how to learn progamming languages is to learn multiple programming languages and programming paradigms
4.2. difficulty of learning the nth language is half the difficulty of the (n-1)th
4.3. every computer science major should implement an interpreter
4.4. Ideally, every computer science major would take a compilers class
4.5. specific languages
4.5.1. Racket (dialect of Lisp)
4.5.2. C
4.5.3. Javascript
4.5.4. Squeak
4.5.5. Java
4.5.6. Satandard ML
4.5.7. Prolog
4.5.8. Scala
4.5.9. Haskell
4.5.10. C++
4.5.11. Assembly
4.6. recommendations
4.6.1. generative programming (macros)
4.6.2. lexical (and dynamic) scope
4.6.3. closures
4.6.4. continuations
4.6.5. higher-order functions
4.6.6. dynamic dispatch
4.6.7. subtyping
4.6.8. modules and functors
4.6.9. monads as semantic concepts distinct from any specific syntax
5. Discrete mathematics
5.1. formal mathematical notation
5.2. sets
5.3. tuples
5.4. sequences
5.5. functions
5.6. power sets
5.7. trees
5.8. graphs
5.9. formal languages
5.10. automata
5.11. learn enough number theory to study and implement common cryptographic protocols
6. build a portfolio
6.1. publicly browsable code
6.2. per-project page
6.3. github or Google code
7. User experience design
8. Visualization
9. Cryptography
9.1. Understand
9.1.1. symmetric-key cryptosystems
9.1.2. public-key cryptosystems
9.1.3. secure hash functions
9.1.4. challenge-response authentication
9.1.5. digital signature algorithms
9.1.6. threshold cryptosystems
9.2. recommendations
9.2.1. breaking ciphertext using pre-modern cryptosystems with hand-rolled statistical tools
9.2.2. implemment RSA
9.2.3. create their own digital certificate and set up https in apache
9.2.4. write a console web client that connects over SSL
9.2.5. know how to use GPG
9.2.6. know how to use public-key authentication for ssh
9.2.7. know how to encrypt a directory or a hard disk
10. Security
10.1. social engineering
10.2. buffer overflows
10.3. integer overflow
10.4. code injection vulnerabilities
10.5. race conditions
10.6. privilige confusion
11. Theory
11.1. Computational complexity
11.1.1. understand the difference between P, NP, NP-Hard and NP-Complete
11.2. models of computation
11.2.1. finite-state automata
11.2.2. regular languages (and regular expressions)
11.2.3. pushdown automata
11.2.4. context-free languages
11.2.5. formal grammars
11.2.6. Turing machines
11.2.7. lambda calculus
11.2.8. undecidability
12. Architecture
12.1. understand a computer from the transistors up
12.2. standard levels of abstraction
12.2.1. transistors
12.2.2. gates
12.2.3. adders
12.2.4. adders
12.2.5. flip flops
12.2.6. ALUs
12.2.7. control units
12.2.8. caches
12.2.9. RAM
12.3. GPU model of high-performance computing
12.4. recommendations
12.4.1. design and simulate a small CPU
13. The Unix philosophy
13.1. emphasizes linguistic abstraction and composition in order to effect computation
13.2. command-line computing
13.3. IDE-less software development
13.4. text-file configuration
13.5. recommendations
13.5.1. navigate and manipulate the filesystem
13.5.2. compose processes with pipes
13.5.3. comfortably edit a file with emacs and vim
13.5.4. create, modify and execute a Makefile for a software project
13.5.5. write simple shell scripts
14. An engineering core
14.1. physics through electromagnetism
14.2. take up through multivariate calculus
14.3. differential equations
14.4. probability
14.5. linear algebra
14.6. statistics
15. Parallelism
15.1. architecture
15.1.1. multicore
15.1.2. caches
15.1.3. buses
15.1.4. GPUs
15.2. CUDA
15.3. OpenCL
15.4. map-reduce
16. Software engineering
16.1. version control
16.2. debugging tools
17. Formal methods
17.1. be at least moderately comfortable using one theorem prover
18. Graphics and simulation
18.1. Simple ray tracers can be constructed in under 100 lines of code
18.2. Data structures like BSP trees and algorithms like z-buffer rendering are great examples of clever design
18.3. It's good mental hygiene to work out the transformations necessary to perform a perspective 3D projection in a wireframe 3D engine
19. Databases
19.1. Relational algebra
19.2. relational calculus
20. Machine learning
20.1. Bayesian networks
20.2. clustering
20.3. decision-tree learning
21. Technical communication
22. Operating systems
22.1. recommendations
22.1.1. print "hello world" during the boot process
22.1.2. design their own scheduler
22.1.3. modify the page-handling policy
22.1.4. create their own filesystem
22.2. kernel
22.2.1. system calls
22.2.2. paging
22.2.3. scheduling
22.2.4. context-switching
22.2.5. filesystems
22.2.6. internal resource management
23. Software testing
24. Networking
24.1. network stack and routing protocols within a network
24.2. mechanics of building an efficient, reliable transmission protocol (like TCP) on top of an unreliable transmission protocol (like IP)
24.3. understand the trade-offs involved in protocol design--for example, when to choose TCP and when to choose UDP
24.4. understand exponential back off in packet collision resolution and the additive-increase multiplicative-decrease mechanism involved in congestion control
24.5. recommendations
24.5.1. protocols
24.5.1.1. 802.3 and 802.11
24.5.1.2. IPv4 and IPv6
24.5.1.3. DNS, SMTP and HTTP
24.5.2. implement
24.5.2.1. an HTTP client and daemon
24.5.2.2. a DNS resolver and server
24.5.2.3. a command-line SMTP mailer
24.5.3. network sniffing w wireshark