Tuesday, October 28, 2008

"Practice" as it applies to development

CNN Money had an interesting article on "deliberate practice".   It essentially says that the top performers in any field get there by relentlessly learning to be better at what they do, rather than due to inborn talent, and that "deliberate practice" is not what most people do.

This is not a new idea, but it seems to be a good one.  Ronny Max blogged about it over two years ago, and she cited "Freakanomics" as her source, which was first published in 2005.
Screenshot
Geoff Colvin (the author of the CNN piece) cited eight elements that distinguish it from what most other people consider practice:
  1. It is designed specifically to improve performance.
  2. It is usually most effective when repeated a lot.
  3. Continuous feedback is available.
  4. It is mentally demanding.
  5. It is difficult.
  6. Practitioners set specific goals focused on process (not just outcome).
  7. Practitioners "think about their thinking" while practicing.
  8. Practitioners evaluate their own performance carefully.
I like the concept for a couple of reasons, not least of which is that it offers hope for improvement in any endeavor.  I disagree with one of the author's central points - that "talent is overrated".  I suspect that you must have a base level of talent for anything to reach the pinnacle of achievement in it, and that practice is how you turn "base talent" into "world class".


But how does this apply to software development?


Good question.  This isn't like practicing a physical skill, and most of the examples in the article were based on sports.  Here are three concepts that might prove useful:

Design the Goal (Items 1 & 6 above)
Think in advance what skill you want to improve with any given programming exercise.  Give yourself the opportunity to practice the skill as part of the goal (i.e., improving the skill is the primary goal), and decide ahead of time how you will measure performance toward the goal.  Some example skills include:
  • Retaining and applying knowledge of the toolset (i.e., using a specific set of libraries or a design approach).
  • Writing code rapidly without constantly referring to a book or API doc.
  • Improving fidelity to requirements.
  • Writing thorough tests quickly.
Give Yourself Constant Feedback (Items 3 & 7)
Ask yourself "how am I doing" regularly. Review the goals that you set for yourself to ensure that you're doing / learning what you wanted to do / learn. Also consider your mental state - are you remaining focused on task?  Are you letting yourself  get distracted? Do you really want to attain this goal?

Evaluate Your Performance (Item 8)
As soon as you're done with the process part of the exercise, consider carefully what you should do differently next time. Take some notes!  You want to do it right next time, rather than avoiding the situation entirely.