Nov 10, 2020 (updated: Jun 13, 2021) ▪ 16 min read
This is a work-in-progress list with recommended learning material and programming languages for computer science students. It works well on its own (for self-learners) or as a complement to the typical undergraduate degree in computer science, which is often lacking some lower-level details and mathematical content. The goal is to provide a more solid foundation to build upon. This list will be updated whenever I find that something is missing, incorrect, or to add additional learning material.
Programming is the constant in most tasks related to computer science and computational problem solving, and should be the primary focus of any computer science curriculum (showcasing different uses in computer systems, application software, and so on). If you prefer to work on projects while learning, get ideas at github.com/tuvtran/project-based-learning.
The goal is to get comfortable with programming and to understand the software abstraction model (via Assembly, C/C++, and Python; low-level to high-level, with Python representing the highest-level of abstraction). You probably don't need to be fluent in Assembly (or any specific architecture), but it's a good idea to understand enough to be able to read and find errors.
Assembly
C/C++
Python
Recommended learning material: Computer Systems: A Programmer's Perspective, The Art of Assembly Language, C Programming Language, A Tour of C++, Python Crash Course.
The goal is to get familiar with a range of programming paradigms, understand parts of the hardware abstraction model (via Verilog), and become a more confident computer scientist in general (via more advanced reading). A few notes on programming languages: C/C++ and Python are considered multi-paradigm (as in supporting more than one style), but more specifically imperative and structured (i.e. there are limited jump instructions, read this: Edgar Dijkstra: Go To Statement Considered Harmful).
Haskell
Prolog
Coq (Gallina)
Verilog
Recommended learning material: Thinking Functionally with Haskell, The Elements of Computing Systems, Structure and Interpretation of Computer Programs.
What about object-oriented programming? This is a quote by Paul Graham (Viaweb, Y Combinator): "[at] big companies, software tends to be written by large (and frequently changing) teams of mediocre programmers. Object-oriented programming imposes a discipline on these programmers that prevents any one of them from doing too much damage", read this: Why Arc Isn't Especially Object-Oriented.
The goal is to get exposed to machine learning and the idea that output is based on data instead of design, watch this: Building the Software 2.0 Stack.
Neural Networks (Python)
Recommended learning material: The Hundred-Page Machine Learning Book.
The above topics provides familiarity with different paradigms and modern developments (such as ML). Below are a few more programming languages to consider, somewhat based on the "most loved" programming languages: Stack Overflow Developer Survey 2020.
Rust (backed by Mozilla)
Clojure
Nim
Kotlin
Go (backed by Google)
Mathematics has a central role in any computer science curriculum. A solid foundation in selected mathematical topics can be highly valuable, especially in more advanced computing (not to mention ML).
The Goal is to get familiar with data structures and theory of computation, these topics could also be covered in recommended learning material for some programming languages.
Discrete Mathematics
Probability Theory
Recommended learning material: Discrete Mathematics, Introduction to Algorithms.
The goal is to build a strong general background in mathematics, such as typically taught in undergraduate science-related degrees. Many topics are useful in several tasks related to computer science, but in particular ML, computer vision, and scientifc computing.
Calculus
Linear Algebra
Differential Equations
Number Theory
Recommended learning material: Calculus: Early Transcendentals, No bullshit guide to linear algebra, Ordinary Differential Equations, Elementary Analysis: The Theory of Calculus, Number Theory.
This section contains additional topics and commonly used tools, it's somewhat based on the "missing semester" by MIT: The Missing Semester of Your CS Education.
Git
Bash
JavaScript
It's also a good idea to get familiar with virtual machines, such as Vagrant or Docker, build systems, such as Make, cloud platforms, such as AWS or Google Cloud, and parallel computing, such as CUDA or OpenCL. Finally, learning basics of working with notebooks is probably a good idea, such as Jupyter (Python), which is a very popular development environment for ML and deep learning.