What every computer science major should know

Get Started. It's Free
or sign up with your email address
What every computer science major should know by Mind Map: What every computer science major should know

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

19.2. CUDA

19.3. OpenCL

19.4. map-reduce

20. Software engineering

20.1. version control

20.2. debugging tools

21. Formal methods

21.1. be at least moderately comfortable using one theorem prover

22. Graphics and simulation

22.1. Simple ray tracers can be constructed in under 100 lines of code

22.2. Data structures like BSP trees and algorithms like z-buffer rendering are great examples of clever design

22.3. It's good mental hygiene to work out the transformations necessary to perform a perspective 3D projection in a wireframe 3D engine

23. Machine learning

23.1. Bayesian networks

23.2. clustering

23.3. decision-tree learning

24. Databases

24.1. Relational algebra

24.2. relational calculus