the silent language

is an excellent book by Edward T. Hall (isbn 0-385-05549-8). As usual I'm going to quote from a few pages:
Culture hides much more than it reveals, and strangely enough what it hides, it hides most effectively from its own participants.
Interaction has its basis in the underlying irritability of all living substance.
Culture is saturated with both emotion and intelligence.
Theodosius Dobzhansky, the great human geneticist, once observed that life was the result of neither design nor chance but the dynamic interaction of living substance with itself. He meant that life, in a changing environment, places such strains on the organism to adapt that, if this does not take place constantly, the organism as a species dies out.

Different cultures are analogous to different species in the sense that some of them survive whilst others perish. Some are more adaptive than others. The study of change, therefore, is the study of survival.
An often noted characteristic of culture change is that an idea or a practice will hold on very persistently, apparently resisting all efforts to move it, and then, suddenly, without notice, it will collapse.
The idea of looking at culture as communication has been profitable in that it has raised problems which had not been thought of before and provided solutions which might not otherwise have been possible.
We say, "I'll see you in an hour." The Arab says, "What do you mean, 'in an hour'? Is the hour like a room, that you can go in an out of it?" To him his own system makes sense: "I'll see you before one hour," or "I'll see you after one week." We go out in in the rain. The Arab goes under the rain.
...we all hold an illusion about talking, an illusion that talking is quite untrammeled and spontaneous and merely 'expresses' whatever we wish to have it express. This illusory appearance results from the fact that the obligatory phenomena within apparently free flow of talk are so completely autocratic that the speaker and the listener are bound unconsciously as though in the grip of a law of nature. [Benjamin Whorf, Linguistics as an Exact Science]
Complete lack of congruence occurs when everything is so out of phase that no member of a culture could possibly conceive of himself creating such a mess.
Many artists... are credited with "creating" new patterns. Yet most artists know that what greatness they have lies in being able to make meaningful statements about what is going on around them. They say what others have tried to say but say it more simply, more directly, and more accurately, more incisively and with greater insight.
Talking about them... changes our relation with them. We move into an active and understanding correspondence with those aspects of our existence which are all too frequently taken for granted or which sometimes weigh heavily on us. Talking about them frees us from their restraint.

how to use conscious purpose without wrecking everything

is the title of the truly fantastic talk John Gall gave at Tom Gilb's annual Gilbfest a few weeks ago. You can read the whole thing here. Here's a small selection of the many snippets that spoke to me:
Maximizing efficiency is the error of having a single goal, what William Blake once called “Newton’s sleep.”
Always the more beautiful answer who asks the more difficult question [e.e.cummings]
Evolution always means Co-evolution. The horse eats the grass, the grass grows stronger roots, the horse grows stronger jaws.
What is involved is not simply survival of the fittest, but survival of the fitting-in-est.
The amount of feedback that is built into living organisms differs by many orders of magnitude from the amount that we build into manmade systems.
Flexibility means the willingness to act in response to the feedback message by actually changing how the system works.
There are many Potemkin Villages in operation today, hiding and distracting us from awareness of what’s really going on.
Ignoring feedback merely means that the system will eventually experience a massive unpleasant surprise rather than a small unpleasant surprise.
As Bradford Keeney pointed out, stability is not homeostasis, it’s homeodynamics.
Once you get above that first level, the level of material things and forces, you are dealing with abstractions. In place of physical forces, you have communication—messages, signals. And in place of material things, you have relationships—which are abstractions.
Once we get above the level of physical objects and forces, we are dealing with patterns of interaction, that is, with abstractions.
Abstractions — that is, ideas — don’t die. They can’t be killed. They can’t be exterminated. They just keep coming back, over and over and over. This problem can never be solved if one continues to believe that the so-called "real" world of physical objects and forces is all there is. The Chinese have a word for this. They call it "being stuck in the ten thousand things."
In order to become birds, dinosaurs had to give up being dinosaurs.
If I design a system with no regard for the universe that surrounds it, I will have scanty knowledge of what can impact it.


barbel fishing


