One of my students emailed me privately. She wanted to learn a new language over the summer, but she has “always had trouble finding structure and knowing what to learn when pursuing independent studies such as these.” I’ve had this same question a number of times in the past, so I thought it might be useful to post my response.
This is just my way of thinking about it. I’d be interested to hear your techniques for picking up new things.
I do a fair amount of woodworking. It’s one of those hobbies where you are constantly tempted by bright, shiny new tools. When I first started, I fell into that trap, and bought a lot of stuff I never really used. So I have a rule: now I only invest in a tool if I have a current, real need for it. That way I can guarantee that when it arrives I will actually use it. And, by using it, I’ll get to learn it so I’ll know when I can apply it later.
I think it is the same with all tools. So when it comes to learning a new language, my advice is always: find a thing you want to do. It doesn’t have to be a major project; in fact it’s probably better if it isn’t. Look for something that would be useful, not vital. Maybe something that would help with a hobby, or a group that you belong to. Something that could be solved in hundreds, not thousands, of lines of code.
Then choose some aspect of it. Something you understand in terms of requirements. Prototype it in the new language. Know going in that you’ll waste a couple of days just getting familiar with the tooling. Don’t try for finished code, but explore. It’ll be frustrating, because you’ll have to keep stopping to look things up, and because you’ll constantly realize that what you just wrote could be written better. Understand that this is the entire point of learning. It’s not about getting things right. It’s about getting things wrong and gaining experience from that.
At the end of maybe a week, throw all that code away and start again. You’ll find that you’ll be able to knock out the same functionality that took a week in maybe a couple of hours, and you’ll feel that it is better code.
At this point you’ll feel that you’re finally getting it, and you’ll start to feel productive. Keep digging into the language and tooling. Keep challenging yourself.
There’ll come a time when suddenly it feel like you’ve hit a wall; stuff stops being easy, and you begin to doubt that you actually do understand it. This happens to everyone learning something new. It’s a manifestation of the fact that you have now internalized enough of the language that you find yourself making decisions based on not “how can I make this work?” but rather on “what’s a good way to make this work?”. This point is a bit like earning a black belt in the martial arts. This is when it starts being fun!