After having tried and failed to learn how to program for many years, I’ve finally found the learning path that works best for me. I’d like to share that path just in case anyone else out there is feeling the same way.
A note before we start: I am by no means a programming expert. I’ve done some programming (obviously) and I feel pretty comfortable with it now, but I am a far cry from a PhD in Computer Science or a trained programming professional. Rather, the point of this article is to describe programming in a way that made sense to me, and might make sense to others. If you are already a programming expert, or are well on your way to learning programming, you will likely get nothing out of this article. If you want to learn programming but are stuck and have no idea how to start, there might be something for you here.
Another thing worth noting is that most of this is not my own ideas. Since I’m an amateur the last thing you probably want to hear is me wax about “programming best principles” or some-such nonsense. Rather this article is made up of bits and pieces I have heard from experts that I have then compiled into a single cohesive piece. With that stuff out of the way, let’s get started.
Our first section, Practical, will just tell you how programming works in order to do things. It won’t mention the more esoteric, academic mumbo-jumbo. I think it’s more important to learn how to do stuff first and figure out how it works later.
The idea behind a program is similar to a factory: it is that you’re taking a set of information (input) and shaping it into something else (output). A website takes site content and turns it into something readable and accessible via the internet. The Uber app takes all the drivers and riders out there and finds a way for them to come together into a marketplace. A videogame takes assets and compiles them into a living, breathing world.
The way that we convert inputs to outputs is via algorithms, the meat and potatoes of programming. Algorithms tell the program what to do with an input in order to make it an output. Usually, algorithms are made up of the following actions: conditionals, loops, and mathematical logic. Okay, really those first two are also mathematical logic, but let me keep things separated to make it easier to understand.
Conditionals are if-then statements. If I get coffee, then I go to work, etc. etc. You can make conditionals very, very complicated. Same goes for loops, which essentially just produce actions given a conditional (aka does something until a conditional is false). Mathematical logic, in the case I’m using it here, is being able to add, subtract, multiply, and divide.
An algorithm can take many forms. A single algorithm can take up an entire file, or just be a little chunk of a file (called a “function”). Large amounts of algorithms can also be simply imported into a file, to save you a ton of work from reinventing the wheel. These imports are usually referred to as packages. A big spoiler alert for programming is that 95% of the work is just installing and debugging said packages.
Of course, another huge part of this is the inputs and outputs themselves. These are referred to generally as data. Just like with algorithms, there is a lot of pieces that make up data: datatypes, variables, and arrays/dictionaries as a few examples. Datatypes are, admittedly, types of data (a string is a word, an integer is a number, a pointer is… well, you’ll learn it when you’re older). Variables are how we store data, either for its use as an input/output, or as an in between while we’re still using it for our algorithm. And arrays/dictionaries (known more generally as data structures) are ways to store a lot of data in one easily accessible place.
So we now know how programming languages work. There is, however, the challenge of learning a specific programming language. The bad news about programming languages is that there are a million of them out there. The good news is that, unlike real languages, there isn’t a whole lot of ways the fundamentals can change from one language to another. Virtually every programming language is made up of the pieces I have described to you. Sure, there can be different focuses in a language — for example, some languages are function-oriented while some are object-oriented — but in our practical minds, that really doesn’t make much of a difference. Once you learn one language really well, the process becomes easier for each subsequent language.
As I have already told you, I am not a programming “master”. In fact, I will never be a programming master, because my use of programming insists solely upon making the things I need to make, and no further. But if you are interested in being a programming master, I did not want to leave you out. So here are some pieces of advice I’ve heard will take you down that path:
The first is that the fundamentals which I had mentioned above just aren’t going to cut it. On a practical level, we’re focused on getting things done — on a mastery level, we’re focused on getting things done effectively and efficiently. Hack solutions are no longer a priority. And because of that, we have to dive deeper in exactly what’s getting these algorithms and data to run.
Code is, of course, instructions for a computer. But how does a computer work? How do all those circuits, those ones and zeroes, those computer parts all translate into what you’re seeing on the screen? In order to be masters, we have to take away the surface-level approach and look at things more from a bottom-up perspective. Some electrical engineering knowledge is of course involved, though just to the extent that we know precisely how each piece of the computer gets us to where we need to go. When we have that info, we can find little “cheats” in the system that allow our programs to be better and better.
Take the pointers I had mentioned above, for instance. Pointers are things that “point” to a specific piece of memory in which a variable resides. This isn’t really something you’d have to worry about at a practical level but is something that’s important in mastery.
It is also worth noting that, at this level, any old algorithm isn’t going to cut it. As it turns out, some algorithms are much faster than others! People have even dedicated their entire lives to figuring out what are the fastest algorithms for a given task. At a practical level, you can probably just search “best algorithm for X” into Google and get 90% of the way there. Another shortcut that doesn’t count in mastery.
A big reason why these shortcuts don’t cut it at a higher level is because master programmers aren’t dealing with small little tools and toys as the practical ones do, but rather massive algorithms taking up massive amounts of data where speed and organization is everything. In other words, programming mastery matters a lot if you’re working at a company like Meta, but maybe a little bit less if you’re just trying to develop a custom todo app for your own productivity quirks.
So, I’ve reached the end of my notes. Hopefully this advice isn’t too controversial — there’s not really any hot takes I intended to put here. Based on this information, you might be wondering what next steps you can take. This is actually easier if you’re going down the “Mastery” route than the “Practical” one — you’ll need to learn a lot of theory, so you’ll mostly be on the ground reading textbooks, research, etc. on how all this stuff works. For practical programmers, the best next step is to try and build something you need. There’s plenty of “programming challenge” websites out there that give you ideas to build things like a todo list app or a calculator, but the problem is that most people don’t need todo lists or calculators because they already exist in abundance. If you don’t need it, you’re less motivated to make it. So if you need motivation to learn how to build something, it’s better to start from the angle of creating something brand new and/or tailored to your own specific needs.
Games are always a good place to start. A lot of people have ideas for games they’d like to play but don’t exist, and game development is a good way to learn a lot of practical programming skills rather quickly. The only downside to games is that making one (especially in the 3D space) is hard even for mastery programmers, and so depending on the game you envision it may be more easy to start with a simple app that might help you out. Either way, I hope you enjoyed this short list of recommendations!