My latest Barbel fishing trip was to the River Wye on the Middle Hill Court beat. I caught this 10lb 1oz beauty (that's 4.5kg in old money). My first double!

Winnie-the-Pooh

is an excellent book by A.A.Milne (isbn 978-1405223980). As usual I'm going to quote from a few pages:
Here is Edward Bear, coming downstairs now, bump, bump, bump, on the back of his head, behind Christopher Robin. It is, as far as he knows, the only way of coming downstairs, but sometimes he feels that there really is another way, if only he could stop bumping for a moment and think of it.
He was getting rather tired by this time, so that is why he sang a Complaining Song.
"What do you want a balloon for?" you said.
Winnie-the-Pooh looked round to see that nobody was listening, put his paw to his mouth, and said in a deep whisper: "Honey!"
"But you don't get honey with balloons!"
"I do," said Pooh.
"I have just been thinking, and I have come to a very important decision. These are the wrong sort of bees."
"I mean," said Rabbit, "that having got so far, it seems a pity to waste it."
Christopher Robin nodded
"Then there's only one thing to be done," he said. "We shall have to wait for you to get thin again."
"How long does getting thin take?" asked Pooh anxiously.
"About a week, I should think."
He sat down and thought, in the most thoughtful way he could think. Then he fitted his paw into one of the Tracks … and then he scratched his nose twice, and stood up.
"Yes," said Winnie-the-Pooh.
"I see now," said Winnie-the-Pooh.
"I have been Foolish and Deluded," said he, "and I am a Bear of No Brain at All."
"You're the Best Bear in All the World," said Christopher Robin soothingly.
"Am I?" said Pooh hopefully. And then he brightened up suddenly.
"Anyhow," he said, "it is nearly Luncheon Time."
So he went home for it.
Pooh felt that he ought to say something helpful about it, but didn't quite know what. So he decided to do something helpful instead.
But Owl went on and on, using longer and longer words, until at last he came back to where he started...
"You don't often see them," said Christopher Robin.
"Not now," said Piglet.
"Not at this time of year," said Pooh.
Owl was explaining that in a case of Sudden and Temporary Immersion the Important Thing was to keep the Head Above Water.
Owl hasn't exactly got Brain, but he Knows Things.
It wasn't what Christopher Robin expected, and the more he looked at it, the more he thought what a Brave and Clever Bear Pooh was.

Tragically I was an only twin

subtitled The Complete Peter Cook is an excellent book by (isbn 0-09-944325-2). As usual I'm going to quote from a few pages:

Builders of Xanadu (Saturday Live, Channel 4, 1986)
...
John Bird: Got the job then?
Peter Cook: Yes, got the job.
John Bird: Big one?
Peter Cook: Well, fairly big. He's got very grandiose in his old age, Kubla has.
John Bird: Well what does he want? An extension?
Peter Cook: No, no. More than that. He wants a pleasure dome.
John Bird: Nice. What sort of pleasure dome did he have in mind?
Peter Cook: Well, he was a bit vague about it. He rambled on a bit. The only adjective I got from him was 'stately'. In fact, that's what he decreed.
John Bird: Oh, he's decreeing things now then, is he?
Peter Cook: Certainly. No pissing about with planning permission for Kubla. If he wants a stately pleasure dome, wallop! He decrees it.
John Bird: Yes, well why not?
Peter Cook: Why not, at his age?
John Bird: Did you bung him an estimate, then?
Peter Cook: No, it's a bit tricky, you see.
John Bird: What's the problem? A pleasure dome's straightforward enough. I don't know about this 'stately' though. What's this 'stately'? That's new to me. What's that? Plants? Hammocks? Not structural, is it?
Peter Cook: No, it's not structural, 'stately'. It's more of an ambience sort of area.
John Bird: Well then, we'll just budget for a regular pleasure dome, and see if we can pick up some stately trimmings down the market.
...
Peter Cook: ... Part of his decree, vis-à-vis the stately pleasure dome, is he has this bloody sacred river Alph running through the structure.
John Bird: A sacred river?
Peter Cook: Running right through the structure. He specified that.
John Bird: We'll need a plumber then. I can have Ronnie bodge up a river for you and we can bung up a sign saying 'Sacred River of Alph'. Something along those lines.
Peter Cook: Yes, but we've still got a problem with his specifications.
John Bird: What's that, then?
Peter Cook: These caverns he wants.
...
Peter Cook: ... with these caverns, you see, he's specified, here, on the docket there, 'measureless to man'.
John Bird: Measureless? He wants caverns you can't measure?
Peter Cook: Yes.
...

Dancing with elves

subtitled Parenting as a Perfoming Art, is an excellent book by John Gall (isbn 978-0-9618251-4-0). As usual I'm going to quote from a few pages:
No one can avoid influencing others. The only question is whether we are going to do it knowingly or unknowingly. Our position is that knowledge is better than ignorance.
Command-and-control tries to get 100% compliance - an impossible goal. In the name of discipline, it teaches rigidity.
The mother bird repeats the sequence over and over, with endless patience, until the children learn. You never see a mother bird attack her offspring; you never see her punish her baby for failure to learn the lesson. When the adult animal teaches their offspring, it is done by one method and that is by modelling over and over the desired behaviour.
Talking about your own experiences causes others to access their own similar experiences. I wish I could get across to you how powerful this effect is and how silently it operates.
Words have this incredible power to call up experience.
What a momentous thing you are doing when you speak words to your child or to your spouse or to any other person. You have the power to create their experience, you have the power to shape it, to make it beautiful. You can give them the experience of competence, of comfort, of success.
Somewhere between the first week of life and age forty or fifty, something rather serious happens. We stop using our feedback. We're carefully taught to pay attention to the program inside our head, instead of what's happening in the real world.
When you speak to someone, they split into two pieces. This happens all the time, to everybody. There's a part that wants to go along with what you say, and then there's a part that wants to defend their individuality, they're not going along. There's the part that agrees, and a part that disagrees, simultaneously.
It obviously doesn't make sense to demand impulse control from a little person that doesn't have it.
If you see "stubbornness" then you're naturally going to expect certain things. You're going to act in certain ways, you're going to get an interaction started that assumes this.
What does it mean when you say a person is "just lazy?" or "just stubborn?". It really means that you have tried out some of your repertoire of behavioural interventions in order to elicit a desired piece of behaviour from the other person and you have failed, because your repertoire was too limited.

The Tao of Pooh

is an excellent book by Benjamin Hoff (isbn 1-4052-0426-5). As usual I'm going to quote from a few pages:
Cottleston, Cottleston, Cottleston Pie,
A fly can't bird, but a bird can fly.
Ask me a riddle and I reply:
Cottleston, Cottleston, Cottleston Pie.
It is useless to you only because you want to make it into something else and do not use it in its proper way.
One disease, long life; no disease, short life.
Unlike other forms of life, though, people are easily led away from what's right for them, because people have Brain, and Brain can be fooled. Inner Nature, when relied on, cannot be fooled. But many people do not look at it or listen to it, and consequently do not understand themselves very much. Having little understanding of themselves, they have little respect for themselves, and are therefore easily influenced by others.
For a long time they looked at the river beneath them, saying nothing, and the river said nothing too, for it felt very quiet and peaceful on this summer afternoon. [A.A.Milne]
I think therefore I am Confused.
All work and no play makes Backson a dull boy.
"But you should be something Important," I said.
"I am," said Pooh.
"Oh? Doing what?"
"Listening," he said.
the Bisy Backson Society, which practically worships youthful energy, appearance, and attitudes.
It's really fun to go somewhere where they are no timesaving devices because, when you do, you find that you have lots of time.
We are determined to be starved before we are hungry. [Henry David Thoreau]
From caring comes courage [Tao Te Ching]
...too many who think too much and care too little.


Experiential Learning 2: Invention

is an excellent book by Jerry Weinberg. There's no isbn - you can buy it from Leanpub. As usual I'm going to quote from a few pages:
At intervals, keep adding members from the observer corps to each team and observe how each team handles the additional members.
They were… concentrating with their eyes closed (that is, sleeping).
Everything that happens in an exercise is an experience; and every experience provides an opportunity for learning.
Let the students design a slide show of their learnings, and present it to you.
If you were to run this exercise again, with observers chosen before the exercise started, what would you instruct the observers to keep track of? How would you process those data once the exercise was finished?
If you can’t find a regular pattern of some time for self-observation, your leadership development program is in serious trouble.
Have each participant make a "sandwich board" on a large sheet of paper saying:
1) what I'm seeking in teammates
2) what I have to offer my teammates
When standing aside at some distance, we can often see what we couldn’t see up close - that the whole structure is about to collapse, and that additional work will just be wasted work.

