Friday, October 27, 2006

Wear The White Belt

"As a rule, each step should have a feeling of entrance. This is beginner's mind -- the state of becoming." Zen Mind, p. 162



Context: You have developed a deep understanding of Your First Language and are walking comfortably on a plateau of competence. Your colleagues recognize your abilities and call on you to help them solves problems in your area of expertise. You have pride in your skills.


Problem: You are struggling to learn new things and it seems somehow harder to acquire new skills now that you have the option of Retreating Into Competence. The pace of your self-education seems to be slowing down despite your best efforts. You fear that your personal development may have stalled.


Solution: While retaining the confidence you have gained through your learning, set your previous knowledge aside as you approach new situations. As Yoda so wisely puts it, "You must unlearn what you have learned."



Wearing The White Belt is based on the realisation that whilst the black belt knows the way the white belt has no choice but to learn the way.


Part of the approach Dave took as a family therapist included maintaining a not knowing stance. Families in difficult circumstances were experiencing a unique reality that, despite his training, Dave could not fully appreciate. While he acknowledged his skills at facilitating constructive questions and conversations, Dave was taught to refrain from believing that he had any expert knowledge into the realities that these families experienced. While this appears to be counter-intuitive, in reality it fosters an attitude of respect and curiosity that opens up unforeseen possibilities and solutions. Rather than pushing solutions down on the family, a not knowing stance helped the family and Dave collaborate to find solutions as a team.


Taking this approach to learning new technologies accelerates the learning process tremendously. Training yourself to suspend the use of your customary programming idioms allows you to discover new possibilities. Yet, as a programmer finally feeling proud of achieving a significant level of expertise, taking a step toward your ignorance and allowing yourself to look foolish can be painful. But consider the words of George Leonard from the final pages of his book Mastery:


"How many times have you failed to try something new out of fear of being thought silly? How often have you censored your spontaneity out of fear of being thought childish? ... Psychologist Abraham Maslow discovered a childlike quality in people who have met an unusually high degree of their potential. Ashleigh Montagu used the term neotany (from neonate, menaing newborn) to describe geniuses such as Mozart and Einstein. What we frown at as foolish in our friends, or ourselves, we're likely to smile at as merely eccentric in a world-renowned genius, never stopping to think that the freedom to be foolish might well be one of the keys to the genius's success..."


We have to be able to put aside our past experiences and preconceptions to allow in new knowledge. This is especially difficult when trying to learn your second programming language because this will likely be the first time that you will have to sacrifice productivity in order to improve your skills. Previously you would have looked at problems with little in the way of experience about "the correct way" to solve them. Now you must learn to avoid trying to synthesise new and old knowledge until the new knowledge has had time to sink in.


"In order to climb, you must leave the sure footing, letting go of what you already do well and possibly slipping downward into a ravine. If you never let go of what you already do well, you may continue to make steady progress, but you'll never get off the plateau." Jerry Weinberg, Becoming a Technical Leader, p. 40


One of the benefits of adopting this mindset when learning a new language, tool, or business domain is that you are open to learning how to express yourself idiomatically, thus smoothing your communication with existing experts in that field. By avoiding the old problem of "writing Fortran in any language" you gain a far deeper understanding of new tools which means that when you eventually reconcile new and old knowledge you are better placed to develop productive insights from both fields.


Take the following Java code as an example. It generates random numbers for the United Kingdom's National Lottery. It does this by printing a set of 6 distinct numbers from 1 to 49 inclusive.


public class MyLottery {
private static final int NUMBER_OF_RANDOM_NUMBERS = 6;
private static final int MAX_RANDOM_NUMBER = 49;

public static void main(String[] args) {
SortedSet randomNumbers = new TreeSet();
Random random = new Random();
while (randomNumbers.size() < NUMBER_OF_RANDOM_NUMBERS) {
Integer randomNumber = new Integer(random.nextInt(MAX_RANDOM_NUMBER) + 1);
randomNumbers.add(randomNumber);
}

System.err.println(randomNumbers);
}
}


If you were asked to reimplement this in a language like Io you could reuse a lot of your Java knowledge and write it like this:



list := List clone

while (list count() < 6,
n := Number random(1, 50) floor
if( (list contains( n ) ) == Nil, //true if list doesn't contain n
list add( n )
)
)

list sort print


But when you are asked to implement it in a very different language like J you will find this approach doesn't work. Only by Wearing The White Belt, accepting that in a language that doesn't have loops there must be a radically different but nonetheless valid way of solving problems can you make progress. So in idiomatic J the answer is:


sort 1 + (6 ? 49)



Complementing Wear The White Belt with Practice Practice Practice and Reflect As You Work will allow you to appreciate the deeper commonalities between the different sets of knowledge that you possess.

No comments: