simshadows

Sim's Programming Learner's Checklist

Currently an early work in progress. This list sucks right now, and honestly, it's a lot harder to write than I thought, but I'm gonna keep trying to figure it out!

If you want a comprehensive background as a computing professional, you should look into everything in this checklist (unless it's optional or otherwise stated). This list is primarily targeted at self-learners who are not going the traditional route through university computer science and would like to be able to easily check whether the learning resources they find is on the right track.

Programming Fundamentals

Side-note: This section assumes your first programming language is an imperative language. If you don't know what I mean by that, then you are almost certainly using an imperative language. You will likely be told by your instructor/book if your language is a functional language.

C Language Fundamentals

Chances are, the language you started with has made things very convenient for you. I think that every serious programmer should eventually try learning how to use C because C doesn't hold your hand (nearly as much). C will give you so much appreciation for all the bells and whistles other languages give you and give you a more critical understanding of algorithm and data structure performance. Additionally, good C programming requires the programmer to be aware of a few more very useful lower-level concepts, so C is a great context in which to learn about them.

C is also a great stepping stone into learning C++ and is somewhat necessary to learn about operating systems, digital circuits, computer architecture, compilers, and many security topics.

I very highly recommend learning C as your first language if you can, though it's understandably not for everyone because it's a very tedious language to work with. If you don't like it, there's no harm in holding it off for later when you're more motivated.

System-Level Fundamentals

While you might be able to get away with ignoring the system-level stuff, it gives you a stronger intuition around abstraction in computing while greatly expanding your toolset for solving problems in computing (such as optimizing your code's memory access patterns to improve performance).

Essential Miscellany

This section is about all the random little things that you should know about that don't neatly fall under any of the other sections. Some of these topics are quite essential: everyone must know how to work with a terminal, use version control, and write regular expressions. Others, you might find you really like using in your day-to-day work, like vim and Docker.

But at the very least, you should be aware of everything in this section to keep at the back of your mind. It all gives you so much background behind everything to do with computers, and they expand your toolset for solving problems.

References and further reading:

Mathematics

No, you technically don't need all that advanced university calculus and algebra, but there is some very unavoidable mathematics that you do need to be a great programmer.

Data Structures and Algorithms

Core topics:

Optional further topics that I recommend looking into to further expand your perspective on how these concepts can be applied:

Optional advanced topics:

Want some programming practice? Here are my recommendations:

Object Oriented Programming

Networking

Web Development, Databases, and Web Security

Optional further reading:

Operating Systems

[OPTIONAL] Pure Functional Programming Fundamentals

Not gonna lie, I haven't breached this topic myself, but I expect it to be great for expanding your understanding (and breaking down your assumptions) of what programming languages can look like and do. You can get away with never trying pure functional for your whole career, but it may be worth it anyway. Considering that this is a topic I'm unfamiliar with, take my comments on this with a grain of salt.

[OPTIONAL] Further Mathematics

Going above and beyond with math is a great asset for a programmer, giving you practice in thinking abstractly, and giving you a foundation in modelling all sorts of phenomena. On top of that, some things really do require the advanced stuff, namely calculus and linear algebra for computer graphics work and machine learning.

[OPTIONAL] Cloud, Containers, and Container Orchestration

Highly recommended to look into this if you're interested in web development.

[OPTIONAL] Compilers and Interpreters

[OPTIONAL] Artificial Intelligence and Machine Learning

[OPTIONAL] Computer Graphics, Physics, and Game Development

[OPTIONAL] Digital Circuits, Computer Architecture, and Custom Hardware Acceleration

I'm actually not entirely sure how to approach listing out for these topics. It probably may as well be its own big checklist, including topics on electrical circuit analysis and transistors. Feels too big to treat it as simply another section of this programmer's checklist.


[OPTIONAL] Programming Languages

Python

C++

Be warned: C++ is a massive beast of a language that's very different to most popular imperative languages such as Javascript or Python. While you can probably still go quite far without knowing how manual memory management works, neglect it for too long and you'll eventually meet perplexing bugs, mysteriously terrible performance, and deeply flawed software design. It is very easy to shoot yourself in the foot here. That's not to say you shouldn't learn C++ or Rust though because they take a very different approach to most mainstream languages that will greatly expand your understanding of what a programming language can do and the performance tradeoffs under the hood of many languages.

But of course, C++ isn't just an educational language. It's a highly practical language for writing high-performance software or highly-constrained computing (such as embedded systems), and is also quite widely used in game development and competitive programming. And once you get comfortable with the language, it's honestly 99% as easy to use as Java (at least, if we ignore importing, linking, and dependency management...). It's a very rewarding and fun language to get used to.

While I don't consider C to be a strict prerequisite, I very highly recommend learning C and doing a wide range of data structures and algorithms exercises in C before starting C++. Doing all sorts of HackerRank exercises and such is amazing for drilling in the most critical concepts in C++. But if you don't want to go the C route, you can still learn everything you need starting with C++ (and that knowledge should actually carry to C if you ever need to do C).


Acknowledgements

To help me compile this list, I borrowed from a bunch of sources: