These terms kata, dōjō and koan are loaded with semantic meanings which most developers know nothing about, they are just a “cool” term to use to represent something which could otherwise be seen as boring and unlikely that a lot of developers would actually look at, lets be honest they represent exercises, coding with other developers and guided learning, nothing more.
The big issue for me with these terms is that if, like me, you have practiced a Japanese martial art that has Kata’s or taken the time to read and perhaps study Zen Buddhism then the way these terms are used in software development are just plain wrong.
In this post I’m going to elaborate on try to show that the problem is with these terms, why they shouldn’t be used and propose alternatives that better fit with the intent behind the actual activity.
ProblemLets take a step back here and look at what a Kata is in martial arts:
“detailed choreographed patterns of movements practised either solo or in pairs” WikipediaSo a kata is a set of movements/techniques that are always practiced together, their primary use in many martial arts is around grading (moving to the next belt), you don’t need to understand what the movements are just that you need to be able to prove you can execute the movements/techniques correctly and in the right order. Katas are most frequently associated with Japanese martial arts particularly Karate, other martial arts such as Wing Chun have forms but these are slightly different to katas in that they are usually seen as a “library” of techniques for you to practice rather than a choreographed pattern.
It is fairly easy to draw parallels between the software kata’s and Karate katas in that whilst a developer may perform a kata they are effectively repeating techniques that in themselves may have some value but the entire “routine” is frequently a made up situation which has no applicability in your day to day job e.g. Calculator Kata – great way to exercise TDD but how often are you asked to build a calculator application?
SolutionBack with the martial arts If you look at a martial art like Muay Thai or look to Mixed Martial Art practitioners they don’t have katas at all, they focus on techniques and how to use them to best effect not wasting time on a choreographed set of movements which offer no practical advantage. The various techniques are combined together in a drill, these drills are not usually standardised or repeated they are created to be used at that moment in training but often would be equally applicable in the ring or for self defence so have value in a wider context.
Instead of software developers using katas I propose we should be looking more to create our equivalent of the drills, creating software that mimics actual development that you may undertake in your day job, but without the restrictions your job places on you i.e. use whatever technology or techniques you want. Instead of building calculators or Fibonacci number generators create a web site that reads and writes to a database, build a RESTful web service, etc actually exercise and improve the skills you do need for your current, or even future, job. An example of this is a recent post by Chris Oliver about 10 Ideas for Beginner Web Developers which is exactly the sort of thing I think we should focus on.
ProblemIf you thought kata was misused you haven’t heard the half of it, a dōjō is defined as:
“Japanese term which literally means ‘place of the way’” WikipediaA dōjō is at its most basic a training hall, a place you go to train but fundamentally it is somewhere that supposed to be special and only used for the purpose that it was intended i.e. practicing martial arts. I think that you’ll agree this is a pretty clear cut definition of what a dōjō is, whether we adhere to that in the western world is a different story altogether.
When we look at dōjō in the sense of software it is probably best defined as “bunch of coders get together to work on a programming challenge” and if you look at how its defined here you’ll see that it focus’ on katas. I have 2 problems with the coding dōjō as they stand:
- It doesn’t relate to a training hall, meeting room, or any physical place set aside for the purpose of “training”
- Its perpetuating katas!
SolutionTo my mind the term dōjō is wrong, what we are trying to get across is its a gathering of developers to write some code and hopefully learn from other people, it is an event that occurs sometimes inside work but most frequently outside of work in your own time.
What is needed is a term that expresses this and it could be a phrase rather than a single word, why not use “code crunch” “code gathering” “stack” or any other term that you can think up that implies geeks getting together to cut some code and learn new (cool?) stuff.
These meet ups should also focus on actual techniques that you’ll want to use, it could be TDD one time CQRS another but the code you write/skill you exercise should always have value to you outside of the event.
ProblemWithin the software world the use of koans isn’t perhaps as widespread as katas or dōjō’s but its misuse of the concept is much worse than either of the previous terms. To perhaps understand lets look at a definition of what a Zen koan is:
“A Koan is a statement, a dialogue, a story or a question which cannot be understood or answered by logical thinking” suite101After some searching and reading the best definition I could find about koans in software development is about the ruby koans:
“A Koan in RubyKoans is a small demonstration of a feature of Ruby with something missing. You have to fill in that missing piece in order to move on to the next Koan.” About.com RubyNow looking at those 2 statements it is very easy to see that they bear absolutely no likeness to each other, a Zen koan cannot be solved with logical thinking whereas the RubyKoan is all about logical thinking and learning.
SolutionIn my humble opinion we should stop using the word koan entirely in the software world, lets think about what we are trying to do ,which is effectively guided learning, and again find a word or phrase that better represents what we are trying to achieve.
You could use a term such as “bread crumbs”, not as cool as koan but has the connation of following a path and reaching a target or you could have a “trail” with way points you need to pass through, both of these would serve us as far better metaphors than a koan.
SummaryHopefully I’ve proved what I said originally in that we as software developers should not be using the terms kata, dōjō, or koan and even shown that the way katas as are being currently practiced are in my opinion not the best way for us as individuals or groups to improve our skills.
As the title of this post says software developers != Zen warriors, lets create our own “cool” vocabulary around these activities to encourage our fellow developers to do them as well, rather than subjugating other terms whose meaning is already well defined and completely different to what we are using them for.
Instead of practicing katas and holding dōjō’s lets all start creating our own drills and holding “code crunches”, rather than working through koans to achieve enlightenment we could follow a trail to help us reach our destination.
One last option is that we could throw out all these terms and simply work on exercises, participate in events/gatherings and undertake some guided learning but that wouldn’t be cool now would it?