November 04, 2020

Genetic Algorithm Optimization in PythonNovember 02, 2020

Basics and Other in C++October 24, 2020

Summation of Primes in PythonNovember 10, 2020 ▪ 4 min read Computer Science / Education

This is a work-in-progress list with recommended programming languages and other topics for computer science students. It works well on its own (for self-learners) or in addition to a typical computer science degree. The goal is mainly to provide a more solid foundation to build upon. It will be updated whenever I feel something is missing or to add additional learning resources.

Programming is the main theme of most tasks related to computer science and computational problems, and should be the main theme of any computer science education (with different applications in computer systems, application software, and so on). It's not just a tool, but a way of thinking. If you prefer to work on projects while learning, get ideas at github.com/tuvtran/project-based-learning.

Goal is to get comfortable with programming and to understand the general computer abstraction model (via Assembly, C, and Python), very few people need to write in Assembly, but should be able to read and debug. Recommended learning material: Computer Systems: A Programmer's Perspective, C Programming Language, A Tour of C++, Python Crash Course.

**Assembly**

- 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 x64 Cheat Sheet

**C/C++**

- Learn basics and get familiar with memory allocation

- Get familiar with significant changes in C++ (could also explore C++ further if appropriate, try to understand first bitcoin version at github.com/michaelsjoeberg/bitcoin-alpha)

**Python**

- Get fluent (look at common numerical libraries as well, especially NumPy, maybe Pandas)

- Try to implement game of life; see Programming Projects for Advanced Beginners #2: Game of Life

- Try to implement an interpreter; see Let’s Build A Simple Interpreter

- Explore Cirq (quantum library, maybe also TensorFlow Quantum)

Goal is to get familiar with different programming paradigms. Recommended learning material: Thinking Functionally with Haskell.

**Haskell**

- Functional

- Try to build a compiler, transpiler, or parser; see Building a modern functional compiler from first principles

**Verilog**

- Structured

- Probably most common hardware description language; see Verilog Tutorial

**Coq** (Gallina)

- Dependently typed functional

- Probably most popular proof assistant; see Coq in a Hurry

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. Recommended learning material: The Hundred-Page Machine Learning Book.

**Neural Networks**

- Get familiar with Keras, TensorFlow, PyTorch; try challenges at Kaggle: Competitions

- Try to build a neural network from scratch; see How to build your own Neural Network from scratch in Python

The above topics provides a strong foundation and familiarity with different paradigms and modern developments (such as ML). Below is a few additional programming languages to consider, somewhat based on the "most loved" programming languages -- Stack Overflow Developer Survey 2020. Note that completing the selected topics are not a strict requirement, always switch to a more interesting topics whenever finding one. Experimentation is good.

**Rust** (backed by Mozilla)

- Natural transition from C++

- Try to build an OS: see Writing an OS in Rust

**Clojure**

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

**Nim**

- Multi-paradigm, very neat syntax (could also explore Lua if more appropriate)

**Kotlin**

- JVM, could also explore *Script languages (maybe TypeScript)

**Go** (backed by Google)

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

These are optional, but useful or interesting in its own.

**Prolog**

- Probably most popular logic-based programming language, could also explore ASP or Clojure.core.logic (relational programming library for Clojure)

**JavaScript**

- Get fluent if ever want to build web applications, could also explore TypeScript if more interesting (or Node.js, Vue.js, React.js, there is also Flask for Python if more appropriate)

Regarding object-oriented programming, a very popular paradigm at universities, citing Paul Graham (Viaweb, Y Combinator) http://www.paulgraham.com/noop.html: "*[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*".

Mathematics is perhaps the other, more boring (or not?) part of programming. However, computer science is applied mathematics, so a solid foundation in relevant mathematical topics is important, especially for more advanced topics.

Goal is to get familiar with data structures and computation, some topics could be covered in learning material for programming languages. Recommended learning resources: Discrete Mathematics.

**Discrete**

- Sets and permutations

- Graphs and related concepts

- Computational complexity (apply to familar algorithms, try to optimise based on different conditions)

**Probability**

- Probability distributions and conditionality; see Khan Academy: Statistics and probability

- Stochastic processes, could also explore game theory if interested in AI applications

Goal is to build a strong general background in mathematics, such as typically taught in first and second-year science programs at most universities. Many topics are useful in several computer-related tasks, in particular ML, computer vision, and scientifc computing. Recommended learning material: Calculus: Early Transcendentals, No bullshit guide to linear algebra, Ordinary Differential Equations, Elementary Analysis: The Theory of Calculus, Number Theory.

**Calculus**

- Derivatives and antiderivatives, multivariable, vector calculus

- Get familiar with partial derivatives, Jacobian, and relevant optimization techniques

**Linear Algebra**

- Vectors and spaces, matrix transformations

- Get familar with inverse, determinant, and transpose (especially if interested in computer vision)

**Differential Equations**

- First and second-order, partial differential equation

**Number Theory** (if relevant)

- Get familiar with using computers and programming to solve numerical problems; try problems at Project Euler

This section contains additional topics and tools, typically not in a degree, but commonly used in the industry. It's somewhat based on the "missing semester" by MIT -- The Missing Semester of Your CS Education.

**Git**

- Probably most common version control system (could also explore Subversion, but not sure how useful)

**Bash**

- Get familiar with frequently used commands at Bash scripting cheatsheet

It's also a good idea to get familiar with virtual machines, such as Vagrant or Docker, build systems, such as Make, and cloud computing platforms, such as AWS or Google Cloud. Finally, getting used to working with notebooks is probably a good idea, such as Jupyter for Python, which is the de-facto development environment for ML and deep learning.

**EDIT (November 11, 2020): Added learning material for Linear Algebra.**