michael sjoeberg

No BS Computer Science Curriculum

Nov 10, 2020 (updated: Nov 11, 2020) ▪ 14 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.



  • Learn basics and get familiar with memory allocation


  • Get fluent (look at common numerical libraries as well, especially NumPy, maybe Pandas)
  • Explore Cirq (quantum library, maybe also TensorFlow Quantum)

Paradigm exposure

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


  • Functional


  • Structured

Coq (Gallina)

  • Dependently typed functional

Machine learning

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

"Modern" languages

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++


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


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


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

Other languages

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


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


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


  • Sets and permutations
  • Graphs and related concepts
  • Computational complexity (apply to familar algorithms, try to optimise based on different conditions)


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

General topics

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.


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


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


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.


November 11, 2020: Added learning material for Linear Algebra.

Version: 3.0.0