November 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.
Goal is to get familiar with different programming paradigms. Recommended learning material: Thinking Functionally with Haskell.
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.
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)
Go (backed by Google)
These are optional, but useful or interesting in its own.
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.
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.
Number Theory (if relevant)
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.
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.