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.
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).
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)
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.
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.
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.
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.