The original text is how-to-learn-stuff-quickly, which I found very beneficial, so I am translating it to share with everyone.
People often say that the internet has democratized education: all you need to do is Google search and you can access the sum of human knowledge! However, obtaining information is just the beginning of the story; afterwards, you still need to transform raw information into usable skills.
For many of us, the gap between the two can lead to "tutorial hell" - getting stuck in one tutorial after another without feeling like we're making substantial progress.
Understanding "how to learn effectively" is crucial, especially as a software developer; learning new things is practically your entire job! If you can learn to quickly grasp new languages/frameworks/tools, you'll be able to be more efficient than the average developer. It's undoubtedly a superpower.
In this blog post, I will share my experience in learning and show you how I quickly master new skills!
Blend#
Broadly speaking, there are two types of learning:
- Guided learning: reading tutorials, taking courses, watching videos. Any form of learning with guidance.
- Unguided learning: starting from scratch to create your own project, extending a tutorial, looking things up in documentation. Any behavior where you're not following a guide.
If you only stick to guided resources, you'll fall into tutorial hell and won't learn the problem-solving skills necessary to be a successful developer. When you try to build your own project, you won't know where to start, and you'll feel like you've spent so much time practicing without gaining any practical skills.
On the other hand, if you solely focus on unguided learning, it can take a long time. Without experienced guidance, you'll have to reinvent the wheel for every problem that has already been solved, spending days or weeks to solve something that's already been solved. It's a long and frustrating road. In the worst case, you might give up entirely because you'll feel like you're not smart enough or not cut out for it.
So, we need to blend them, incorporating some unguided learning ideas into guided resources.
Intentional Mistakes#
You may be like me, not liking to make mistakes and always wanting everything to go perfectly on the first try.
This mindset is generally helpful in life and in other areas as well. If you're a car mechanic, a wrong part can cost hundreds of dollars. If you're a dentist, one mistake can ruin someone's smile.
However, for software development, mistakes are free! If we make a mistake, we can go back to our editor, change the code, and try again. We even have helpful error messages that can point us in the right direction. It's actually a luxury, and we haven't fully taken advantage of it.
When I'm learning a tutorial, I like to "play" with the code. Instead of copying/pasting the provided code verbatim, I try things out: what happens if I omit a line? Or change some of the values?
I try to act like a scientist. If I have a hypothesis about how this code should work, I'll modify the code to test that hypothesis and see if it breaks in the way I expect. When I find flaws in my hypothesis, I might go off the tutorial and do some research on Google. Of course, if I dig too deep into a "rabbit hole," I'll add it to my "things to explore later" list.
This process helps us avoid just blindly following "autopilot" tutorials, getting stuck in the rhythm of "copy/paste code without truly understanding its purpose" or "not knowing why we're doing things."
Learning should be an active process. Exploring the code helps us build a mental model and understand what's happening.
Fading Tutorials#
A few years ago, when I first started working, I used a process that I called "fading tutorials."
The idea behind it is:
- Learn the tutorial word-for-word, step-by-step.
- Once you're done, reset the code to its initial state and minimize the tutorial webpage. See how far you can go without looking at the tutorial. When you get stuck, bring the tutorial back, and once you overcome the obstacle, minimize it again.
- Repeat this process until you can complete it from start to finish without looking at the tutorial.
Just like the scientist mindset described above, this process is useful because it forces you to focus. The tutorial gradually fades away, and you eventually learn how to build the thing without guidance.
This method is super effective, but not everyone enjoys building the same thing over and over again. However, if you're struggling to escape tutorial hell, it might be worth a try!
Extending Tutorials#
Let's say we're learning the official tutorial for React by building a tic-tac-toe game.
After completing this tutorial, you'll have created a fully functional but very minimal game.
We can add all sorts of fun and fancy things to it:
- Keep track of how many games each player has won.
- Use more display components to enhance the UI.
- Allow configuring the board size (4x4, 5x5).
- Add AI for players to play against.
- Some whimsical ideas (animations, sound effects, confetti on victory, etc.)
Get creative and choose what genuinely interests you!
This strategy is great because it helps you avoid the pressure of starting from scratch. Since you already have a fully functional and understandable project.
Note: I did this too, extending the tic-tac-toe tutorial with a demo.
Creating Related Projects#
After completing the tic-tac-toe project, you might be a bit unsure of what to do next.
Instead of jumping into another tutorial, it can be a good idea to try building a similar project from scratch.
For example, maybe you can make a Bingo game! You can leverage your new skills in a slightly different context (state management, event handling). You might encounter things that weren't covered in the tutorial and need to do some searching on Google to try and find solutions (now there's even ChatGPT)!
If you can't solve it, you can temporarily set it aside. Do a few more tutorials, and then come back and see if you've learned enough to solve it.
I've seen this described as the "one on, one off" strategy. Operate according to guided resources (like tutorials), then spend an equal amount of time creating a similar (but unguided) project. If a tutorial shows you how to create a clone of Instagram, try creating a clone of Twitter on your own!
Finding Balance#
When I first started learning, I tended to primarily focus on guided learning. It was challenging to create anything on my own without a good grasp of the syntax and basic knowledge!
However, as I became more familiar with the syntax, the balance shifted. I spent more and more time on unguided learning and creating things that interested me. When I encountered new and unfamiliar problems, I would seek tutorials, but as I gained more experience, that became less and less common.
My chart looks something like this:
Your chart might look a bit different, depending on whether you find the right balance. The important thing is not to focus solely on guided or unguided learning.
Cultivating Mindset#
Many years ago, I went bowling with some friends.
I did terribly, with most of my balls ending up in the gutter. By the end of the game, I had the lowest score in the group.
There are two different ways to interpret this situation:
- I'm bad at bowling, and I'll always be bad. Bowling is just not my thing.
- I'm bad at bowling, but if I wanted to, I could become an excellent bowler.
This is a self-fulfilling prophecy: whichever interpretation you choose is correct. If you believe your bowling skill level is fixed, then it is fixed. If you believe you can improve, then you will improve!
Having the right mindset is crucial if you want to learn new skills quickly.
In software development, things never go smoothly. Inevitably, we'll encounter various situations where the code doesn't behave as we expect.
This can either lead to a vicious cycle - full of frustration, self-doubt, and imposter syndrome - or be seen as an excellent learning opportunity. If you have the right mindset, nothing helps you learn quickly more than perplexing error messages.
To be honest, we learn much more from struggling and failing than from effortless success. With a growth mindset, the struggle may not be entirely enjoyable, but it feels productive, like a good workout.
Goals and Motivation#
We live in a world of social media hype, where it's easy to feel pressured to keep up with the latest trends and learn every popular JS library that pops up on Twitter.
Personally, every time I've tried to do that, I haven't been successful 😅
I don't have a particular motivation to learn for the sake of learning. To keep me motivated, I need a specific and exciting goal in mind.
For example: a few years ago, I discovered a VR video game called Beat Saber. In this game, you attack blocks with a lightsaber, accompanied by music. Each song has unique choreography.
While there are software tools in the community for users to create their own choreography (referred to as "maps" in the community), I didn't like them, and I wanted to create my own map editor for Beat Saber.
After months of hard and occasionally frustrating work, I achieved my goal. If you're interested in this project, you can check out the code on GitHub.
Before this project, I had no 3D experience, and I had to learn a lot about WebGL, Three.js, and react-three-fiber. Learning was tough, no matter how good your mindset is, there will always be times when things don't go smoothly.
But because I had a specific goal, something I genuinely wanted, I was able to overcome setbacks and continue making progress. If I were learning these things just for fun or because I thought it would look good on my resume, I would have given up quickly.
Different people have different motivations, so I'm not saying you need to create a niche project. But I do believe that having a goal in mind, something that genuinely excites you, is important. Otherwise, it's challenging to maintain the necessary motivation once the initial novelty wears off.
Memory#
I have a terrible memory. It can be a bit of a problem; if you don't remember things, it's hard to learn things! Luckily, I have a memory system: spaced repetition.
The core idea of spaced repetition is that to reinforce memory, you need to review it just as it's about to fade away. Each time you reinforce the memory, it lasts longer.
This may sound complicated, but there are tools to help you track this. Personally, I use a Leitner box, a physical box that can hold several hundred index cards. Every day, I review a handful of cards.
You can check out the explanation in How to Remember Anything Forever-ish.
Cultivating Daily Habits#
Let's say we commit to spending 7 hours a week learning new things. Do you think spending one hour each day on the activity is more effective, or spending 7 hours on a single day of the week?
Interestingly, I've found that spending smaller amounts of time more frequently leads to more significant success.
I know not everyone has the luxury of time, but if you can do it, I highly recommend spending a little time each day on what you want to learn.
Every night, our brains process and consolidate the knowledge we've gained during the day. I want to take advantage of that every day, not just once a week!
Because I practice every day, I can pick up where I left off. I don't have to spend a lot of time refreshing my memory and starting over.
As we discussed, it's challenging to maintain motivation once the initial novelty wears off. If you can integrate it into your daily life, you don't have to worry too much about motivation. It becomes something you do, regardless of how you feel.
Learning in Public#
I'm a loyal fan of Swyx's Learn in Public philosophy.
The main idea is that by sharing the knowledge we learn, we can help our future selves. When we come across something new, we should create a record of it, such as a blog post, tweet, or YouTube video.
This may seem counterintuitive; why spend my "learning time" writing blog posts? Isn't that a waste of time?
Learning in public has many benefits, but here are a few I've found:
- Have you ever tried explaining something to someone and realized you didn't understand it as well as you thought? Writing a blog post has the same effect. It's the best way to discover flaws/gaps in your mental model, so you can fix them.
- The worst feeling in the world is encountering an error you know you've solved before but don't remember how. If you've written a blog post about it, you can refer to it!
- By sharing the knowledge you've gained, you become an active participant in the developer community. You can make friends and build connections. It can be fun and fulfilling, not to mention the benefits when looking for a new job or starting a new venture!
One caveat: don't fall into the trap of spending weeks building a perfect blog post! Start by publishing on platforms like Dev or even just posting on Twitter! I published dozens of blog posts on Medium before I built my own fancy custom blog. 😄
Skill Web#
Recently, I started teaching myself how to use Blender to create 3D illustrations.
I'm still a beginner and have put in around 150 hours into this skill, but I've already been able to create some decent-looking artwork.
I've been able to learn so quickly by following all the techniques listed in this blog post. But I also have another ace up my sleeve: skill complementarity.
3D illustration isn't a single skill; it's a collection of dozens of individual skills. Some, like creating 3D models, were entirely new to me, and I had to learn from scratch. But some were things I had experience with.
For example: I'm a photography enthusiast. Many years ago, I learned about composition, how to arrange elements within the frame to create visually appealing shots. When positioning objects in a render, I can leverage those skills.
This is a particularly specific example, but there are other examples that are more abstract. As a frontend developer, I've spent many years honing my attention to detail. All that pixel-pushing work helps me come up with the right values for slopes and thicknesses. And my UI design work helps me understand color theory and aesthetics.
You might not think the skills I have would complement 3D illustration, but they do give me a significant advantage.
To me, skills are like wealth. The more skills I accumulate, the faster they accumulate. Ideas and techniques collected in one field can help in another.
I'm not saying you should become a jack of all trades - having some deep expertise is still valuable! But the larger your skill web grows, the more advantage you have when learning new things.