the book of tea

is an excellent book by Kakuzo Okakura (isbn 0-486-200070-1). As usual I'm going to quote from a few pages:
One of the cardinal concepts of Oriental thought, from even before the time of Confucius, has been the belief that alternating, diametrically opposed forces govern the universe, like day and night.
Those who cannot feel the littleness of great things in themselves are apt to overlook the greatness of little things in others.
The art of life lies in a constant readjustment to our surroundings.
We must know the whole play in order to properly act our parts; the conception of totality must never be lost in that of the individual.
Truth can be reached only through the comprehension of opposites.
It is much to be regretted that so much of the apparent enthusiasm for art in the present day has no foundation in real feeling.
We classify too much and enjoy too little.

sliming and refactoring and deliberate duplication



Suppose I'm doing the Print-Diamond kata in Ruby:
Given a letter print a diamond starting with 'A' 
with the supplied letter at the widest point. 
For example: print-diamond 'E' prints
    A
   B B
  C   C
 D     D
E       E
 D     D
  C   C
   B B
    A
I start with a test
def test_diamond_A
  assert_equal ['A'], diamond('A')
end
which I pass using
def diamond(widest)
  ['A']
end
I add another test
def test_diamond_B
  assert_equal [' A',
                'B B',
                ' A'], diamond('B')
