It's not what you know, it's what you do that counts
This is true for the most part. You know how the saying goes: give a man a fish and he eats for one day; teach him how to fish and he eats for a lifetime. While learning from others may feel easier or more comfortable (this is why schools exist), at the end of the day it is hands-on experience that makes us better at what we do.
In software development, we can learn a lot from those who have been through the trenches. We love to consume blogs and podcasts on topics like software architecture, design patterns, testing practice, etc. The problem with learning by reading is that we don't get a sense of how things work in the context of real development. Books are wonderful educational tools but they're not so good for experiential learning. The only way to really understand something is to build it yourself . This has a whole host of benefits that we'll discuss later, but at the core is one simple truth: you learn more from doing .
This is not to say that reading or listening to podcasts are bad - they're great. However, when trying to learn how something works, jumping into it and doing it yourself is always going to give you the most value.
The Big Picture
When trying to learn something new, it's always a good idea to figure out how you'll approach it before you dive in head first. You don't want to be floundering around wondering what to do and where to go next - that will lead to frustration and possibly many wasted hours.
Speaking of wasted time, the reason learning from others is better than doing yourself is that it's faster . Learning with others is a much more passive activity where you're absorbing what they have to say, instead of constructing and executing. The downside here is that you are not in control how things are presented - there's no guarantee they will even present the topic the way you need to learn it.
This is why I encourage people to get their hands dirty and do things . This gives you the control that reading doesn't - not only can you decide on what direction to head in, but you can also set your own schedule on when to finish it. When learning from others, someone else is in control, but with doing it yourself , you are. This also means that you can decide what order and depth to approach a topic - this will be highly beneficial when we get to the actual learning part of this guide.
A great side effect of learning by doing is that while you're working on something, there will probably be times when you get stuck . This can be frustrating, but is actually a really great thing. When you hit a wall and start to question things, it means that your brain is trying to process everything and find a better way - this will ultimately make you a better developer.
It's also a prime opportunity to ask questions and seek out help from others. You're going to be building something, which means you'll have lots of information that you can share with other people. This is just like when you were learning how to tie your shoelaces or ride a bike - if someone was patient enough to teach you those things, you can certainly share your knowledge with others when they ask for assistance.
The only thing that's stopping you from learning something is yourself . If you're stuck, just keep researching, working, and asking questions - eventually you will break through the wall and it will all start to make sense. Once you do get over the hump though, you'll have a real appreciation for the topic and will be able to build upon that knowledge in the future.
So, let's get started...
Learning by Doing: How it works
Learning anything - whether it be programming or playing an instrument - requires dedication and persistence . If something doesn't click after trying to learn it for an hour or two, don't give up. There are guaranteed to be lots of things that you won't understand when you start working on them. That's okay - just keep doing it.
Don't get frustrated if you're not making any progress on the project either - at first, your job is to learn how to do things. Once you understand the basics, everything else will be easy - believe it or not, there are people that have been coding for years and still don't know how to do certain things .
The biggest mistake I see when people try to learn something is that they give up too early and then try a different approach. There's nothing wrong with trying multiple routes, but if you're not making any progress on one, don't spend more time on it - just move onto the next method.
Everything else being equal (time, desire, etc.), the biggest factor on how fast you learn something is going to be how much time you spend on it . This means that even if two people are trying one method and another person is using a different method, odds are good that in the long run, the person doing more will end up ahead.
The other thing you need to remember when learning is that there's a difference between getting something done (implementation) and understanding it (architecture). When you're working on your project, feel free to implement things however works best for you - the goal here isn't to optimize code efficiency at this point. This will be the difference between getting things done and understanding what is going on, so don't worry if your code doesn't look pretty. One big rule of thumb that a lot of people use when writing production code is to make sure it's readable enough for someone else to understand - while this won't be part of the project you're working on here, I think it's a good idea to follow this rule so that you can better communicate with others when asking for help.
Learning by doing is all about getting something done and collecting data on what works and doesn't work . This means that the learning process will be different from person to person - there are no set guidelines as to how long it should take, what you should build, or how it should work.
For me personally, learning a new topic usually goes through multiple stages:
Not knowing anything about the subject at all and having no clue where to start
Being overwhelmed with all of the information out there and not really knowing what is important (or even possible)
Getting lost in confusion about questions like "What should I do first?", "What if I'm doing something wrong?", or "How can I make this more efficient?"
Going through these stages over and over again until it finally starts to click
Knowing that the learning process tends to go through multiple stages is important because it'll help you save time. In the beginning, you won't understand anything, so just keep researching - this is necessary for getting a broad view of things. Once you are familiar with the basics though, you should be able to learn quickly because you now know where to start. This is the point at which someone will be most likely to get frustrated and give up - but it's also when everyone sees their biggest improvements, so don't stop here!