So I’m not a computer science major, but I figured it would be enjoyable to go through this list and see where I might have gaps in my knowledge. Matt also says that it would be a good self-study guide, which makes it easy to always go back to re-evaluate what you can learn next.

Things I know/have

Navigating Unix
- emacs/vim editing
- Makefile for a project
- shell scripts
- 5 folders consuming most space in directory
- capitalizing names in command line
- replace spaces with underscores within directory

- install Linux distro
- configure and compile Linux kernel
- set up web server (nginx)

Programming Languages
- C, I can program C halfassed, but I have been spending time with Rust and learning how complicated and difficult C actually is, when doing it properly
- Javascript, semantic web yay!
- Scala/Java, I somewhat know these, but not enough to be dangerous
- Haskell, definitely a growing interest in learning this as my only functional language, oh apparently it’s a Hindley-Milner type
- Assembly, I love learning about compilers and groking the low level stuff
- generative programming (macros)
- lexical and dynamic scope

Discrete math
- trees
- graphs
- automata
- proofs
- crypoto protocols, fun stuff!

Data structures & algos
- greedy vs dynamic, designing algos
- hash tables
- linked lists
- trees
- directed/undirect graphs
- imperative and functional versions

- bounding a problem
- finding the complexity
- regex
- Turing machines
- lambda calculus

- transistors, gates, adders, muxes, flip flops, ALU, cache, RAM
- GPU model as well
- hardware memory management
- design an implement a CPU, definitely done this one

Operating Systems
- filesystems
- resource management
- I don’t know much here…

- social engineering
- buffer overflows
- integer overflow
- race conditions (that’s racist!)
- iptables firewall
- password selection

- network protocol standards, IPv4 IPv6, DNS, SMTP, DNS
- HTTP client and daemon
- wireshark sniffing
- packet collision resolution

- symmetric key system
- public-key system
- hash functions
- salt and hash passwords
- acquire sufficiently random number
- implement RSA
- web client that connects over SSL

Software testing
- test cases for everything!

User experience design
- interfaces to make executing task easier, depending on frequency of the task and importance

- Tufte!

Software Engineering
- working in a group, collab with version control
- going through a large codebase with a team, being both leader and follower

Things I don’t know

Okay that was a fun list, will have to revisit this in the future to see what more I learn, and what more I should learn. I think it’s not too shabby for somebody who isn’t a computer scientist.