Learn to Learn

Being a respon­si­ble speak­er, I have start­ed prepar­ing my talk — A tour of the lan­guage land­scape — for NDC Oslo months ahead of time! When I first came up with the idea for this talk, I asked on Twit­ter if any­one else thought it was a good idea. Phil made a great point about includ­ing some infor­ma­tion on how I go about learn­ing a new lan­guage.

phil_reply

I came across this TEDx talk by Josh Kauf­man a while back and found it use­ful in help­ing me for­mu­late a learn­ing strat­e­gy that works for me.

Truth about the 10,000 hours rule

In the talk, Josh debunked the often mis­quot­ed 10,000 hours rule. When the study was first pub­lished, the find­ing was that it takes 10,000 hours of delib­er­ate prac­tice to reach the top of an ultra-com­pet­i­tive field. But through a col­lec­tive Chi­nese whis­per the mes­sage was warped into ‘it takes 10,000 hours of delib­er­ate prac­tice to be good at some­thing’.

Instead, Josh found that research­es sug­gest 20 hours is all it takes for you to be rea­son­ably good at some­thing so long you make those hours count.

learning_curve

This is impor­tant, because for us busy pro­gram­mers — who, by the way, have a ten­den­cy to work long hours — the time to learn new skills is both lim­it­ed and nec­es­sary giv­en how fast our indus­try moves.

4 steps to learn

Josh pro­posed these 4 steps to learn­ing any­thing.

4-steps-to-learn-anything

Deconstruct the skill

Most things we con­sid­er as skills are actu­al­ly bun­dles of skills. The more we are able to break them up into small­er skills the bet­ter we can decide which of them actu­al­ly helps us achieve what we want out of our learn­ing. We can then pri­ori­tise the skills that are most use­ful to us and improve our abil­i­ty in the least time pos­si­ble.

For learn­ing a pro­gram­ming lan­guage, you can decon­struct most lan­guages into small­er chunks:

  • vari­able assign­ment
  • com­mon data types
  • con­trol flows (if-else, loops, recur­sions, etc.)
  • work­ing with col­lec­tion types
  • work­ing with strings
  • error han­dling
  • con­cur­ren­cy

Most intro­duc­to­ry books and tuto­ri­als fol­low this struc­ture already.

Learn enough to self-correct

You should first focus on get­ting to the point where you can self-cor­rect and self-edit as you learn. For learn­ing a pro­gram­ming lan­guage, I inter­pret this point as:

  • know how to com­pile and run your code
  • able to put sim­ple pro­grams togeth­er, and tweak it to start get­ting a ‘feel’ of it

Again, most intro­duc­to­ry books and tuto­ri­als fol­low this pat­tern already and have you build a Hel­lo World exam­ple very ear­ly on.

Remove practice barriers

Remove dis­trac­tions — TV, inter­net, twit­ter, etc. — so that you can focus on learn­ing. This can be hard when dis­trac­tions are all around us and so read­i­ly avail­able!

I once heard a sto­ry about John Car­ma­ck that, before a new project, he’d check in to a hotel with a bunch of good books and lit­er­al­ly cut him­self off from the out­side world for days so he can soak up the ideas and inspi­ra­tions before start­ing any work on the project.

I’m not say­ing that you should do the same, obvi­ous­ly dif­fer­ent approach­es work for dif­fer­ent peo­ple. Per­son­al­ly I’m most effec­tive between the hours of 10PM and 2AM because my wife goes to bed ear­ly and I’m able to just zone out.

I’m not a heavy Twit­ter user, or any oth­er social net­work for that mat­ter, so they’re not a prob­lem for me.

On the oth­er hand, com­ic-based TV shows is my poi­son — The Flash, Gotham, Arrow, Agents of SHIELD, etc. To lim­it the amount of dis­rup­tion these bring, I binge watch them in one night so I can have the rest of the nights that week for more con­struc­tive uses.

Practice at least 20 hours

Josh raised a good point that, for most things you learn, there is a frus­tra­tion bar­ri­er — the moment when we become con­scious­ly incom­pe­tent and realise how lit­tle we know and how much more we need to learn.

Conscious_Incompetence

It’s not a great feel­ing as no one likes to feel stu­pid, and this is often the point where we lose our momen­tum and derail our hard-earned progress.

Which is why it’s impor­tant that we pre-com­mit at least 20 hours of our time, so that if and when we hit this frus­tra­tion point we have a good rea­son to push on since we already bud­get­ed 20 hours any­way.

Set your goal

Before you start invest­ing a min­i­mum of 20 hours into learn­ing a new lan­guage, it helps if you could decide what you want to get out of the process. Depend­ing on your sit­u­a­tion and needs this could be quite dif­fer­ent, e.g.

  • are you look­ing to move to a dif­fer­ent lan­guage stack and try­ing to make your­self employ­able?
  • are you try­ing to under­stand the hype around a new lan­guage and see what it’s all about?

Per­son­al­ly, most of my learn­ing is aimed at expand­ing my hori­zon and allow­ing me to see beyond the pos­si­bil­i­ties and options I have at my dis­pos­al with the stack that I work with day-to-day.

Oth­er times I might have spe­cif­ic goals of what I want to be able to do in that new lan­guage, for instance:

  • I learnt Dart as a replace­ment to JavaScript for my web devel­op­ment needs
  • I learnt Elm to be bet­ter acquaint­ed with func­tion­al-reac­tive pro­gram­ming (FRP) and with the aim of being able to make games using FRP

Prioritise learning a new paradigm

One mis­take that I see many peo­ple make is to choose to learn a new lan­guage over a new par­a­digm. For exam­ple, mak­ing the jump from C# to Java is a rel­a­tive easy one, but at the end of day you have learnt a new syn­tax with­out nec­es­sar­i­ly taught your­self a new way to solve prob­lems.

Learn­ing a new par­a­digm on the oth­er hand, fun­da­men­tal­ly change the way you see pro­gram­ming and allow you to see new ways to solve prob­lems. From per­son­al expe­ri­ence, each time I ven­tured into a new par­a­digm — Func­tion­al Pro­gram­ming, Aspect-Ori­ent­ed Pro­gram­ming, Func­tion­al Reac­tive Pro­gram­ming, etc. — has allowed me to see pro­gram­ming in a new light.

If you’re inter­est­ed in explor­ing some less trav­elled roads, check out these three par­a­digms rec­om­mend­ed by John Croisant.

These two books by Bruce Tate are also a great source for explorato­ry learn­ing:

7-langs-7-weeks  7-more-langs-7-weeks

And final­ly, I leave you with a great quote from none oth­er than Alan Perlis.

A lan­guage that doesn’t affect the way you think about pro­gram­ming, is not worth know­ing.

- Alan Perlis

Hap­py learn­ing!

Links