Newcomers to computer programming sometimes have the misconception that learning to program means acquiring some finite amount of knowledge, beyond which they will be competent. Slowly but surely, they discover that there is no such finish line. They may feel discouraged, in which case you’ll hear them sigh and wail “There’s so much to know!” as though learning were a chore to be completed. It is healthier and more accurate to recognize programming as a lifelong craft. Ars longa, vita brevis.
A particular complaint about rapidly evolving language ecosystems like C++, Rust, and JavaScript is that it’s impossible to “keep up” with them. That concern is based on the false premise that if you’re not ahead, you’re behind. Don’t worry: You don’t have to be on the cutting edge to do great work. (Even in technology, the “cutting edge” is determined more by fashion than function.) The overwhelming majority of knowledge that’s useful today will still be useful ten years from now, especially in languages like those mentioned, whose communities take backward compatibility extremely seriously.
The principles you learn as you develop software are timeless. Software development will reshape your brain in profound and worthwhile ways, from helping you see the beauty in simplicity, to understanding the trade-off between space and time, to making you think hard about the nature of reality. For example, you will sooner or later have to answer questions like what it means for two things to be the same: Are they actually the same object? Are they fungible for some purpose? Is one substitutable for the other, but not vice versa? Questions like these, which may seem like mere armchair philosophy, become significant when you must express abstract ideas so concretely that even a computer can understand them.
Picking up technical skills becomes easier over time, as you learn to learn more efficiently, but it’s a nonlinear process. You’ll learn things, forget (or force yourself to unlearn) them, and sometimes have to learn them again. If you find yourself wondering when you’ll git gud, the answer is that it depends on your goals. If your goal is to feel you’ve pretty much got a handle on programming, then the bad news is that if you are any good at it you’ll never feel you’re done. The more you know, the more you will realize you don’t know. How will you learn it all? You won’t.
I do not know what I may appear to the world, but to myself I seem to have been only like a boy playing on the sea-shore, and diverting myself in now and then finding a smoother pebble or a prettier shell than ordinary, whilst the great ocean of truth lay all undiscovered before me.
Programming is a sea in which you swim, not a potion you consume. You can’t learn it in 21 days, nor in 21 years. It’s a journey, not a destination. Measure your progress only against concrete goals, like milestones alongside the road, such as having implemented particular functionality or shipped something that other people find useful. Don’t worry about when you’ll “get there;” just relax, enjoy the ride, and don’t imagine for a moment that you know in advance where this journey will take you.