I have this conversation with a lot of friends so I figured I’d collect my favorite resources somewhere so that I can just pass around a list. This is targeted at people who did not/do not intend to do a CS major in undergrad, and who are interested in learning more as a hobby or to get a job.

The hardest problem in computer science is learning how to enjoy it.

It’s worth noting that there’s a differcence between “computer science” and “software development” — one is more science/pursuit of knowledge and the other is more about building things and working in teams to create business value.

The job title “Software Engineer” means a lot of things. You could be maintaining websites (frontend/backend/devops) or native applications (not that common in the US anymore, as far as I can tell?) or working on embedded devices or doing applied statistics machine learning things.

So, here are some resources for learning. The most important thing is to find what you enjoy, and find how to use that to learn about computers.

Matt Might, a cool CS professor, has this list of What every computer science major should know. I looked at it before college and after college; it’s a good overview of what “computer science” means. I don’t think you need to know everything on it, but you can use it to get an overview of what exists in the field from a more academic “what can I learn about” perspective.

Here’s all of the section headers, with short thoughts from me.

  1. “Technical communication” - how can you communicate technical concepts effectively?
  2. “An engineering core” - imo not needed if you’re going into pure tech
  3. “The Unix philosophy” - start using linux. grab a digital ocean server and use it to host a bot for discord/telegram. (disclaimer: that’s a referral link.)
  4. “Systems administration” - start using linux. try this “wargame”.
  5. “Programming languages” - just learn a little bit of a bunch of em! but a lot of one of them.
  6. “Discrete mathematics” - good to explore if you like cryptography. Intro textbook.
  7. “Data structures and algorithms” - you need some basics (what’s a stack, what’s a queue) and a lot of job interviews today test this knowledge.
  8. “Theory” - what are the limits of what we can compute? what are the foundations of computer science (alan turing)
  9. “Architecture” - as in computer. google FPGA and see if that’s interesting to you. klatz.co/blog/fpga-stepmania
  10. “Operating systems” - write your own tiny operating system! jvns.ca/categories/kernel
  11. “Networking” - how does wifi really work? how do you fix network problems? how does the internet work?
  12. “Security” - hello (I have lots of thoughts about this field. dm me.)
  13. “Cryptography” - how do you transmit messages such that nobody else but the intended recipient can read them?
  14. “Software testing” - how can you be sure your code works?
  15. “User experience design” - is your application well-designed? intuitive? easy to use?
  16. “Visualization” - Data science / big data / design & visual communication skills.
  17. “Parallelism” - using graphics cards to run a lot of high performance code for specific tasks.
  18. “Software engineering” - git, managing humans, managing complexity.
  19. “Formal methods” - math-y formal verification that a program is correct.
  20. “Graphics and simulation” - a super cool field with lots of cute tricks and hacks. my favorite
  21. “Robotics” - hard to get into w/o a phd.
  22. “Artificial intelligence” - meme-y, basically applied statistics. we’re throwing it into our critical infrastructure and using it for content moderation which makes a lot of business sense but is scary. probably a really good thing to learn though (the large tech companies have bet on it).
  23. “Machine learning” - as above. not really a science — we just try things without really understanding why tweaking the parameters in this way works.
  24. “Databases” - how do you store lots of data? with redundancy? very generally useful for jobs @ places that need websites.

Glitch is a cool way to explore HTML/CSS/JS in a snazzy editor [and that encourages you to “remix” and try new things. It spun off of Fog [Creek, who I think made Stack Overflow and Trello.

egghead.io looks like a cool and very genuine business [that strives to produce good educational content.

CodeNewbie is an organization that focuses on non- [traditional routes into coding jobs. Their base.cs podcast covers basic computer science concepts in an aggressively friendly manner. There’s a text version as well.

A friend recommended datacamp.com for learning about data science.

Tom Scott’s “The Basics” series on YouTube look really well done. My favorite is a clear explanation of how to find the longest word you can write on a 7-segment display.

Here’s a good checklist of things worth doing if you’re gunning for web-y stuff at ~most of the hip web companies~

Here’s a good list of technical project ideas for security.

Pick up one book that you’re interested in and stick with it for at least a hundred pages. The best way to learn is by doing, so type out every example, until you feel that you know enough to make your own small project.

Keep things tiny at first! Small successes help you feel good about yourself, and pile up until you’re an expert at something. Then, harder things are like breathing.