1. Introduction

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.

2. Programming

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.

2.1 Foundation

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.

Python

C

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

Assembly

Recommended learning material:

2.2 Paradigm exposure

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.

Haskell

  • Functional

Prolog

  • 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

Verilog

  • 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:

2.3 Machine learning

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.

Neural Networks (Python)

Recommended learning material:

2.4 "Modern" languages

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.

Rust

  • 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

Clojure

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

Nim

  • Python-like but compiled

Kotlin

Go

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

3. Mathematics

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

3.1 Basics

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

  • 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

Probability

  • 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:

3.2 General topics

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.

Calculus

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

Linear Algebra

  • 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

Differential Equations

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

Number Theory

Recommended learning material:

4. Other skills

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.

4.1 Systems

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

Git

  • Probably most common version control system

Bash

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.

4.2 Web technologies

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

JavaScript

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