Software Design & Engineering
Internet business development
Profile at LinkedIn
320 Ridgecreek Drive
Lexington, SC 29072
Practice Makes Pretty Good
My daughter has been taking martial arts classes for a couple years now. At least 2 times each week she attends class and goes through the same routines over and over to ensure these basic moves become second nature. These are the building blocks upon which future advanced techniques will be based. Likewise, on Mondays, she gets a lesson on flute and then spends the week practicing new notes, tempos, and rhythm patterns. When she encounters these notes and scales at faster tempos in performance, she'll be able to naturally recall her lessons and drills and free her mind to focus on making music on demand. Tiger Woods, the #1 golfer in the World, still goes to the driving range and putting green for hours each day to maintain nearly flawless technique.
I could cite countless examples of people who engage in thoughtful directed practice to get better and better at their craft. Practice makes "pretty good" (not necessarily perfect -- there's always room for improvement and ongoing skill maintenance), and "pretty good" probably elevates the practitioner to all-star status in most peer groups.
Before I examine what to practice, I want to define how to practice. What do we, as software engineers, when we "go to the range"? What is the programming equivalent to stepping up to the plate for batting practice and learning to consistently hit 'em out of the park? How do I practice "major and minor scales" in C++ or Ruby? Using the martial arts analogy, what constitutes a kata for programmers?
I've been thinking along these lines for a few years now; ever since I read Andy Hunt's Pragmatic Thinking & Learning. More recently, I encountered an implementation of the martial arts metaphor with the establishment of a programming dojo and defined katas to improve basic skills and techniques. I think this works very well.
I see a dojo as a type of school for learning and improving programming skills in a given language, or perhaps multiple languages. I define a kata simply as a software pattern with a purpose. As with the performance of any martial arts kata, eventually the student should be able to perform the kata effortlessly from memory (possibly with some style variations) under the watchful eye of a "sensei." Though everyone will practice on their own, even more advanced practitioners will still benefit from working with a peer or coach, just as Tiger Woods still works with a coach (probably more than one). A kata, then, will consist of a title, a description, a use case, an implementation (coded in the language of the dojo), and tests to validate the results. Though some will disagree, I do think a kata should include code. Katas are not meant to test knowledge, but rather to reinforce skills and fundamentals.
Some katas are very elementary, while others will incorporate more complex techniques taking a student or practitioner on a journey from novice to expert. Some katas will apply to multiple programming languages, such as the implementations of "Hello World" that teach the minimum framework for a functioning program in any given language or platform. Katas can then progress to implementing file I/O, data parsing from XML, CSV or YAML, database transactions, or network socket I/O. There should also be katas for multi-threaded concurrency and synchronization, etc.
And that, is how practice makes pretty good.
| "Thundernet" is a registered trademark of Thundernet Development Group, Inc.
a Florida corporation.
| Copyright © Thundernet Development Group, Inc., 1999-2015.
All rights reserved.