end
which I pass using
def diamond(widest)
  if widest == 'A'
    return ['A']
  end
  if widest == 'B'
    return [' A',
            'B B',
            ' A']
  end
end
I add one more test
def test_diamond_C
  assert_equal ['  A',
                ' B B',
                'C   C',
                ' B B',
                '  A'], diamond('C')
end
which I pass using
def diamond(widest)
  if widest == 'A'
    return ['A']
  end
  if widest == 'B'
    return [' A',
            'B B',
            ' A']
  end
  if widest == 'C'
    return ['  A',
            ' B B',
            'C   C',
            ' B B',
            '  A']
  end
end
The tests have already proved valuable:
  • I've decided I don't want to actually test printing
  • I've chosen the result format - an array of strings
  • I've chosen not to embed newlines at the end of the strings
  • I've something to refactor against
However, there is no point in carrying on sliming. As the tests get more specific, the code should get more generic. I have three specific tests, but the code is equally specific. I need to generalize the code.

While coding the array of strings for the 'C' case I found myself copying the result for 'B' and modifying that. Specifically, I had to:
  • duplicate the 'B B' string
  • add a space at the start of the ' A' and 'B B' strings
  • add a new middle string 'C C'
This gave me the idea to try a recursive implementation. My first step was to refactor the code to this:
def diamond(widest)
  d = inner_diamond(widest)
  mid = d.length / 2
  d[0..mid-1] + d[mid+1..-1]
end

def inner_diamond(widest)
  if widest == 'A'
    return ['A',
            'A']
  end
  if widest == 'B'
    return [' A',
            'B B',
            'B B',
            ' A']
  end
  if widest == 'C'
    return ['  A',
            ' B B',
            'C   C',
            'C   C',
            ' B B',
            '  A']
  end
end
This looks a promising step towards a recursive solution - to make the implementation of 'C' contain the implementation of 'B' and then add strings only for 'C'. So, remembering what I had to do when copying and modifying, I refactored to this:
def inner_diamond(widest)
  if widest == 'A'
    return ['A',
            'A']
  end
  if widest == 'B'
    return [' A',
            'B B',
            'B B',
            ' A']
  end
  if widest == 'C'
    b = inner_diamond('B')
    upper,lower = split(b.map{ |s| ' ' + s })
    c = widest + '   ' + widest
    return upper + [c,c] + lower
  end
end

def split(array)
  mid = array.length / 2
  [ array[0..mid-1], array[mid..-1] ]
end
From here I verified the recursive solution works for 'B' as well:
def inner_diamond(widest)
  if widest == 'A'
    return ['A',
            'A']
  end
  if widest == 'B'
    a = inner_diamond('A')
    upper,lower = split(a.map{ |s| ' ' + s })
    b = widest + ' ' + widest
    return upper + [b,b] + lower
  end
  if widest == 'C'
    b = inner_diamond('B')
    upper,lower = split(b.map{ |s| ' ' + s })
    c = widest + '   ' + widest
    return upper + [c,c] + lower
  end
