Skip to content

Instantly share code, notes, and snippets.

@adragomir
Forked from jvns/things_i_don't_know.md
Created July 10, 2017 22:21
Show Gist options
  • Save adragomir/53b8d84f283ffdff372d40f1a0667371 to your computer and use it in GitHub Desktop.
Save adragomir/53b8d84f283ffdff372d40f1a0667371 to your computer and use it in GitHub Desktop.

things I don't know

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment