Here's the first
Raspberry Pi raised from
cyber-dojo donations :-)
Everything works so it's off to my old school in the morning.
In case you're thinking "where is it?" (it's only credit-card sized) it's to the right of Lightning McQueen and Tow Mater, between the keyboard and the monitor with an aptly raspberry coloured ethernet cable attached. Here's a close-up.
And here's cyber-dojo running in Midori.
More Pies have been ordered and should be arriving in the next few days.
Many thanks for your donations. Keep them coming!
Hi. I'm Jon Jagger, director of software at Kosli.
I built cyber-dojo, the place teams practice programming.
Cadora salmon
Today I have mostly been fly fishing for salmon on the River Wye at the Cadora beat.
I missed a good take on Cadora pool on my fifth cast!
About half and hour later I had another take. This time on Little Run.
Didn't miss this one :-)
Cock fish, quite thin, measuring 34 inches from nose to tail. I'm guessing 13lb ish.
After taking my hook out (a Cascade) I noticed
another fly hook with some line attached!
It took a while to recover before swimming away - perhaps
it had just smashed someone else up!?
holes
is an excellent book by Louis Sachar (isbn 0-439-12845-5).
If you've not seen the film the story revolves around a boy called Stanley, whose offered the choice of going to jail or going to Camp Green Lake. He chooses the lake. Each day he has to dig a hole five feet deep and five feet in diameter.
As usual I'm going to quote from a few pages, particularly the ones about digging the holes. They remind me of refactoring, and the pain of introducing a test-seam into legacy code:
As usual I'm going to quote from a few pages, particularly the ones about digging the holes. They remind me of refactoring, and the pain of introducing a test-seam into legacy code:
There is no lake at Camp Green Lake.
Using all his might, he brought the shovel back down onto the dry lake bed. The force stung his hands but made no impression on the earth.
...
He noticed a thin crack in the ground. He placed the point of his shovel on top of it, then jumped on the back of the blade with both feet. The shovel sank a few inches into the packed earth. He smiled. For once in his life it paid to be overweight. He leaned on the shaft and pried up his first shovelful of dirt, then dumped it off to the side. Only ten million more to go, he thought, then placed the shovel back in the crack and jumped on it again. He unearthed several shovelfuls of dirt in this manner, before it occurred to him that he was dumping his dirt within the perimeter of his hole.
The digging got easier after a while. The ground was hardest at the surface, where the sun had baked a crust about eight inches deep. Beneath that, the earth was looser.
Though he tried to convince himself otherwise, he'd been aware for a while that his piles of dirt were too close to his hole. The piles were outside his five-foot circle, but he could see he was going to run out of room. Still, he pretended otherwise and kept adding more dirt to the piles, piles that he would eventually have to move. The problem was that when the dirt was in the ground, it was compacted. It expanded when it was excavated. The piles were a lot bigger than his holes were deep. It was either now or later. Reluctantly, he climbed up out of his hole, and once again dug his shovel into his previously dug dirt.
Stanley kept digging. His hole was almost up to his shoulders, although it was hard to tell exactly where ground level was because his dirt piles completely surrounded the hole. The deeper he got, the harder it was to raise the dirt up and out of the hole. Once again, he realized, he was going to have to move the piles.
As he dug he was careful to dump the dirt far away from the hole. He needed to save the area around the hole for when his hole was much deeper.
"Well, the first hole's the hardest," Magnet said.
"Well, the first hole's the hardest," said Stanley. "No way," said X-Ray. "The second hole's a lot harder. You're hurting before you even get started. If you think you're sore now, just wait and see how you feel tomorrow morning, right?" "That's right," said Squid. "Plus, the fun's gone," said X-Ray.
"You're right," he said to X-Ray. "The second hole's the hardest." X-Ray shook his head. "The third hole's the hardest," he said.
That meant he'd dug forty-four holes. Stanley dug his shovel into the dirt. Hole number 45. "The forty-fifth hole is the hardest," he said to himself. But that really wasn't true, and he knew it. He was a lot stronger than when he first arrived. His body had adjusted somewhat to the heat and harsh conditions.
dig the trenches before the bombs start falling
If I write code without tests I will end up with low quality code.
Worse - I'll discover that having written code without tests I've naturally
ended up with a codebase that resists being tested.
When this happens the codebase is not being 'malicious'.
That's just that way it is. That's exactly the way I grew it.
Testability isn't something that appears by magic.
If I want a codebase to be testable I have to write tests for it as I go along.
So that I find out just how testable it actually is and steer accordingly.
Sun Tzu put it very well in The Art of War when he wrote:
Sun Tzu put it very well in The Art of War when he wrote:
Plan for what is difficult while it is easy, do what is great while it is small.
out of inodes!
A huge thanks to everyone who tweeted about cyber-dojo donations going to buy Raspberry Pies for schools.
It caused a big surge of use on the site :-)
Which unfortunately brought the site down :-(
At first I thought the 'No space left on device' message meant I'd run out of disk space. However a df revealed plenty of 1K blocks still available. The problem was not lack of disk space it was lack of inodes! This is because cyber-dojo uses a lot of files (every press of the run-the-tests button results in a git commit). I put a temporary fix in place by recovering a few thousand inodes. That gave me enough time to put a better fix in place - some scripts to zip and prune dojos based on both their age and total number of traffic-lights. Successive prunings reclaimed 231,941 inodes which should last a while. Sorry for the glitch.
At first I thought the 'No space left on device' message meant I'd run out of disk space. However a df revealed plenty of 1K blocks still available. The problem was not lack of disk space it was lack of inodes! This is because cyber-dojo uses a lot of files (every press of the run-the-tests button results in a git commit). I put a temporary fix in place by recovering a few thousand inodes. That gave me enough time to put a better fix in place - some scripts to zip and prune dojos based on both their age and total number of traffic-lights. Successive prunings reclaimed 231,941 inodes which should last a while. Sorry for the glitch.
raising money for Raspberry Pies
I built cyber-dojo to help promote deliberate practice of
test-driven-development at the team level.
It's free (beer and speech), there's no login or registration and there are no adverts.
It's hosted in the cloud and, until a few moments ago, its home page
had a small donate button to help pay for the hosting.
After hearing Eben Upton's keynote at the Agile on the beach conference I've decided that from all previous and future donations will go 100% towards raising money to buy Raspberry Pies for schools.
Please help publicise this in any way you can! Thank you.
After hearing Eben Upton's keynote at the Agile on the beach conference I've decided that from all previous and future donations will go 100% towards raising money to buy Raspberry Pies for schools.
Please help publicise this in any way you can! Thank you.
Gus and the breakfast police
At breakfast on the second day of Agile on the beach I was queueing behind my friend Gus Power.
Gus asked for two sausages and was told he could only have one.
I knew what he was about to say next so I intervened in the interest of trying to keep the queue moving at some speed slightly faster than stopped, and said
"And you can't trade one item for another either".
So Gus had just one sausage. And Odette was not allowed a fried egg either - but could have scrambled egg. I thought for a moment and, when it was my turn, I said - "I'll have the maximum I can have of everything please." I got one piece of bacon, one scoop of scrambled egg, one scoop of beans, one scoop of mushrooms, one of those reconstituted potato croquette things, two pieces of toast, two individually wrapped "bricks" of butter, two plastic containers in the shape of a miniature thumb-sized bath containing marmalade, and... a sausage. I walked over to where Gus and Odette were sitting and joined them. I gave the sausage to Gus, explaining that I didn't want most of the food - but I did want Gus to have two sausages.
The point of this story is not to whine about the conference. It was a really excellent conference. The breakfast staff usually serve students which may have something to do with the somewhat draconian rules. The point is that overly rigid rules foster bureaucracy and generally end up self-defeating. The intention behind the rules, to avoid waste, is laudable. But rigid rules and their associated lack of trust in both the servers and the served simply creates more waste. A system like that invites people to live down to its expectations.
So Gus had just one sausage. And Odette was not allowed a fried egg either - but could have scrambled egg. I thought for a moment and, when it was my turn, I said - "I'll have the maximum I can have of everything please." I got one piece of bacon, one scoop of scrambled egg, one scoop of beans, one scoop of mushrooms, one of those reconstituted potato croquette things, two pieces of toast, two individually wrapped "bricks" of butter, two plastic containers in the shape of a miniature thumb-sized bath containing marmalade, and... a sausage. I walked over to where Gus and Odette were sitting and joined them. I gave the sausage to Gus, explaining that I didn't want most of the food - but I did want Gus to have two sausages.
The point of this story is not to whine about the conference. It was a really excellent conference. The breakfast staff usually serve students which may have something to do with the somewhat draconian rules. The point is that overly rigid rules foster bureaucracy and generally end up self-defeating. The intention behind the rules, to avoid waste, is laudable. But rigid rules and their associated lack of trust in both the servers and the served simply creates more waste. A system like that invites people to live down to its expectations.
Agile on the beach
Last week I attended the excellent Agile on the beach conference in Falmouth, Cornwall. I'm really proud to have been the consultant who provided most of the technical-tdd agile training that has helped create 50 new jobs in Cornwall.
I thought Schalk Cronjé's talk was excellent. So was the one Ed Sykes did. And Seb Rose too. The highlight for me was Eben Upton's endnote. Inspiring. I'm going to visit my old secondary school and see if they want half-a-dozen Raspberry Pies. And I'm going to buy one for myself and put Cyber-Dojo onto it. I ran a double cyber-dojo session at the conference and several teachers said they wanted to run cyber-dojos as part of their course - fantastic.
I thought Schalk Cronjé's talk was excellent. So was the one Ed Sykes did. And Seb Rose too. The highlight for me was Eben Upton's endnote. Inspiring. I'm going to visit my old secondary school and see if they want half-a-dozen Raspberry Pies. And I'm going to buy one for myself and put Cyber-Dojo onto it. I ran a double cyber-dojo session at the conference and several teachers said they wanted to run cyber-dojos as part of their course - fantastic.
frozen names
A radio phone-in caller reminded me of the Label Law yesterday - the name of the thing is not the thing.
The caller said his local shop is run by an Indian gentleman who everyone calls Ray. For 15 years the caller has called him Ray. But, he recently discovered, his name is not Ray. It's not even close. He explained that everyone calls him Ray because the previous owner of the shop was called Ray. At least that's what he's been told. Maybe the previous owner was called Ray because the previous previous owner was called Ray!
It's a bit like sixth form college. That's the school you used to go to after you'd finished five years at secondary school. But in 1990-ish they changed the numbering scheme. Now the year number is the number of years you've been in education. One for your first year at primary school, eleven for your last year at secondary school. So now sixth form college is where you go after you've finished year eleven. But it's still called sixth form college.
I'm also reminded of something Jerry Weinberg wrote in Experiential Learning - Vol 3 Simulation.
If you don't know why you're putting eye-of-newt into the cauldron then you're in trouble when the magic potion stops working. And if you don't understand why eye-of-newt works, you'll probably be afraid to change the recipe.
It's a bit like sixth form college. That's the school you used to go to after you'd finished five years at secondary school. But in 1990-ish they changed the numbering scheme. Now the year number is the number of years you've been in education. One for your first year at primary school, eleven for your last year at secondary school. So now sixth form college is where you go after you've finished year eleven. But it's still called sixth form college.
I'm also reminded of something Jerry Weinberg wrote in Experiential Learning - Vol 3 Simulation.
Rules are frozen solutions. Rules are solutions to yesterday's problem, carried forward to the present, but usually without reference to the problem they were intended to solve. Each rule is really an "if-then" rule, but the "if-then" part is seldom stated.
If you don't know why you're putting eye-of-newt into the cauldron then you're in trouble when the magic potion stops working. And if you don't understand why eye-of-newt works, you'll probably be afraid to change the recipe.
practice and observation
I want to get better at speycasting. I need to know how I'm currently doing and what aspects of my casting to pay attention to next. Those are exactly what I don't know. To make rapid progress I need the help of another person - someone who is both an expert at speycasting and also an expert at teaching speycasting. In my case that person is Gary Scott (who took this short video).
I've no doubt there are masses of faults in my casting technique. That's irrelevant and not helpful and does not deter me at all. What counts is working towards some improvement in the next video.
refactoring in the shower
Some houses are populated only with teenagers. When one gets in the shower they notice the plug-hole is clogged with horrible gunk: hairs of indeterminate origin, bits of soap, spit, bogies, general fluff (like the stuff that grows in your belly button), congealed shower gel, etc., etc.,. But they don't clean out the plug-hole. After all, they didn't make the mess. When they've finished they're cleaner. But only slightly. And they don't clean the plug-hole. Partly because they then notice there's no towel. They curse the other teenagers as they walk around the house naked, dripping water as they go, looking for anything vaguely absorbant they can commandeer.
After a while the plug-hole gets so gunked up tackling it becomes a truly repulsive task. It actually clogs the plug-hole. The shower fills with water - it starts turning into a bath! But it wasn't designed as a bath. Splashes leak over the lip of the door. Water collects under the shower base where it's not visible. Not at first anyway. After a while the ceiling below the shower starts to discolour in a tell-tale circular pattern. But it goes unnoticed. At first anyway. Soon the ring grows so large it's unmissable. But it's ignored. After all, it's a full-scale call-the-plumber-and-tiler job now.
Some houses contain a mixture of teenagers and adults. When a teenager showers sometimes the plug-hole is gunk free and there's a dry towel but sometimes the plug-hole is gunked up and there's no dry towel. They can't quite understand this. But they never clean the plug-hole and never put up a clean dry towel. When an adult showers sometimes there's a build-up of plug-hole-gunk and no dry towel. They know the previous shower-goer was a teenager. Sometimes there's no plug-hole-gunk and there is a dry towel. They know the previous shower-goer was an adult. When they've finished they clean out any plug-hole-gunk and put up a new dry towel.
Some houses house only responsible adults. Whenever they start to shower they don't notice any gunk around the plug-hole because there never is any. And there's always a fresh clean towel. After they've showered they clear any plug-hole gunk and put up a new dry towel.
After a while the plug-hole gets so gunked up tackling it becomes a truly repulsive task. It actually clogs the plug-hole. The shower fills with water - it starts turning into a bath! But it wasn't designed as a bath. Splashes leak over the lip of the door. Water collects under the shower base where it's not visible. Not at first anyway. After a while the ceiling below the shower starts to discolour in a tell-tale circular pattern. But it goes unnoticed. At first anyway. Soon the ring grows so large it's unmissable. But it's ignored. After all, it's a full-scale call-the-plumber-and-tiler job now.
Some houses contain a mixture of teenagers and adults. When a teenager showers sometimes the plug-hole is gunk free and there's a dry towel but sometimes the plug-hole is gunked up and there's no dry towel. They can't quite understand this. But they never clean the plug-hole and never put up a clean dry towel. When an adult showers sometimes there's a build-up of plug-hole-gunk and no dry towel. They know the previous shower-goer was a teenager. Sometimes there's no plug-hole-gunk and there is a dry towel. They know the previous shower-goer was an adult. When they've finished they clean out any plug-hole-gunk and put up a new dry towel.
Some houses house only responsible adults. Whenever they start to shower they don't notice any gunk around the plug-hole because there never is any. And there's always a fresh clean towel. After they've showered they clear any plug-hole gunk and put up a new dry towel.
my first salmon on the fly
Catching, reviving, and releasing my first ever fly caught salmon (from the River Tay at Dunkeld) :-)
A huge thank you to my spey casting instructor and guide (who took the videos)
Gary Scott,
a world champion caster and a fantastically good teacher.
Some days you remember all your life :-)
Some days you remember all your life :-)
amplify & dampen
You know how sometimes the universe seems to be trying to tell you something? I had one of those experiences the other day. I was looking through my notes from the ALE2011 conference keynote Dave Snowden gave. I wrote
A short while later I was reading Surfing the Edge of Chaos and I came across this on page 93
There it was again, amplify & dampen. I was sure this was a theme Jerry Weinberg had written about somewhere but try as I might I couldn't track it down. About an hour or so later I spotted a small red notebook on my bookshelf. I hadn't looked at it in over a year but for some reason I decided to pick it up. On the second page I looked at I'd written the following quote from Quality Software Management, vol 3, Congruent Action on page 95
You know things differently in ordered-systems compared to complex-adaptive-systems. In complex adaptive systems you need discipline, you need safe-to-fail probes. You won't know the effect the probes will have. If the probes have a good effect you need to amplify them. If the probes have a bad effect you need to dampen them. Your strategies for amplifying and damping need to be planned ahead of time.
A short while later I was reading Surfing the Edge of Chaos and I came across this on page 93
The olfactory cells, which provide mammals with their sense of smell, delicately tune receptors to dampen out familiar smells and rapidly amplify receptors with new smells. This is the way the brain is alerted to new dangers or opportunities.
There it was again, amplify & dampen. I was sure this was a theme Jerry Weinberg had written about somewhere but try as I might I couldn't track it down. About an hour or so later I spotted a small red notebook on my bookshelf. I hadn't looked at it in over a year but for some reason I decided to pick it up. On the second page I looked at I'd written the following quote from Quality Software Management, vol 3, Congruent Action on page 95
A basic law of perception is that we tend to minimize small differences (tendency toward assimilation) and to exaggerate appreciable differences (tendency toward contrast). Thus, our perceptions make the world more sharply differentiated than it is, and we're a lot more alike than we are different.
no scaffolding means we're done
Suppose I'm doing the print-diamond kata in cyber-dojo in Java. I start with a test
But suppose you get hit by a bus tomorrow. How easily could your colleagues tell that this code was work in progress? Code that was not finished?
As an experiment I thought I would try an alternative style. One that is not so relaxed about the asymmetry. One that tries a bit harder to be more explicit about distinguishing code that's a temporary step still on the path from code that has reached its destination.
First I wrote a test that expresses the fact that nothing is implemented.
I have unreachable scaffolding.
Time for the scaffolding to come down.
I delete the throw statement.
We're green.
The scaffolding is gone.
We're done.
@Test
public void diamond_A() {
String[] expected = {
"A"
};
String[] actual = new Diamond('A').toLines();
assertArrayEquals(expected, actual);
}
I slime a solution as follows
public class Diamond {
private char widest;
public Diamond(char widest) {
this.widest = widest;
}
public String[] toLines() {
return new String[]{ "A" };
}
}
now I add a second test
@Test
public void diamond_B() {
String[] expected = {
" A ",
"B B",
" A ",
};
String[] actual = new Diamond('B').toLines();
assertArrayEquals(expected, actual);
}
and I slime again as follows
public class Diamond {
private char widest;
public Diamond(char widest) {
this.widest = widest;
}
public String[] toLines() {
if (widest == 'A')
return new String[] {
"A"
};
else
return new String[] {
" A ",
"B B",
" A ",
};
}
}
Like all techniques this approach has a certain style.
In this case there is a small but definite asymmetry between the specificness of the tests
(one for 'A' and another one for 'B') and the slightly less specificness of the code (an explicit if for 'A' but a default everything-else for 'B').
This is a style that is relaxed about the asymmetry, a style that emphasises this step as merely one temporary step on the path of many steps leading towards something more permanent. A style that recognises that code, by it's nature, is always going to be more general than tests.
But suppose you get hit by a bus tomorrow. How easily could your colleagues tell that this code was work in progress? Code that was not finished?
As an experiment I thought I would try an alternative style. One that is not so relaxed about the asymmetry. One that tries a bit harder to be more explicit about distinguishing code that's a temporary step still on the path from code that has reached its destination.
First I wrote a test that expresses the fact that nothing is implemented.
@Test(expected = ScaffoldingException.class)
public void scaffolding() {
new Diamond('Z').toLines();
}
I make this pass as follows
public class Diamond {
private char widest;
public Diamond(char widest) {
this.widest = widest;
}
public String[] toLines() {
throw new ScaffoldingException("not done");
}
}
The scaffolding, as its name suggests, will have to be taken down once the code is done.
While it remains, it indicates that the code is not done.
Now I start.
I add the diamond_A test (as before) and make it pass
public class Diamond {
...
public String[] toLines() {
if (widest == 'A') {
return new String[]{ "A" };
}
throw new ScaffoldingException("not done");
}
}
I add a second diamond_B test (as before) and make it pass
public class Diamond {
...
public String[] toLines() {
if (widest == 'A')
return new String[] {
"A"
};
if (widest == 'B')
return new String[] {
" A ",
"B B",
" A ",
};
throw new ScaffoldingException("not done");
}
}
The scaffolding is still there.
We haven't finished yet.
Now suppose I refactor the slime (by deliberately duplicating) and end up with this
public class Diamond {
...
public String[] toLines() {
if (widest == 'A') {
String[] inner = innerDiamond();
String[] result = new String[inner.length-1];
int mid = inner.length / 2;
for (int dst=0,src=0; src != inner.length; src++)
if (src != mid)
result[dst++] = inner[src];
return result;
}
if (widest == 'B') {
String[] inner = innerDiamond();
String[] result = new String[inner.length-1];
int mid = inner.length / 2;
for (int dst=0,src=0; src != inner.length; src++)
if (src != mid)
result[dst++] = inner[src];
return result;
}
throw new ScaffoldingException("not done");
}
}
The code inside the two if statements is (deliberately) identical so I refactor to this
public class Diamond {
...
public String[] toLines() {
if (widest == 'A' || widest == 'B') {
String[] inner = innerDiamond();
String[] result = new String[inner.length-1];
int mid = inner.length / 2;
for (int dst=0,src=0; src != inner.length; src++)
if (src != mid)
result[dst++] = inner[src];
return result;
}
throw new ScaffoldingException("not done");
}
}
Now I add a new test for 'C'
@Test
public void diamond_C() {
String[] expected = {
" A ",
" B B ",
"C C",
" B B ",
" A ",
};
String[] actual = new Diamond('C').toLines();
assertArrayEquals(expected, actual);
}
This fails. I make it pass by changing the line
if (widest == 'A' || widest == 'B')
to
if (widest == 'A' || widest == 'B' || widest == 'C')
Now I remove the if completely
public class Diamond {
...
public String[] toLines() {
String[] inner = innerDiamond();
String[] result = new String[inner.length-1];
int mid = inner.length / 2;
for (int dst=0,src=0; src != inner.length; src++)
if (src != mid)
result[dst++] = inner[src];
return result;
throw new ScaffoldingException("not done");
}
}
And it no longer compiles. I have unreachable scaffolding.
Time for the scaffolding to come down.
I delete the throw statement.
public class Diamond {
...
public String[] toLines() {
String[] inner = innerDiamond();
String[] result = new String[inner.length-1];
int mid = inner.length / 2;
for (int dst=0,src=0; src != inner.length; src++)
if (src != mid)
result[dst++] = inner[src];
return result;
}
}
Now the scaffolding() test fails. I delete that too.We're green.
The scaffolding is gone.
We're done.
surfing the edge of chaos
is an excellent book by Richard Pascale, Mark Millemann, and Linda Gioja (isbn 0-609-80883-4).
As usual I'm going to quote from a few pages:
As a general rule, adults are much more likely to act their way into a new way of thinking than to think their way into a new way of acting.
Recent study of evolution, both in the natural world and in computer based complex systems, has demonstrated the surprising result that the presence of parasites in a system accelerates evolution dramatically.
The average corporation lives only half as long as the average human being.
The defining feature of a complex adaptive system is its ability to learn.
As the process unfolded, employees repeatedly asked Shapiro to give a more definitive shape to his "vision". He refused to do so. "It will only get in the way," he countered. "People will take it too seriously."
Because we thought our job was to persuade, too often we forgot to listen.
How a system connects with its "external" world is also a key source of that system's health.
Feedback is the means by which a system talks to itself.
Bacteria require three years to circumvent the latest antibiotic; viruses typically outmaneuver vaccines within a year.
Critical to the impact of the [National Training Center] experience is a cadre of 600 instructors, one of whom is assigned to every person with leadership or supervisory responsibilities. These "observers/controllers," as they are called, shadow their counterparts through day after twenty-hour day of intense activity, provide personal coaching, and facilitate a team debriefing called an After Action Review (AAR).
If you awaken with sore muscles, how you feel depends a lot on whether you think you're getting the flu or you believe you are reaping the benefits of a good workout the day before.
progressive fly fishing for salmon
is an excellent book by Alexander Baird Keachie (isbn 1-86126-048-2). As usual I'm going to quote from a few pages:
If you want the maximum pleasure from the sport, be patient, because the more difficult the trade, the longer is the apprenticeship.
On entering freshwater, 90 percent of the retinas [of Coho salmon] are dominated by porphyropsin, or red visual pigment. ... Initial preliminary microspectrophotometric testing of the Atlantic salmon has shown that their retina colour pigmentation closely follow that of the Coho.
In short, when the water level starts falling, or if the water temperature increases, reduce your size of fly. Conversely if the water height increases, or the water temperature takes a downward turn increase your fly size accordingly.
Wood discovered from his fishing that the speed of the fly in relation to its size was of paramount importance. For instance, he found that the only effective way to fish a small fly was to present it at a speed which would be natural to a creature of similar size.
In my opinion most anglers change their flies too often, generally because they lose faith in it. Moreover, when they change flies it is normally for one of a different colour, and not size, and I believe that this is a great mistake.
In fact he [A.H.E. Wood] did not think pattern made much difference, but considered size of much greater importance. J.A. Hutton asked him why he only ever used two flies, a Blue Charm and a Silver Blue. Wood replied that he didn't care which he used. J.A. Hutton then asked him why then he did not use a March Brown, a fly not commonly used at the time for salmon fishing. To this Wood replied that he would use nothing else for the rest of the season, which he did - and took the same number of fish as he would normally have expected to catch during a season.
The main advantage which tube flies have over other flies is that they can be 'queued'; this means you can create a fly of any length, colour, and weight.
Whatever practices you follow when making the 'D' loop, all movements should be continuous and smooth: these will load a rod progressively, while jerky uneven actions cause irregular loading.
ABC
This just caught my eye at breakfast in a hotel.
I had to look up xeriscape. Wikipedia says it means "landscaping and gardening in ways that reduce or eliminate the need for supplemental water from irrigation".
local optimization, global pessimization
A well known UK company, let's called them B&O, sells bidgets and odgets.
B&O sold me a bidget a few years back.
They did a good job. I like the bidget they sold me. It works well.
B&O rings me know-and-then to ask if I'm thinking of buying another bidget or my first odget.
Recently B&O rang me and I mentioned I was indeed thinking of buying an odget to go with my bidget. The B&O person on the other end of the phone sounded very pleased and arranged for a B&O salesman to visit me to provide me with an odget quote. On the designated day, at the designated time, the B&O salesman, let's call him Stan, arrived.
Stan didn't know that someone at B&O had spoken to me on the phone and arranged for Stan to provide me an odget quote. So I explained, for a second time, the odget I was thinking of, and where it would go and how big it would need to be. Stan said that he could quote for the odget, but, being honest, there was no point. Since the odget I was after was not a regular odget B&O would simply subcontract the work to a builder, and then charge me the builder's cost plus a fat markup. Stan said I'd be much better off hiring a builder myself.
Stan explained that the people at the B&O office get a cash bonus each time an odget quote is made to a prospective customer. Stan further explained that they got this cash bonus regardless of whether the customer actually bought the odget. Predictably, the people in the B&O office work hard to get quotes out. They send B&O salesman out to any and all jobs regardless of how likely the job is to result in actual work. Stan said if a B&O phone-handler phoned me to ask whether I'd received a quote, he'd very much appreciate it if I said no I hadn't because I'd changed my mind and didn't want an odget.
Top marks to Stan. No marks to B&O.
Recently B&O rang me and I mentioned I was indeed thinking of buying an odget to go with my bidget. The B&O person on the other end of the phone sounded very pleased and arranged for a B&O salesman to visit me to provide me with an odget quote. On the designated day, at the designated time, the B&O salesman, let's call him Stan, arrived.
Stan didn't know that someone at B&O had spoken to me on the phone and arranged for Stan to provide me an odget quote. So I explained, for a second time, the odget I was thinking of, and where it would go and how big it would need to be. Stan said that he could quote for the odget, but, being honest, there was no point. Since the odget I was after was not a regular odget B&O would simply subcontract the work to a builder, and then charge me the builder's cost plus a fat markup. Stan said I'd be much better off hiring a builder myself.
Stan explained that the people at the B&O office get a cash bonus each time an odget quote is made to a prospective customer. Stan further explained that they got this cash bonus regardless of whether the customer actually bought the odget. Predictably, the people in the B&O office work hard to get quotes out. They send B&O salesman out to any and all jobs regardless of how likely the job is to result in actual work. Stan said if a B&O phone-handler phoned me to ask whether I'd received a quote, he'd very much appreciate it if I said no I hadn't because I'd changed my mind and didn't want an odget.
Top marks to Stan. No marks to B&O.
the house at pooh corner
is an excellent book by A. A. Milne (isbn 1-4052-1117-2). As usual I'm going to quote from a few pages:
'Now,' said Rabbit, 'this is a Search, and I've Organized it - '
'Done what to it?' said Pooh.
'Organized it. Which means - well, it's what you do to a Search, when you don't all look in the same place at once. So I want you, Pooh, to search by the Six Pine Trees first, and then work you way towards Owl's House, and look out for me there. Do you see?'
'No,' said Pooh. 'What -'
'Then I'll see you at Owl's House in about an hour's time.'
'Is Piglet organdized too?'
'We all are,' said Rabbit, and off he went.
Pooh was sitting in house one day, counting his pots of honey, when there came a knock at the door. 'Fourteen,' said Pooh. 'Come in. Fourteen. Or was it fifteen? Bother. That's muddled me.'
Pooh hadn't thought about it at all, but now he nodded. For suddenly he remembered how he and Piglet had once made a Pooh Trap for Heffalumps, and he guessed what had happened. He and Piglet and fallen into a Heffalump Trap for Poohs! That was what it was.
And he respects Owl, because you can't help respecting anybody who can spell TUESDAY, even if he doesn't spell it right; but spelling isn't everything.
it suddenly came over him that nobody had ever picked Eeyore a bunch of violets, and the more he thought of this, the more he thought how sad it was to be an Animal who had never had a bunch of violets picked for him.
Rabbit came up importantly, nodded to Piglet, and said, 'Ah Eeyore,' in the voice of one who would be saying 'Good-bye' in about two more minutes.
and the big one came out first, which was what he had said it would do, and the little one came out last, which was what he had said it would do, so he had won twice... and when he went home for tea, he had won thirty-six and lost twenty-eight, which meant that he was - that he had - well, you take twenty-eight from thirty-six, and that's what he was. Instead of the other way around.
'They always take longer than you think,' said Rabbit.
'And I was here myself a week ago.'
'Not conversing,' said Eeyore. 'Not first one and then the other. You said "Hallo" and Flashed Past. I saw your tail a hundred yards up the hill as I was meditating my reply. I had thought of saying "What?" - but, of course, it was then too late.'
'Well, I was in a hurry.'
'No Give and Take,' Eeyore went on. 'No Exchange of Thought. "Hallo - What" - mean, it gets you nowhere, particularly if the other person's tail is only just in sight for the second half of the conversation.'
Christopher Robin was telling them what to do, and Rabbit was telling them again directly afterwards, in case they hadn't heard, and then they were all doing it.
'And what about the new house?' asked Pooh.
'Have you found it, Owl?'
'He's found a name for it,' said Christopher Robin, lazily nibbling at a piece of grass, 'so now all he wants is the house.'
He had to write this out two or three times before he could get the rissolution to look like what he thought it was going to when he began to spell it;
'Don't Bustle me,' said Eeyore.
The fact is this is more difficult than I thought,
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)
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'] endI 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
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'
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
@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:
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.
Subscribe to:
Posts (Atom)




