end
Now I worked on generalizing the use of the hard-coded argument to inner_diamond() and the hard-coded number of spaces:
def inner_diamond(widest)
  if widest == 'A'
    return ['A','A']
  end
  if widest == 'B'
    a = inner_diamond(previous(widest))
    upper,lower = split(a.map{ |s| ' ' + s })
    n = (widest.ord - 'A'.ord) * 2 - 1
    b = widest + (' ' * n) + widest
    return upper + [b,b] + lower
  end
  if widest == 'C'
    b = inner_diamond(previous(widest))
    upper,lower = split(b.map{ |s| ' ' + s })
    n = (widest.ord - 'A'.ord) * 2 - 1
    c = widest + (' ' * n) + widest
    return upper + [c,c] + lower
  end
end

def previous(letter)
  (letter.ord - 1).chr
end
Now I collapsed the duplicated specific code to its more generic form:
def inner_diamond(widest)
  if widest == 'A'
    return ['A','A']
  else
    a = inner_diamond(previous(widest))
    upper,lower = split(a.map{ |s| ' ' + s })
    n = (widest.ord - 'A'.ord) * 2 - 1
    b = widest + (' ' * n) + widest
    return upper + [b,b] + lower
  end
end
Finally some renaming:
def inner_diamond(widest)
  if widest == 'A'
    return ['A','A']
  else
    inner = inner_diamond(previous(widest))
    upper,lower = split(inner.map{ |s| ' ' + s })
    n = (widest.ord - 'A'.ord) * 2 - 1
    middle = widest + (' ' * n) + widest
    return upper + [middle,middle] + lower
  end
end
To summarise:
  • When sliming I try to think ahead and choose tests which allow me to unslime the slime.
  • If I have slimed 3 times, my next step should be to unslime rather than adding a 4th gob of slime.
  • My first unsliming step is often deliberate duplication, done in a way that allows me to collapse the duplication.


Experiential Learning 1: Beginning

is an excellent book by Jerry Weinberg. There's no isbn - you can buy it from Leanpub. As usual I'm going to quote from a few pages:
This is a very simple exercise, but it will get people talking about process improvement.
If there is no provocation, there is no learning. ... We must first put our students into a provocative environment. We must encourage them to experiment - to play with the materials in that environment.
In many traditional courses, the only significant observation made is pass/fail on the test.
By the mathematical properties of averaging, almost all teams will perform "better" than almost all individuals - simply because they are more average. … All we are measuring is how much closer an average answer is likely to be to another average answer which is essentially a tautology.
People are more ready to accept your facts than your opinions, so be very careful to separate observation (news) from interpretation and significance.
Be patient with silence. Usually a long silence comes just before a breakthrough idea.
Different people on each team learned different things from the same trial of the same exercise. This is characteristic of well designed and well led experiential exercises.
Leaders are not in complete control of what participants are going to learn. Are you going to be able to live with that?
The strongest way to achieve safety in experiential exercises is by making clear that every exercise is optional. If someone doesn't want to participate, they are always free to step aside without explaining their reasons, and without any attempts to persuade or cajole. If someone wishes to opt out, then the learning leader should invite them to take an observer role, but they may opt out of that, too.
You can't just pop experiential exercises at people regardless of the context, so pay special attention to the very first exercise you do with a group.
There must be a bazillion ways to form teams, but we've tried only half of them.

The principles of product development flow

