At Sharktank we often take some time to get together to improve our skills. We have gotten into the habit of calling these sessions our “Coding Dojo” and since the term has become familiar to a lot of people, I have never bothered to explain it. However, today a colleague, knowing that I speak Japanese and have a background in Japanese martial arts asked me what all these terms mean. Here is a brief tutorial on my understanding of the terms and how I think they should apply to a coding dojo.
Before I begin, I should point out that even among Japanese martial arts practitioners the terms are used differently. Because these styles of martial arts have moved beyond the confines of Japan, the terms have been adopted by non-Japanese speaking people. Not only that, but the terms are even used differently by Japanese people due to various political and historical reasons. So if my explanation seems to be at odds with your own experience, I humbly apologize in advance.
Dojo, or more properly “doujou” is a wonderful word. It is made up of the Chinese characters 道場, which mean “the way” and “place”. It is meant to convey a place in which one discovers the way to enlightenment. Even in the context of martial arts, it is a place of self discovery and development.
A coding dojo is therefore a place where we can go to learn about ourselves and attain enlightenment through writing computer programs. In a very real sense, any place where you are coding and in the right mind set is a “coding dojo”. Similarly, even if you are coding, if you are not working with the aim to discover things inside yourself, you are not in a dojo.
Many people have heard the word kata. Though there is more than one way to write this in Chinese characters, 型 is the character I prefer. This character means “mould” or “model”. You can imagine it as a jelly mould into which you pour jelly. After the jelly hardens, you remove the mould and you have the shape you were looking for.
In karate, specifically, a kata is a series of prescribed moves. As a beginner, you are asked to memorize the moves and perform them over and over again until you are proficient with the movements. Usually a kata is not just a collection of moves, but rather a series that describes a sequence of events. As the practitioner gets more adept, they can visualize the events and modify their rhythm, speed, power and even technique to accommodate those events.
It is important to recognize that there is not just one interpretation of the sequence of events that are happening and a master will be able to infinitely adjust their kata according to the myriad of different interpretations that could occur. To a novice’s eye, though, those interpretations will look nearly identical as they don’t understand the importance of small changes in the movements.
It is also important to understand that while kata can be demonstrated, the purpose of kata is not demonstration. Displaying your skills is not useful for developing yourself. Within a dojo, it is good for people to share their knowledge and pass on what they have learned. Demonstrating kata can help in this, but its main purpose is self discovery through constant practice.
In the context of a coding dojo, I think there are many different interpretations of what makes a good kata. In fact, what I believe to be the first reference to coding katas (http://codekata.pragprog.com/) includes many non-coding exercises. Personally, I favour a type of problem that allows you to practice your techniques and offers a variety of interpretations.
Some people wonder if a kata should be done one way and one way only. For example, should I watch a demonstration of a kata and faithfully recreate it on my own, time after time? I think that this is very valuable for beginner programmers. Just like a beginning karateka learns a kata by rote and mimics all the moves without regard to interpretation, this can be useful for beginning programmers. Being able to work through an example and reinforce good behaviour without being distracted by choice is very beneficial. As the programmer becomes more advanced, they should start to look for alternate interpretations.
Kumite is made up of the Chinese characters 組手. In this context, the first character means “cooperate” and the second means “hand”. Te, or hand refers to the original Chinese name for striking style martial arts. It is also used in the word karate, 空手. This word means “open hand”, but was originally written as 唐手. The second writing, which means “Chinese Hand”, or “Chinese striking martial arts style” illustrates the meaning of “hand” in this context. I will leave a study of the historical politics involved in the adoption of the “open hand” interpretation as an exercise to the reader.
As you can see, kumite literally means to cooperate in the pursuit of martial arts. Historically it is a pair exercise where each participant tries to help the other to get a better understanding. There are two main types of kumite, yakusoku and randori.
Yakusoku, or 約束, is a promise or arrangement. It is made up of the characters for “promise” and “bundle”. Yakusoku kumite is similar to a kata in that there is a series of prescribed moves. Each person plays their part and tries to push the other one. One of the big advantages to doing yakusoku kumite is that if one person is supposed to strike while the other person is supposed to dodge, the dodging person has to execute properly or else they will get hit. In this way, the participants try their hardest to hit each other, while following the plan of the kumite. This makes practice much more real and easier to understand.
Randori, or 乱取り, is made up of the characters “riot” and “take”. Randori kumite is unstructured kumite where there is no plan. Participants actively try to push each other in order to learn. Because there are no arranged movements, people usually get hit a lot. It is important to understand that Randori kumite is still kumite and the goal is to increase your understanding, not to hit the other person a lot.
Most karate practitioners are familiar with randori kumite. It is unfortunate that non-Japanese speaking people often confuse the words kumite and randori with fighting. It is doubly unfortunate that many people practice kumite to “win”. Yakusoku kumite is relatively rare in modern karate styles, though those who practice it often consider it the most important part of their activities.
From the perspective of a coding dojo, kumite is very possible to do. In fact, pair programming could be considered a form of kumite. Both yakusoku and randori kumite is quite valid, with the first one following a prescribed form, and the second one being unrestricted. In my mind a randori kumite would allow requirements to be developed or modified along the way.
At Sharktank we often practice what might be known as yakusoku randori kumite. We pick a well known problem and one person writes a single failing test. In a technique known as “ping pong”, the next person makes the test pass and writes the next failing test. Another person takes over, making the test pass and writing the next failing test. We rotate through the entire group, often egging each other on. One of the goals of the game is to write a failing test that makes the next person tackle the problem in a way they might not have expected.
Why not start your own dojo?
As I said, a dojo is simply a place where you practice coding with the aim to develop yourself. You only need yourself, a computer and the right attitude. However, it is often fun to set up a dojo for practicing kumite. We often spend half an hour or so during the day to get together for this purpose. In upcoming blog posts I will try to document how we support this activity technologically and what kinds of things we do.