[The following article was reposted from my blog Superheroes in Racecars.]
To be honest, I always cringe a little when I hear someone say that they "taught themselves" how to do something. While the phrase has become a shorthand for saying "I learned this outside of the traditional classroom setting," I can't but help be bothered by the sense of arrogance that comes with the fact that it also seems like a shorthand for "I learned this without a teacher."
There is always a teacher involved. Whether you learned that skill by reading books, following online tutorials, watching instructional videos, or reading articles online, someone had to create that content for you to consume.
One of the most amazing things about working in tech is that people tend to spend a lot of time either learning from others or helping others understand complicated skills. Anyone can become a "teacher" just by writing a single article or by giving a talk at a conference, and this promotes a really cool continuous-learning culture within the community.
But it worries me just how little attention we sometimes give to the teachers who create the content that we have become so dependent on for our professional development. Software engineers tend to take the availability and quality of this educational content for granted. Many people in this field describe themselves as "self-taught" rather than attributing their expertise to the individuals who they learned from.
This is a problem, not necessarily because it's rude or self-centered behavior, but because we're creating misleading expectations among students and upcoming engineers. We often trivialize how easy it is to learn new technologies by saying "oh yeah just do a Google search!" We act as if just any Google result is good enough to learn from, as if the quality of the educational content has no effect on one's ability to master the material. We give off the impression that mastery is entirely dependent on our own intelligence, and so when students struggle, rather than questioning the quality of the content that they're trying to learn from, they instead question their own intelligence and start contemplating whether they should just give up.
This leads me to my first tip on "How to Get Better at Teaching Yourself New Skills": Recognize that you are not "teaching yourself" anything. Rather, the content that you trying to learn from was created by someone's attempt to teach you that material. And sometimes these teachers simply fail. Sometimes they create content that just isn't useful to learn from, or is useful only to people who have a particular background.
So if you intend to learn something particularly complicated or challenging, I recommend looking at several different resources, rather than just settling on the first few that you come across. Read the first few chapters of various books, skim through some online tutorial series, look into different video courses. The intent is to find a teacher who teaches in a style that you can connect with, and to find resources that are compatible with whatever amount of prerequisite knowledge that you may or may not have.
Everyone is going to have their own needs and tastes about what kinds of teachers they prefer to learn from. Some might love to dive into technical details while others might feel more comfortable with teachers who give a better overview of the big picture first. Some have less experience and need resources that spell things out a little more, while others might simply want a quick "transition" guide for those who have a lot of experience with another technology.
For me, I've found that I tend to really value teachers who are very conscious about prerequisite knowledge. Every resource makes certain assumptions about what you know or don't know, and sometimes not knowing something that a teacher expected you to know can lead to the worst form of confusion. It's the kind of confusion that makes you feel pretty dumb, and it also makes the material seem that much harder to learn, because you feel as though you have even more work to do in order to be at the level that the teacher expects you to be at.
I really don't like to feel that way, and so I really value resources that set clear expectations on what prerequisites you'll need in order to learn from that resource. It's also helpful when teachers point out when it's okay to be confused, because it allows you to focus on learning the parts of the material that are immediately being discussed, rather than getting too confused about tangential topics.
It's easy to overemphasize the need to consume educational content, but an equally important part of the learning process is to practice the skills that you are trying to learn. In the past, I've often measured my progress towards mastery by looking at how much content I've consumed (for instance, how many pages I've read in a book, or how many videos I've watched in a tutorial series). But lately, I've started measuring my progress by also including how many hours of dedicated practice I've had. Framing the problem in this way has definitely motivated me to actually get more things done.
Unfortunately, the part that I've always struggled with is the challenge of getting myself to practice consistently over an extended period of time. Setting up a good routine has always been a challenge to me, partly because my non-working hours are defined by anything but a routine. However, the most effective routine that I've managed to form so far has been to attend some local, weekly gamedev meetups, which practically force me to dedicate at least a few hours per week towards these kinds of projects.
Sometimes you might need to invest a lot of time into "book learning" before you can really put the material into practice, and these can often be frustrating situations to be in, as you never quite feel like you're mastering anything. You might choose to deal with this situation by simply finding a different resource to learn from, one that allows you to dive in first and ask questions later. Or you might instead choose to be patient, all while maximizing what little moments of practice that you can get along the way before you reach that moment where you can really fly with the material. It ultimately comes down to what your preferred learning style is.
A big challenge with learning things on your own is that you don't necessarily have someone who can coach you through all of the mistakes that you're making. You might try to be your own coach in a way, meaning you have to be self-critical enough to look for your own mistakes and to think about how you might be able to do things better. But of course, this is very difficult and not very reliable unless you have enough experience. So while getting better at self-assessment is definitely something that everyone should aspire to do, it's not the full solution to the coaching problem.
At the end of the day, you're simply going to learn more from people who are more experienced than you. Therefore, you should focus your efforts on exposing yourself and your work to such people. This is perhaps the most challenging part of mastering a new skill outside of a classroom setting, because you don't have immediate access to people who are willing and able to give you feedback on your work. And this is definitely something that I've struggled with myself.
Before you start contacting strangers, it's easier to see if there's anyone who you already know who might be able to provide at least some guidance or feedback. Perhaps you have a friend who attempted to learn this skill or technology in the past? Perhaps you know someone who's expressed interest in helping students? Perhaps there are online or offline communities that you frequently visit where you could meet someone who's willing to help?
When you do approach someone for help, try to be as polite and conscientious as possible. This means being respectful not just to them but to their time. Try to put yourself in their position and think about how much work they might have to do in order to help you. For instance, if you ask "My program doesn't work, can you help me? (here's my program)," then you're asking them to debug your program for you, which is just rude and a waste of their time. You can be far more respectful if you put in the time and effort to describe the errors that your program is getting, explain what your theories are about the error, and elaborate on why you need help understanding this particular problem.
Of course, you can still ask vague questions, as long as they have a specific direction behind them. For example, "I'm really confused and don't know where to start with any of this C++ stuff (and here's why)," might be a really vague question, but it does give people an idea of what you might need help with -- as long as you can elaborate further on why you are confused, of course.
On the other hand, if you were to say, "I don't know if my programming is any good, can you give me some feedback? (here's this massive program I wrote)," then you're practically asking someone to read through all of your code, which is a fairly unreasonable request, even if it is a perfectly honest question. You might be better off asking "I don't know if my programming is any good, how can I get feedback?"
Unfortunately, there are just some things that you can't really learn by asking questions. So if you ever get a chance to work with someone more experienced than you, it's a golden opportunity to learn from how they do things, the mistakes they make, and the feedback that they have about your contributions. They don't even have that be that much more experienced than you; as long as you have something to learn from them, it's still a good opportunity. Open source projects are especially well-known for being a great way to work with more experienced people, as long as you find a community that welcomes inexperienced contributors.
I got most of my practice by working with friends on various side projects, and even though we were often learning these technologies together, just working with someone else opens your mind to perspectives and habits that you would have never encountered by working alone. It's also just a lot more fun and easier to stay motivated when you're working with someone, especially if you find someone who you can easily get along with. Working with people who are willing to question and critique your contributions is an invaluable opportunity to get the feedback necessary for improving.
But much like how not every teacher or resource will be a good match for you, it's important to remember that not every potential project will be a good opportunity for learning. Whether you're working in an open source community or among friends, learning requires that you're free to make mistakes in an environment that makes you feel safe, and you definitely don't want to waste your time with unkind, intolerant people who make you feel worthless. These kinds of people are pretty rare, but they're still common enough to be a problem worth looking out for. If you ever find yourself in such a situation, just move on and keep looking for nicer people who you're willing to work with.
I hope it's clear by now that the best way to "teach yourself" something doesn't necessarily involve doing things by yourself. It's really all about taking initiative in your own education and exposing yourself to smart people and good resources that will teach you the most.
When learning any skill, you will likely find many teachers, friends, and colleagues whose work and kindness will help you attain mastery. I just hope when you reach that level of expertise you'll remember to be thankful to those who helped you get there, if only so that we can start setting more realistic expectations among younger generations for what the path to mastery looks like.