Programming is a complex task. There is, unfortunately, no quick trick that can help you acquire the ability to make computers do your bidding. As with most skills, the key to mastering programming lies in practice and this takes time, focus, and patience, resources that are dwindling in our modern age.
However, there are many activities that count as practice and not all of them have the same return on time invested. How you practice is just as important as practicing itself. This is probably obvious for one reason: practice needs to be effective. But an equally important one, in my opinion, is that practice needs to be varied, to avoid burnout and boredom. It also needs to be challenging, while not being too challenging that it causes frustration.
Here are a few things that have helped me over the years:
Read and try to understand as much code as you can
This is an often overlooked way of practicing, but it is a very effective way to speed up the process of learning. It does that by allowing the readers to encounter and learn new patterns more quickly then they would have otherwise. It exposes them to ways of generalizing specific problems, as well as ways of organizing code into good solutions.
Now, of course, if you're just getting started, you'll open some of the code files and they won't make any sense to you. You won't understand how things connect etc. But that's ok. If you're just starting, and, say, you just learned about loops, just look for example of ways that loops are used. Find as many of them as possible and try to understand just how the loops work. As you get more and more advanced, you will be able to make sense of more parts of the code.
Explain what you learn to someone else
Teaching something to someone else shows you where your weaknesses are in terms of understanding the material. It also helps you improve your mental models of abstract technical concepts. You may not feel comfortable to do it in the beginning, but picking a curious friend and being honest about your current level is a good way to get started.
Most importantly, don't just repeat word for word what you've read somewhere, but use your own words, your own images and your own comparisons. In the beginning, don't focus so much on syntax (how code is written), but more on higher-level concepts that are both easier to explain and have higher value in understanding. For example, it's not that important that you explain how Python for loops are written, but it's more important that you explain the concept of a for loop or of an iterable object. Or, even simpler, the very concept of an object.
If your point is to grasp as many concepts as possible, as quickly as possible, then beyond just being exposed to those concepts, you need to make sure that you understand them. Using new concepts, patterns, and building blocks, of course, is a great way to master them. But so is explaining them to someone. If you can explain ideas and concepts effectively, it's more likely that you actually understand them yourself.
Maintain a knowledge file
Remember, programming has a lot to do with learning patterns and knowing how to combine them and apply them to new problems. In the beginning, you will encounter a lot of new patterns or concepts and it will be easy to forget them. This is where a knowledge file can be very useful. By allowing you to record these new findings in your own words, using your own mental models, you can more efficiently build your library of building blocks that you will use when programming.
I use Emacs as my editor of choice and in Emacs I have a shortcut that will open a file where I keep all my programming notes, organized by programming language / concept. Whenever I find or learn something interesting, I add it to my knowledge file. This file is essentially my accumulated wisdom as a software developer. I encourage you to do the same - it may take some time to maintain it and organize it, but it will pay off.
Keep track of errors and exceptions you’ve encountered and how you solved them
Similar to the point above, it's always good to keep track of errors and exceptions, as you encounter them. I can’t tell you how many times I solved the same issues over and over again when I was younger. But then I learned to keep track of them and my life got a lot easier. My detailed notes have saved me lots of time and frustration.
Find small projects that excite you and implement them
When it comes to learning to program, nothing beats writing code. But what can you do when you're just starting and you don't have a job as a software developer? Many bootcamps or online self-driven courses are limited in the amount of homework they can provide, and so don't provide enough opportunity to write code. When you get started, you have to write as much code as you can, so you will necessarily have to supplement the practice you get by working on your own projects.
My advice here is to start small and gradually increase the complexity of your projects. Attempting tasks that you are not yet ready for may cause frustration, feelings of self-doubt and may even turn you away from programming altogether. That's why it's always good to start small and only gradually build up towards the kind of projects you find most exciting. This approach will take longer, but it will cause less frustration and will increase your chances of success.
If you don’t have ideas for such projects, then find an open source project on Github (in your language of choice) and start contributing to it. Open-source projects often have a list of issues waiting to be fixed. It will be hard in the beginning, but you will get better at it. When you contribute code to an open-source project, you get the benefit of having a community of experts providing you feedback. Essentially, you get free mentorship!
Programming can be lonely. Sure, you do interact with other people when working as part of a team, and nowadays pair programming is becoming more popular, but in general, while you are writing code, it's just you and the machine. This can make you feel isolated and lonely, unless you are a person who naturally loves solitude. Therefore, it's essential that you work within a team, whenever possible. Working in a team keeps you motivated, challenged and sane.
In fact, I recommend that you combine these last two tips: work on a project, with someone else. Ideally, you can pair up with someone who is at your level or better, but if you can't find such a person, anyone who is genuinely interested in learning programming will be a good match.
Finally, when you do pair up with someone, get in the habit of reviewing each other's code. This may sound simple, but it's actually a very effective way of improving. It not only allows you to receive feedback, but it also forces you to analyze code that you didn't write, understand it, and suggest improvements. It also benefits your project because it's more likely that you'll discover issues that otherwise would have gone unnoticed.
These are some of my thoughts on how to speed up the process of learning programming. In the end, like all big goals in life, becoming a programmer requires patience, perseverance and a love of the craft. The reality is that many like the idea of being programmers, without actually liking the process of programming. But there are also many more who like the idea of programming, like the actual process of programming, but get discouraged because getting good at it is a slow process. I hope these small hints can help some of you out there.