I will start this post with a disclaimer. The ideas that I present here are what I found most helpful in my development as a programmer. I’m not claiming that I offer absolute truths. The opinions that I’m presenting are my personal opinions. I’m not in possession of any statistical data that prove them right or wrong. That being said I’m looking forward to hearing your opinions on the matter.
I’ve been programming for more than a decade now. Looking back to my beginnings and looking around me at people just getting started with programming, I’m trying to figure out what approaches are more effective in learning this craft. In today’s world there are more ways of learning than ever. We have written tutorials, video tutorials, articles, online courses, coding bootcamps, books and people live streaming while they work.
It turns out, and no surprise there, that the best way to get better at programming is through the act of programming. No matter how many tutorials you go through, how many articles you read and how many online courses you take, the best way to get better at programming is by programming. Make no mistake, all those other learning resources have great value: they teach you new things, clear things up and can give you a boost towards a new level of understanding. But in order to get these advantages you really need to have some solid programming experience. By solid programming experience I don’t mean that you have to be a senior programmer, I mean that you should have a solid grasp of your craft at the current level on which you reside. I’m not against the aforementioned learning methods. I’m against the sort of addiction that especially newcomers to programming tend to have regarding tutorials (especially in video format) and online courses. More about this sort of addiction later on. For now I want to focus on two examples that will hopefully clear up what I said about solid programming experience and the learning process. I will try to do this with the help of two imaginary coders: Bill and Donald. These two programmers represent two extremes, in the real life people are a mix of the two.
The story of Bill and Donald
Bill is a beginner who knows his variables, ifs and loops without ambiguity. Bill can advance quite rapidly by building things with the knowledge that he has. He can build simple apps that solve simple problems and from there build up in complexity. After a while he will get really good at it and start to get frustrated with the amount of copy paste that he has to do and with how difficult it is to make changes to his program. He will then go to the next level and learn how to use functions which will be like a breath of fresh air. Building things using functions will make him feel great until he reaches the next roadblock when he’ll have to learn how to use classes. He might then reach a point when he realises that unit tests would help to better maintain his code. He will get frustrated with how hard it is to test his code and he will learn how to make his code testable. This opens up his interest towards well proven architectures, dependency injection and the like. What I described is the natural progression of learning by doing. This kind of person gets from level to level by cementing his knowledge at each level. He doesn’t make huge leaps without understanding most of what he is doing. With his approach, Bill gets great value out of tutorials, articles and online courses because he really gets it.
Let’s contrast this with the more common approach that beginners seem to take. This time, Donald is the beginner in our story. He makes a free account on one of the many online course websites and enrols in a course. He looks at videos of people explaining things in a manner that makes him feel smart. Donald writes a few lines of code in a controlled environment without the obstacles of the real world. He finishes the lessons and he feels prepared to face real life programming challenges. He then realises that it’s hard to write a single line of code in a real situation and that he can’t properly structure his thoughts. Without the hand holding of the online course, things seem much more difficult. Donald turns to tutorials that explain how to solve a problem similar to what his code needs. There is nothing wrong with that and he eventually gets a working program. Although in Donald’s case, even though the software he wrote is working he has almost no clue on “why” and “how” it’s working. Next step is taking another online course where he gets a renewed sense of trust in himself and after that it’s off to a new project. This project will be completed with the help of some more copy pasting from tutorials and stackoverflow.com, rinse and repeat.
Bill will get a job and become a great programmer. Donald, on the other hand, is likely to become one of those “senior” programmers with more than 5 years of experience and the abilities of a slightly above average junior. Donald is regarded as a senior and he doesn’t feel the need to learn anymore, he just likes to throw around words about programming concepts that he doesn’t really understand. Or Donald can realise what his true level is and start filling up the gaps in his knowledge. Unfortunately this is rarely the case, this type of programmer tends to get complacent and to feel that he is good enough. After all they are regarded as seniors at their organisation.
You can learn a lot from online courses if you mix them with real life experience. If you really try to work on real projects instead of just doing what the courses tell you to do. Also reading articles can provide a lot of insight. So it’s not that I don’t see the value in them but I feel that sometimes they are being misused.
Next I’ll briefly go into more details regarding the means by which you can get better at programming.
Practice, practice … and more practice
As noted above, I do find actual programming as being the best way to get better at programming. It’s the same as in any other discipline. You don’t get better at swimming or running by watching other people swim or run, you go out there and do it. I had my share of copy/pasting and doing things in a roundabout way before progressing. But I did learn a lot in the process. You have to get your fundamentals in order so that future progress will have a solid foundation to stand on.
Tutorials
Tutorials are a great way of learning how to solve specific problems. You can learn things from how to implement a sorting algorithm, how to upload an image to a web server, how to create a basic mobile app using Google Maps and a lot more. It goes without saying that usually tutorials teach you a fast, quick and dirty way of getting things done, and maybe it is usually enough to get you started. You need quite a lot of experience to realise when you’re getting the best approach or a beginner friendly quick way of doing things. But that is good, because usually the people that depend on tutorials don’t have that much experience and the rest can manage to get the condensed little piece of wisdom that they need from the said tutorial.
Online courses
Online courses are great and bad simultaneously. They are a great way to learn new things without the limitations of a tutorial. They explore the subject with more depth and teach you how to approach development. I consider myself to be quite an experienced programmer but watching some of the available courses, even the beginner oriented ones, taught me some quite valuable details.
The issue that I have with online courses is that they seem to have a similar addictive effect that self help books have on people reading them. You read such a book with the hope that it will help you evolve as a human being. In many cases some of these books provide great value but the issue is that they tend to be like drugs. What exactly do I mean by this? You read the book, you feel great about yourself and plan how to apply certain advices from the book. You do this with the purpose of improving your life. The truth of the matter is that you usually don’t apply a single thing from the book and after a while you start feeling bad about yourself. The next step is to buy another self help book, read that one and get the same “high”. And with that, the cycle starts anew.
How does this apply to online courses? Such a course has you playing in a sandbox. You have some simple questions whose answer was presented in the 5 minute video you just seen. Occasionally you get a coding assignment but that too is pretty basic and close to what you just learned. If it gets a little more difficult and you don’t have the determination to grind through the problem, you usually skip directly to the answers. After finishing one of these courses you feel great about yourself and you fancy yourself being a programmer. You then try a real world application of what you just learned. You usually do this after a 2–3 week break from when you finished the course. To your surprise you find out that you barely know 10 percent of what you thought you do. You also find out that in the real world things don’t go as planned, starting from the tooling to the programming problems that you are trying to solve. The next phase is a form of depression like in the self help book case. What happens next? You guessed it, enroll in another online course. Most people that are doing this usually end up giving up on programming after a year or so.
In conclusion, online courses are great, but beware of the “self help book” effect and try solving real problems early on. After you finished a course, don’t let weeks go by without programming.
Articles
Articles can offer the reader great knowledge, but usually you have to be quite experienced to get some value out of them. There are great articles out there about unit testing, architecture, design patterns, functional programming, the latest technology trends as well as a lot of research papers on different topics like operating system architecture, collision detection in video games, etc. As I said you can learn a lot from them but you have to be quite experienced to understand them. There are also a lot of articles that can be a waste of time and I personally think that they can be included in the gossip magazine category. These usually have title like “Top 10 most difficult programming languages”, “Why language X is much better than language Y”, “X programming language is dead”, “The future of programming is X so you better …”. Don’t bother reading such articles.
Books
I think that by far books are the best way to learn anything. I’m not sure why. Perhaps because of the steady pace in which the brain absorbs the information. When reading a book you have time to grasp the ideas more deeply than watching a video (although videos certainly have their place: online courses, video tutorials and what I’ll be talking about in the next section). You can read technical books tailored to a specific programming language, general software architecture books, hardware related books (yes, hardware is also important if you want to be a good programmer), time management and even programmer psychology books. I enjoy reading books focused on these subjects but also on other fields. Since books have been so influential on me, I plan to review some of them in the near future.
Live streaming
I’ve made great advancements in my programming prowess by simply following seasoned programers that stream online. The best example of that would be Casey Muratori’ s Handmade Hero series. He streams it live on Twitch but you can also find it on YouTube. In his stream he teaches you how to make a video game from scratch in C/C++ without the help of any libraries. Besides learning a lot of the intricacies of programming video games in that way, I got a lot of value by just watching a seasoned programmer at his craft. I simply got better and faster without realising it. There are more great streams out there but Casey’s is what I found to be the best for me.
Conclusion
The best way to improve is by practicing a lot. That is certainly what brings you most of the way towards becoming a better programmer. Tutorials are good if you want to solve something fast (and usually dirty). The right articles can teach you new things but you have to be somewhat experienced. Online courses are like school without the grades and can bring great knowledge if you work for it. Live streams can basically help you steal experience from seasoned programmers. Books teach you the most at your own pace.
In closing I want to point out that this was my first article ever. With time I hope to get better at it. If you like it, or even if you don’t, there will be more on our website. If you are reading this and less than 2 weeks have passed since the publish date, there is nothing more on our website.