Nov 10, 2020 ▪ 18 min read (~2 pages) ▪ Updated on Oct 05, 2022

This is an evolving list with learning material and recommended programming languages for computer science students. It works well on its own (for self-learners) or in addition to an undergraduate degree in computer science (or related field). The goal is to provide a solid foundation to build upon, degree or no degree. It will be updated to fix broken links and to keep learning material up to date. If you are interested in computer science and engineering (and have plenty of time to spare), see github.com/michaelsjoeberg/the-ultimate-computer-science-and-engineering-curriculum.

Programming is the most important skill in computer science and computational problem solving and should be the primary focus of any computer science curriculum (with use cases in computer systems, application software development, theorem proving, and so on). If you prefer to work on projects while learning, see github.com/tuvtran/project-based-learning.

The goal is to get comfortable with programming and to understand the software abstraction model (via Python, C, and Assembly; high-level to low-level, with Python representing the highest-level of abstraction). You most likely don't need to be fluent in any Assembly language (they are mostly compilation targets), but to be able to read and find errors in assembly generated by smaller programs is probably a good idea.

- Get proficient or fluent (very powerful programming language with a lot of support, look at some numerical libraries as well, especially NumPy)
- Try to implement an interpreter; see Let’s Build A Simple Interpreter
**Bonus:**Try to implement game of life; see Programming Projects for Advanced Beginners #2: Game of Life.

- Learn basics of memory allocation and pointers; try to understand the assembly code generated for smaller programs (gcc -S option)
- Get familiar with C++ (could also get proficient or fluent if appropriate)

- x86, ARM (could also explore other architectures if more appropriate); see x86 Assembly Guide and ARM Hardware and Assembly Language
- Get familiar with registers; see x86 Assembly/X86 Architecture

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 programmer in general. A few notes on programming languages: Python and C (and C++) are considered multi-paradigm (as in supporting more than one style), and more specifically: imperative and structured.

- Functional

- Declarative and probably most popular logic-based programming language
**Bonus:**Get familiar with Coq (one of the most popular theorem provers); see Coq in a Hurry

- Hardware description language; probably most popular language to design and verify digital systems
**Bonus:**Try to implement designs at different abstraction levels (gate-level, register-transfer-level, behavioral-level); see Verilog Tutorial

Recommended learning material:

- Thinking Functionally with Haskell
- The Elements of Computing Systems
- Structure and Interpretation of Computer Programs

The goal is to get exposed to machine learning and the idea that output is based on data instead of design, watch this talk by Andrej Karpathy (former director of AI at Tesla): Building the Software 2.0 Stack.

- Get familiar with Scikit-learn, PyTorch, and TensorFlow (or any other similar framework if more appropriate)
**Bonus:**Try to build a neural network from scratch; see How to build your own Neural Network from scratch in Python

Recommended learning material:

The above topics provides familiarity with different paradigms and modern developments (such as ML). Below are few more programming languages to consider, somewhat based on the "most loved" programming languages: Stack Overflow Developer Survey 2020.

- Natural transition from C++, could also explore Scala if more familiar with Java, backed by Mozilla
**Bonus:**Try to build an operating system; see Writing an OS in Rust

- Lisp-like, could also explore Lisp if more appropriate

- Python-like but compiled

- Probably most popular language for Android development (see Kotlin is now Google's preferred language for Android app development), compiles to JVM and JavaScript (could also explore Lua if interested in embedded applications or game development)

- Memory safe C (if you don't like Rust, could also explore Dart), backed by Google

Mathematics has a central role in any computer science curriculum and a solid foundation in selected mathematical topics can be highly valuable, especially in more advanced computing tasks (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.

- Get familiar with sets, permutations, trees, graphs, and related concepts
**Bonus:**Try to implement common algorithms in different programming languages (optimize based on different conditions); see The Algorithms

- Learn basics of probability distributions and conditionality; see Khan Academy: Statistics and probability
**Bonus:**Try to implement concepts based on random processes (such as MDP solver, see aimacode), could also explore game theory if more appropriate

Recommended learning material:

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, ML, computer vision, and scientific computing.

- Get familiar with derivatives and anti-derivatives, multivariable derivatives, and vector calculus
**Bonus:**Learn basics of partial derivatives, Jacobian computations, and relevant optimization techniques

- Get familiar with vectors, spaces, matrix transformations, and related concepts (get fluent if interested in computer vision)
**Bonus:**Implement inverse, determinant, and transpose in some programming language

- Learn basics of first-order, second-order, and partial differential equations

- Get familiar with topics in number theory (any interesting); see List of number theory topics
**Bonus:**Try to solve computational problems; see Project Euler

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, somewhat based on the "missing semester" at MIT, see The Missing Semester of Your CS Education.

The goal is to get comfortable with version control and working with computer systems (in the context of programming).

- Probably most common version control system

- Domain-specific command language (Unix shell); get familiar with frequently used commands at Bash scripting cheatsheet

It is also a good idea to get familiar with virtual machines, such as Vagrant or Docker, build systems, such as Make, and parallel computing (if appropriate), such as CUDA or OpenCL.

The goal is to get familiar with web technologies and to develop a basic website.

- Event-driven programming language (control flow based on events)
- Get proficient if you want to work in web development; see JavaScript

Finally, it is probably a good idea to get used to working with cloud platforms, such as AWS or Google Cloud, and notebooks, such as Jupyter (Python), which is a very popular web-based development environment for ML and deep learning.