adventures in making stuff with Daniel Higginbotham

On Learning Skills (A Response to Move Your Feet)

27 August 2012

Matt Swanson wrote an inspiring blog post on learning new skills and developing new habits. Below is additional information that could help you learn a new programming skill or develop a new programming habit, along with additional resources. Here's the summary:

  • Programming is a skill
    • You need practice as well knowledge
    • Learning can be seen as a process of bridging your gaps
    • Performing a new skill requires you to develop new habits, and the rules for forming habits apply
  • There are many things you can do to successfully create a new habit
    • Social support
    • Environmental support

Programming is a skill

Programming is a skill, which means that learning programming languages and techniques is not as simple as accumulating facts. No written guide to programming, no matter how thorough, will ever be sufficient because there are countless details which have to be left out, details which you can only assimilate while engaging in the practice of programming.

No one would suggest that you could become a world-class singer by merely going through a book on the subject. With these physical skills, it's obvious that learning involves doing something other than just absorbing knowledge. I think that, with programming, its nature as a skill is often overlooked because it's knowledge work. The key thing to keep in mind is that you must actually do programming in order to learn languages and techniques.

In Matt's case, he was also trying to develop a new habit - using TDD. Many aspects of programming are like this. Perhaps you want to start documenting your code more or you want to start doing daily standup with your team or whatever. These are all habits, some involving just you and some involving your team or organization. Recognizing them as habits will allow you to apply techniques for successfully developing a new habit.

One habit that you can start developing now is to identify your learning gaps (This list, by the way, is pulled in part from Design for How People Learn):

  • Knowledge
    • What information do you need to be successful?
    • Where kind you find this information?
  • Skill
    • What will you need to practice to develop the desired proficiency?
    • How can you make opportunities for practice?
  • Motivation
    • How do you actually feel about learning the skill?
    • Do you feel resistant to changing?
    • More on motivation
  • Environment
    • Do you have all the tools you need?
    • Are they within easy reach? For example - if you want to run like Matt, are your shoes in your closet or right by your bed so that you can put them on first thing in the morning?

Programming is comprised of habits

I'm not a great programmer, I'm a pretty good programmer with great habits

-- Kent Beck

There's a mountain of text out there on how to form habits. Here's my contribution to that mountain!

Get Social Support

Enlist your coworkers. Go to hackfests. Changing your habits is way, way easier when you have other people supporting you.

Environmental Support

Change your environment to make your new habit easy to do and antagonistic habits hard to do. As I mentioned above - put your running shoes by your bed.

When it comes to programming - change your environment to support your new habits. When I started learning Clojure, I invested a lot of effort up front in making it painless to actually run Clojure code because I knew that otherwise it would be too easy to just tell myself "meh, I'll get to this later. Now, time to learn angular.js!" or something like that.

Develop Motivation

I have a little essay on this topic.

Finally, "Change Anything" is probably the best book I've read on developing new habits.

I hope you find this helpful!