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.
Geoff Colvin (the author of the CNN piece) cited eight elements that distinguish it from what most other people consider practice:
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:
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.
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.
Geoff Colvin (the author of the CNN piece) cited eight elements that distinguish it from what most other people consider practice:
- It is designed specifically to improve performance.
- It is usually most effective when repeated a lot.
- Continuous feedback is available.
- It is mentally demanding.
- It is difficult.
- Practitioners set specific goals focused on process (not just outcome).
- Practitioners "think about their thinking" while practicing.
- Practitioners evaluate their own performance carefully.
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.
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.