is an excellent book by Donald Reinersten (isbn 978-1-935401-00-1). As usual I'm going to quote from a few pages:
Operating a product development process near full utilisation is an economic disaster.
When we emphasise flow, we focus on queues rather than timelines.
Almost any specialist can become a queue.
We grow queues much faster than we can shrink them.
When queues are large, it is very hard to create urgency.
Queues amplify variability. Moving from 75 to 95% utilisation increases variability by 25 times.
Sequential phase-gate processes have inherently large batch transfers.
Large batches encourage even larger batches.
Reducing batch size is usually the single most effective way to reduce queues.
Companies inevitably feel they can computerise this whiteboard, however, they almost always create a more elegant but less useful system.
The speed of feedback is at least two orders of magnitude more important to product developers than manufacturers.
The human effect of fast feedback loops are regenerative. Fast feedback gives people a sense of control; they use it, see results, and this further reinforces their sense of control.
Homeostasis is the tendency of a system to maintain its current state.
In product development, our problem is virtually never motionless engineers. It is almost always motionless work products.
Opportunities get smaller with time, and obstacles get larger.
The scarcest resource is always time.
To align behaviours reward people for the work of others.
It has been said that one barbarian could defeat one Roman soldier in combat, but that 1,000 Roman soldiers could always defeat 1,000 barbarians.
The Marines, and all other elite organisations, maintain continuity in their organisational units.


Olve's uncle

Yesterday, whilst stuck in a traffic jam, my great friend Olve Maudal told me a wonderful story about his uncle. Olve's uncle lived in the country. He didn't much care for the city. He felt the city folk were always in a rush. Often too busy to remember basic courtesy. One day he had to go into the city so he got into his old Volvo and set off. In the middle of the city the old Volvo stalled. He tried restarting it several times with no luck. Then the driver behind him starting tooting his horn. Olve's uncle calmly opened his door, got out his car, and walked towards the tooting driver. Olve's uncle explained to the driver that his old Volvo wouldn't start, and, offering him the car key, asked him if he knew how to get it started. The driver immediately, and in a friendly manner, said yes and took the key. As the tooting driver started walking towards the old Volvo, Olve's uncle said, "I'll wait here and toot your horn for you".

practising

Last week I attended a two day course on the banks of the River Tay learning to speycast using a 15 foot double handed rod. I learned it quickly and effectively, for three reasons:
  • First, I was taught by a great tutor, Gary Scott. Not only is Gary a world champion spey caster he is also a really great teacher and a thoroughly nice bloke to boot.
  • Second, I had almost no previous experience of fly-fishing for trout. This was very helpful as I had no bad habits to unlearn. In contrast, some of the other anglers who attended Gary's course were experienced trout fly-fishers. Gary would correct some particular movement and for a few casts they would do the new movement - but then Gary would move along to help the next angler and soon they dropped back into muscle-memory-mode and had lost the new movement.
  • Third, when I started Gary made sure I did not have a hook tied to the end of the line. This would have been plain dangerous before I had at least some control. Having a small piece of wool instead of the hook meant I was not thinking about catching a salmon; I was thinking only about improving my casting technique. In contrast the other anglers on the course started with a hook and their efforts to improve their casting were inevitably watered down by their desire to catch a salmon.


red-green starts with red

