I am spending a couple of days here in Atlanta with Ho-Sheng Hsiao (Hosh). He invited me to join him for the monthly meeting of the Atlanta Ruby User Group (ALTRUG), and I jumped at the opportunity, since for whatever reason, a lot of programmers (and I think Ruby programmers in particular) seem to read my writing. The event provoked a fertile trail of thought on the nature of learning.
For some reason, martial arts and programming seem to go very well together, and one of the presentations of the evening had to with Coding Kata. Kata are choreographed martial arts drills, and coding kata are about applying the same idea to the development of programming skills. Hosh (who is both a Ruby programmer and a martial artist) described them as being sort of like an onion. Getting used to the movements in the kata is about being able to return to it repeatedly with increasingly sophisticated perspectives, as you advance in your learning. A more naive way of understanding kata is to view them simply as practicing a particular sequences of techniques rather a set of movements.
The difference is that techniques achieve specific things but movements are more primitive. Depending on the context, a specific arm movement may be a punch, a block or a distraction for instance. Depending on its physics, you may be able to execute the same movement in a variety of different ways, using the same principle.
So it is important to focus on the movement itself rather than its uses. This is similar, but not identical to the idea behind what I call a “universal tactic” in the Tempo. I think it is important to avoid the temptation to view a movement/universal tactic in functional terms: to view it as a common component of multiple techniques or technique sequences is similar to viewing water as a component of different fruit juices. True, but not the essence of water. Understanding water directly gives you a much better grasp of its general potential.
Functional Fixedness and Functional Fluidity
This idea of primitive movements that exist independently of specific applications relates to the notion of functional fixedness, a cognitive bias that can limit a person so they use something in only the traditional way. The classic experiment demonstrating functional fixedness is Karl Duncker’s famous candle experiment.
Thinking about kata got me thinking about “the one way” that beginners look for to do something, which came up in my conversation with Ilya Lehrman in Philadelphia. Since teaching often starts with traditional uses of something (be it a martial art move or a coding skill), normal training processes are likely to create functional fixedness.
This is simply because training usually involves small challenges that stretch the learner just a little further. The challenge contains the reward structure to motivate the learning, and the student gets more interested in getting that reward, than in learning the skill. This means the student is in a hurry to learn just one way to get the reward, since s/he doesn’t need two ways.
The consequence though, is functional fixedness. If you first encounter a given movement as a way to throw an effective punch, and you win a little training bout using that punch, that movement is now “punch” to you. If you never break out of that mode of training, you’ll get to functional fixedness.
You can start to break out of it by creating training patterns that reuse the same primitive behaviors for different purposes, but this doesn’t work if the different purposes require different levels of mastery. To make up an arbitrary example that is probably wrong, imagine that a given movement as a punch is something a yellow-belt martial artist can learn, but using the movement as a block requires (say) a blue belt level mastery.
The challenge then is to structure the learning in a sort of holographic/recursive way. Kata (if Hosh’s characterization is correct) seem to achieve exactly that. You can keep returning to them to practice and reinforce the movements for different purposes as you advance. This will naturally make the early uses of the model seem overly ritualistic and arbitrary, since you don’t peel back all the layers of the onion on Day 1 of practice.
In a way, I suppose advanced practice of beginner kata is about seeing your own movements differently, from a broader perspective. You need the continued practice because you need to reinforce the idea of the movement at the level of the most general perspective you can bring to it.
From the domains where I have achieved some skill, I know that the transition from a series of functionally-fixed and isolated (if related) “techniques” to the Aha! movement, where you internalize the movement itself into your thinking, can be quite sudden. It’s a learning breakthrough of sorts. This is the opposite of functional fixedness. This is functional fluidity (I don’t know if the term exists, or if Hosh gets credit for coining it).
“I suppose advanced practice of beginner kata is about seeing your own movements differently, from a broader perspective.” – – Yep, that happens often. In a more abstract domain, when I fail to do this while playing Go against my ipod, I get my ass kicked.
In software development, design patterns are supposed to be used in this way. It’s first recognizing the pattern in a different context, then applying it in an adaptive, fluid way. As a martial art friend said to me in a related conversation, “You’ll never follow the exact pattern of kata in a real life situation, but you will follow the kihon [basics, fundamentals, principle, essence]”.
“You can start to break out of it by creating training patterns that reuse the same primitive behaviors for different purposes, but this doesn’t work if the different purposes require different levels of mastery.”
I have not thought about how the different purposes require different levels of mastery, but thinking back, it does. In the example of using a straight punch, you can use it as a parry — that is, shifting the trajectory of an incoming attack in to shape the overall outcome. It works like a wedge, and you still end up striking the person. The physical motion remains the same. Using it this way requires better body structure and finer sensitivity and does take more than punching a non-moving target. A more bizarre and specialized application (off the top of my head), is, within certain situations where you already have a hold of the other person’s arm, you can “punch” and extend the arm to put the other person into a joint lock.
Funny thing is, this is the lesson of ‘wax on, wax off’. Or better yet, ‘put on your jacket, take off your jacket’.
And no, I don’t know where “functional fluidity” comes from either…
Card feels a bit lowbrow now that I’m twice as old as when I first read him, but this passage in Ender’s Game succinctly describes some training to overcome functional fixedness:
http://bit.ly/jfFUCT