Tell me and I forget.
Involve me and I learn
Everyone learns in their own way but I have always believed that the best way to learn anything is to try it out. Try and fail, if necessary - failing is only learning that your current approach doesn’t work, as Edison might say - but the important thing is to try.
I find this to be particularly to true with technology: new languages, new frameworks or new concepts. I can see the value in courses and tutorials but I always find that a technology only really feels familiar to me once I have used it in to do something real.
The trick, then, is to find a way of using that exciting new technology you desperately want to learn…
Where do you do most of your development? Exactly. So if you want to learn
AwesomeNewFramework then consider whether or not it would be of use to your company: perhaps it adds something that you can’t do today, or improves on the processes you currently use.
Obviously this is not always possible. Almost all software companies will have established technologies and established products, so changing to a new framework or language is not always practical. People have to be trained, products have to be updated…it might not be worth the effort for an uncertain benefit.
So if we assume that we can’t use it at work, how can we find another project to learn with?
Working on personal projects or side projects is - in my opinion - always a good idea for any developer. Doing all of your work in a single project or in a single language is a recipe for stagnation.
If you have a great idea for a project and you want to learn a new technology then it is a double benefit. By having a real-world problem to solve you will immediately be forced to look deeper into the technology than you would during any tutorial or course. If someone is walking you through a prepared problem then the information is just handed to you: you may learn how to use function
X(...), but you likely won’t learn why you should use it over
Z(...), what happens when you leave out the optional parameters, and why the bloody thing won’t work when you need it to!
When you are trying to solve a specific problem you almost-inevitably find a deeper understanding of the code on which it relies.
For me, side projects are always my preferred way of learning. A personal project has no existing structure to confuse or to be misunderstood; it has no limits on what it does or how it works besides those that you decide. Once complete, you – the author - know the story behind every line of code and every design choice.
The only problem is that it does rely on having an idea. Coming up with ideas that are both useful and will not take too long to create is often a sticking point, so how can we come up with real-world scenarios from which to learn without that creative spark?
A great way to learn is to teach someone else, and one of the many great things about the internet is that it is full of people who want to be taught!
If you are looking to improve your knowledge of a technology but you don’t have the time to take on a whole project, take a look on Stack Overflow. You’ll find a long list of other people who ask a constant stream of questions - from beginner to advanced levels - about the framework or the language you want to learn.
Some of those questions will be beyond your knowledge; some you will be able to answer immediately. In either case, try to write an answer.
It doesn’t matter if there are already answers, or if you think you might need to go and investigate for 15 minutes before you can respond: by finding a solution and then *explaining that solution to someone else *you will automatically be improving your own knowledge. As an added bonus, you might have helped another poor soul on their way to understanding as well!
In summary, you will always learn more by tackling real-world problems rather than hand-picked scenarios from a tutorial. Ideally you want to use your own problems, but if you don’t have access to the right kind of project just now then go help someone else with theirs!