Suppose I've written a test and got it passing...
@Test
public void yahtzee_full_house_scores_25() {
  assertEquals(25, 
    new YahtzeeScorer(4,4,3,4,3).fullHouse());
}
After refactoring I write my next test...
@Test
public void yahtzee_not_full_house_scores_0() {
  assertEquals(0, 
    new YahtzeeScorer(4,4,4,4,4).fullHouse());
}
And this passes first time. That is, it passes without failing first. One of the reasons for failing first is to be sure the test is actually running. For example, suppose I'd forgetten to write @Test and didn't notice that the JUnit output wasn't showing one more test passing. Ooops. A question I've been asked on several occasions is whether, in this situation, you should change the code or the tests to force an initial red. For example, my first version of the yahtzee_not_full_house_scores_0 could have been this, (where I've deliberately used 42 instead of 0 simply because 42 is a good example of a number that is not 0):
@Test
public void yahtzee_not_full_house_scores_0() {
  assertEquals(42, 
    new YahtzeeScorer(4,4,4,4,4).fullHouse());
}
I see it fail, and then change the 42 to 0 and see it pass. This works, and I have done this. Perhaps you have too. If so, do you agree that it doesn't feel right? I've learned that when something doesn't feel right my subconscious is trying to tell me something. I've learned that when I've got two choices it's often a good idea to look for a third. And there is a third way. I could instead start with this:
@Test
public void yahtzee_not_full_house_scores_0() {
  fail("RED-FIRST");
}
And when I've seen it fail, I delete the fail() and write the actual code I want to write:
@Test
public void yahtzee_not_full_house_scores_0() {
  assertEquals(0, 
    new YahtzeeScorer(4,4,4,4,4).fullHouse());
}
Or, as an alternative, I could start with this:
@Test
public void yahtzee_not_full_house_scores_0() {
  fail("RED-FIRST");
  assertEquals(0, 
    new YahtzeeScorer(4,4,4,4,4).fullHouse());
}
and when I've seen it fail I simply delete the fail() line.

Either way I get the mechanics of seeing the fail out of the way and then I write the code as a separate thing. By un-asking the question I avoid having to decide what to temporarily fiddle with - the code or the tests. I get to write the code I actually want to write. All the time.

yahtzee cyber-dojo refactoring




Several people have asked for refactoring sessions in cyber-dojo. The idea is that instead of starting from the minimal start code and working towards a solution, you start from finished (but poor) solution and work on refactoring instead. So here are four deliberately poor solutions to Yahtzee in Java, C#, C++, and Python just itching to be refactored!
These buttons create Individual Practices:
These buttons create Group Practices:

when it shocked us

A while ago I set myself a goal of reading all four volumes of Jerry Weinberg's Quality Software Management twice. I'm 7/8 through and this morning some of volume 4, Anticipating Change, really spoke to me.

Figure 10-9 extends the simple view of a feedback controller, to show that the environment of each level contains both the levels above and below.
In a feedback control system, the roles of system and controller are symmetrical. It's only our perception that determines which is controller and which is controllee, which is high and which is low.
In all the cases I have examined, the error correction mechanism seems to start at the lowest possible level and slowly works its way higher. [Donald Norman. Psychology of Everyday Things].
Norman is talking about correcting errors in handling everyday things, like being unable to insert the car key, trying again, trying the key upside down, trying another key, wiggling the handle, trying another door, and finally realizing that it's the wrong car. But the same way of progressing through levels is commonly found in correcting organizational faults.
Maturity tends to mean reliability.
In terms of the Feedback Control Model, every one of the more than a hundred failures I've studied closely can be attributed to poor management.
Software is invisible only when we have not developed the correct engineering measurements. A hundred years ago electricity was considered invisible. We only knew of its existence when it shocked us.
Software often lacks sufficient stability to make meaningful measurements.


the cat in the hat

I've blogged before about how Patrick and I often watch The Princess Bride. Patrick has Asperger's syndrome and loves to watch the same film many times. Many many times. It would be easy for me to not watch a repeat-showing with Patrick on the grounds I'd find it boring. I think that not that many years ago that's exactly what I would have done. But something Jerry Weinberg wrote (in Quality Software Management volume 1 Systems Thinking, page 111) struck a chord with me. He said:

It's not the event that counts, it's your reaction to the event.

So now I challenge myself to watch the film with Patrick (for the umpteenth time) and change the way I react so I don't find it boring. For example, I can specifically look for scenes or lines that I can relate to software development. I've found there will always be some. Here are some from The Cat in The Hat:

For refactoring and continuous-improvement (the song at the end after they've tidied up the mess they made)

I've got to admit it's getting better.

For attitude (after they make the cupcakes which taste disgusting)

They're horrible. Who want's some?

For gratitude (again at the end)

This day has been amazing. Thank you.

For pair-programming! (when they're in the car)

Two people can't drive at the same time.

For testing! (when they're in the car again)

I think there's something wrong with your brakes. When was the last time you had them checked?

For quick and dirty (which is really slow-and-dirty)

There's no way to explain this to mom.

For QWAN, Quality Without A Name, when they're riding the Mrs KWAN roller-coaster:

Please keep your hands and feet in the KWAN at all times.

It's amazing how what you see changes when you change how you look.

big cyber-dojo in Beijing


Mike Long (@meekrosoft) ran a Cyber-Dojo for 32 people in Beijing yesterday. Way to go Mike :-)

cyber-dojo in the cloud

http://cyber-dojo.com is now properly hosted in the Amazon cloud :-) I'll leave the old server, 81.31.112.23 (in my house, under the stairs, with the flaky internet connection - I live in a rural area) up for a few days, but will be gone soon.

A few people have been asking if they could donate something towards running Cyber-Dojo. Now that I'm paying for the hosting that seems a sensible idea, so I've added a donate button. Thanks.