I spent over 18 years at schools and universities and apart from the first few years, where I learnt how to read and write and learnt math, I think the rest of that time was mostly wasted. I wish instead of teachers and the education systems trying to teach me different subjects and skills they had taught me one thing: how to learn. If I knew how to learn I could learn (things I liked) much faster instead of having to spend a lot of time trying to learn things (I didn’t necessarily like) the hard way. Many years later I am finally learning how to learn. People are different and things that work for me may not necessarily work for you; but these are the things I have found to work for me:
Learn to read fast
I used to read very slowly and it really slowed my learning down. It appears that a lot of successful people can read fast: “Theodore Roosevelt was known to be a voracious reader, reading on average a book a day even while President.”.
So I have been trying to improve my reading speed (Breakthrough Rapid Reading is a great resource). I am still a slow reader; but I am much faster than before and it is helping.
Don’t be a passive learner
I have read/watched many technology specific material and I just didn’t get enough value out of it. I have found the best way to learn a technology is to work with it. Sometimes though I still find it inevitable to go through a technology specific resource and that is when I have absolutely no idea about the technology. This happens every now and then: like when I wanted to learn PowerShell or Rails. In these cases I read the material fast. I only want to get an idea about what the technology is and how it works on a high level without getting into too much details. When I get over that initial ‘I have no freaking idea what this is or how it works’ hump I start practicing by doing. This applies to visual training courses too (e.g. plural sight).
Another technique for learning a new technology I have found very useful is to fix intentionally broken unit tests. Ruby Koans is a great example of that which is how I started with Ruby.
Practice by doing
When I know enough about a language or framework to be able to start a small project on it, I just get started and in the process of working on the project the details surface. I also think that the size and nature of the project are very important: need to pick something relatively big. For example I learnt Ruby on Rails a few years ago and did a few small personal projects in it but that was too shallow and small to cover the framework and the practice didn’t provide as much value as it could have.
Learn from experts
I learn so much by watching an expert tackling an issue. I try to pair with someone who really knows what they’re doing and just watching them work teaches me a lot. I pick up a lot of things like thought process, proper testing, keyboard shortcuts, ways to efficiently navigate the code, the environment setup, useful tools/packages/libraries/gems, programming tricks, languages features I didn’t know about ETC.
Obviously you don’t always have the luxury of pairing with an expert. When I cannot find someone to pair with I watch focused screencasts. RailsCasts is a great example of this. For the rest I fill the gap by reading how others tackle certain problems by reading blogs and source code of open source projects.
Engaging in an open source project is a great way to learn. You will get to pair, read code, write code and watch others do it. You will also learn from the users of the project. An added benefit is that (some) people will love you for your work and that’s very satisfying.
Hope this helps.