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.


Saturday, October 18, 2008

Productivity Tools

I have spent a lot of time trying to find the "perfect" system for personal productivity.  Here are a few things that I have learned...

Having a system to capture information is even more useful than I thought it would be.  I use something similar to the system described here, which is based on Microsoft OneNote.  In essence, every day (which means nearly every weekday, and some weekends) I create a new page with the date as the title, and then "dump" information into it.  I add checkboxes for to-do items, etc.  I also keep my "daily log" pages in the folder that synchronizes with OneNote on my phone, so today & the past few days of notes (plus a couple of persistent pages) are always on there.

This has worked out great as a to-do list, since OneNote also lets you see all "flagged" items, including those marked with different types of checkboxes.

This leaves out one very important thing, though - keeping information up-to-date in my own brain.  This is something that all of the GTD Gurus specifically tell you not to do.  The idea being that information and to-do items "take up space" in your mind, and prevent you from thinking more creatively.  There is a point to be made there, but I think that Allen and others take the idea too far.

My take (which really isn't wildly different from Allen's "weekly review" process) if that you should review your own notes regularly.  Things that still seem important the next day (or the next week) probably are.  I also don't think that this process should be overly formal.  Just spot-check some things from last month, last week, and yesterday.  One thing I hate is to constanly review "to-do" lists that I can't yet take action on.  Reviewing thoughts, ideas, and opinions of other people and their ideas is another matter, so I try to keep my "to-do" items down to only a handful, and the other information more verbose.