<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-23912478</id><updated>2011-12-21T08:27:41.549Z</updated><category term='mobile'/><category term='articles'/><category term='correctness'/><category term='comfort'/><category term='direct manipulation'/><category term='lessons from life'/><category term='tools'/><category term='erlang'/><category term='spa 2008'/><category term='metaphor'/><category term='gauges'/><category term='self'/><category term='projects'/><category term='tangential rambling'/><category term='liveness'/><category term='conference'/><category term='agile projects'/><category term='shameless self-promotion dept'/><category term='second opinion'/><category term='real engineers'/><category term='wabi-sabi'/><category term='panel'/><category term='social networking'/><category term='iso 9000'/><category term='RUP'/><category term='mastery'/><category term='agile'/><category term='diffusion'/><category term='metrics'/><category term='Smalltalk'/><category term='web 2.0'/><category term='planning'/><category term='user interface'/><category term='craftsmanship'/><category term='type systems'/><category term='enterprisey'/><category term='kanban'/><category term='modelling'/><category term='xtc'/><category term='tdd'/><category term='code'/><category term='invention'/><category term='rhetoric'/><category term='work'/><category term='formal'/><category term='autopoiesis'/><category term='corporate IT'/><category term='lean'/><category term='solutions focus'/><category term='don&apos;t serialise activities'/><category term='grumpy'/><category term='java'/><category term='alloy'/><category term='engineering'/><category term='patterns'/><category term='process'/><category term='coaches'/><category term='programming'/><category term='politics'/><category term='culture'/><category term='models'/><category term='test-first complexity'/><category term='lisp'/><category term='cynefin'/><category term='german philosophers'/><category term='game'/><category term='teams'/><category term='hiring'/><category term='life'/><category term='programming-qua-programming'/><category term='xpday'/><category term='scrum'/><category term='jobs'/><category term='service oriented architecture'/><category term='innovation'/><category term='book review'/><category term='design'/><category term='quality'/><category term='fail'/><category term='testing'/><category term='architecture'/><category term='velocity'/><category term='blogging'/><category term='government IT'/><category term='conferences'/><category term='examples'/><category term='estimation'/><title type='text'>peripatetic axiom</title><subtitle type='html'>Software, systems and management thereof</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default?start-index=101&amp;max-results=100'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-23912478.post-5702153004999360494</id><published>2011-10-03T17:53:00.002+01:00</published><updated>2011-10-04T15:48:08.320+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hiring'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><title type='text'>Hiring in London: Lead and Principle Consultants...</title><content type='html'>Principal consultants take responsibility for particularly challenging solutions and in demanding organisational environments. They closely interact with senior project managers, customer representatives at all levels including senior management, and guide project teams. Together with the responsible project managers, they lead technical and strategic initiatives to success, ranging from critical consulting mandates to complex delivery projects. Together with business development and business unit managers, they actively expand Zuhlke’s business and develop new opportunities. This can involve taking the leading technical role in large bid&lt;br /&gt;&lt;br /&gt;Lead consultants take decisions and provide advice regarding complex technical systems. They closely liaise with the software development team, the project manager, and customer representatives, often with a technical background. They ensure that sound technical decisions are made and subsequently realised in state-of-the-art solutions by the project team. They can take the leading role in technical consulting assignments within their specialisation area.&lt;br /&gt;&lt;br /&gt;The role is based in London and the majority of the work takes place in UK but on occasion training and consulting engagements may be delivered anywhere in the world.&lt;br /&gt;&lt;br /&gt;The competitive package includes 20 days of professional development time per year.&lt;br /&gt;&lt;br /&gt;The successful applicant will be a skilled in iterative, incremental development using at least one of Java/J2SE, C#/.NET and Adobe Flex. They will be skilled at applying test-driven development using both automated unit tests and automated acceptance/functional tests in a continuous integration environment (continuous build and dev-ops experience a plus). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They will be skilled in recognizing code smells and resolving them through refactoring. The successful applicant will be able to elicit requirements as User Stories (experience of “story mapping” is a bonus) and estimation of effort using Planning Poker and Wideband Delphi. They will be skilled in coaching and supporting a development team to effectively self-organize while maintaining transparency and control of rapid development using techniques from Scrum, Kanban, Extreme Programming and other Lean or Agile approaches. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Experience in a leading role like Scrum Master is required. They will be experienced in coaching individuals and teams in effective use of current good practices in all the areas mentioned above.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Experience delivering classroom training in technical practices such as TDD or build management techniques and a track record of technical publications and conference presentations a plus.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linkedin.com/jobs?jobId=2029148&amp;amp;viewJob="&gt;Apply via LinkedIn&lt;/a&gt;, or drop me a line.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5702153004999360494?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5702153004999360494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5702153004999360494&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5702153004999360494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5702153004999360494'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2011/10/hiring-in-london-lead-and-principle.html' title='Hiring in London: Lead and Principle Consultants...'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5862518852262384871</id><published>2011-07-26T19:04:00.001+01:00</published><updated>2011-07-26T19:05:41.348+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test-first complexity'/><title type='text'>New blog for complexity study</title><content type='html'>My continuing investigation into the effect of TDD on code complexity (and maybe other things, too) will continue on&lt;a href="http://cumulative-hypotheses.org/"&gt; this new blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5862518852262384871?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5862518852262384871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5862518852262384871&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5862518852262384871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5862518852262384871'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2011/07/new-blog-for-complexity-study.html' title='New blog for complexity study'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-226140794666537876</id><published>2011-07-25T14:03:00.004+01:00</published><updated>2011-07-25T14:34:00.669+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile projects'/><title type='text'>Agile has little to say about Projects</title><content type='html'>At the &lt;a href="http://www.agilecoachesgathering.org/wiki/index.php/Home"&gt;2011 UK Agile Coaches Gathering&lt;/a&gt; at &lt;a href="http://www.bletchleypark.org.uk/"&gt;Bletchley &lt;/a&gt;last week I convened a session about the desire for (larger) organizations to execute "projects" but the desire of people working in them to use "agile" techniques. I perceive a contradiction there.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0 0 10px 0; padding: 0; font-size: 0.8em; line-height: 1.6em;"&gt;&lt;a href="http://www.flickr.com/photos/keithbraithwaite/5973248423/" title="Agile has little to say about Projects"&gt;&lt;img src="http://farm7.static.flickr.com/6142/5973248423_73ee8bbd28.jpg" alt="Agile has little to say about Projects by Keith Braithwaite" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="margin: 0;"&gt;&lt;a href="http://www.flickr.com/photos/keithbraithwaite/5973248423/"&gt;Agile has little to say about Projects&lt;/a&gt;, a photo by &lt;a href="http://www.flickr.com/photos/keithbraithwaite/"&gt;Keith Braithwaite&lt;/a&gt; on Flickr.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;For the purposes of the discussion I define a "project" as a management structure with a start date, and end date, a budget and a goal. (It says "goal", but subsequent scribbling makes it look as if it says "goat", prompting one of my colleagues to quip: pick which one you want to sacrifice!)&lt;/p&gt;&lt;p&gt;My contention is that when people talk about managing Agile work they generally mean Scrum or these days Kanban (or something very much like them) and that these techniques talk mainly about the steady state of product development and how to control that. They have relatively little to say about what happens at the beginning of a "project". How to get one signed off, for example. Kanban seems particularly weak on this. Nor what happens at the end of a "project" when a set of features go into production. Scrum seems particularly weak on that. As a side note, when I first started working with banks it took me a long time to properly grasp that when they talk about the "delivery" phase of a project they don't mean the relatively trivial bit at the front where the programmers write code.&lt;/p&gt;&lt;p&gt;So, the conclusions of the group were that projects exist as a management structure to mitigate a certain kind of risk in a certain way. As such, I would not agree with &lt;a href="http://twitter.com/#%21/OlafLewitz/status/94781616232218625"&gt;this tweet&lt;/a&gt; (in reply to one I sent about the very session:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;The concept [of a project] is superfluous as it does not add business value. &lt;/blockquote&gt;&lt;a href="http://twitter.com/#%21/search?q=%23project" title="#project" class="  twitter-hashtag" rel="nofollow"&gt;&lt;span class="hash"&gt;&lt;/span&gt;&lt;span class="hash-text"&gt;&lt;/span&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;the concept seems to persist as (some people) believe that having projects allows them to protect money. They might be mistaken: thinking about risk in software development is often wrong, but the idea of a project cannot be dismissed out of hand.&lt;/p&gt;&lt;p&gt;The group observed that different stakeholders have different concerns at different size and time scales, and these are nested. Scrum and Kanban talk mostly about the innermost few layers of the onion.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There was a concrete recommendation: when communicating from the inner part of the onion (smaller scale, shorter time frame) to the outer, do not talk about "iterations" or  "cadence" or much of anything time based. Talk about money: pay something in this range, get something in that range.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-226140794666537876?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/226140794666537876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=226140794666537876&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/226140794666537876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/226140794666537876'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2011/07/agile-has-little-to-say-about-projects.html' title='Agile has little to say about Projects'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6142/5973248423_73ee8bbd28_t.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-8640889179716499825</id><published>2011-07-25T11:16:00.007+01:00</published><updated>2011-07-25T14:06:22.987+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='coaches'/><title type='text'>Agile Charlatans</title><content type='html'>At the &lt;a href="http://www.agilecoachesgathering.org/wiki/index.php/Home"&gt;2011 UK Agile Coaches Gathering&lt;/a&gt; at &lt;a href="http://www.bletchleypark.org.uk/"&gt;Bletchley &lt;/a&gt;last week I convened a session which was prompted by comments like &lt;a href="http://www.reddit.com/r/programming/comments/ge2am/save_your_cleverness_take_the_shortcut_build_the/c1mwim2"&gt;this one&lt;/a&gt; from reddit user &lt;a href="http://www.reddit.com/user/grauenwolf"&gt;grauenwolf&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;I used to think people like you were quacks, but now I see that there are teams that really need your services.&lt;/blockquote&gt;Grauenwolf and I have both been on reddit or a good long while and we've had a few...full and frank exchanges of opinion about the merits of this thing called "Agile". The issues I wanted to address in the session were: what causes competent professionals like grauenwolf to think that the sort of people who would go to something like an "Agile Coaches Gathering" are quacks, and what changes their mind? How might we do less of the former and more of the latter?&lt;br /&gt;&lt;br /&gt;The output is captured here:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0 0 10px 0; padding: 0; font-size: 0.8em; line-height: 1.6em;"&gt;&lt;a href="http://www.flickr.com/photos/keithbraithwaite/5973249039/" title="The &amp;quot;Agile Charlatan&amp;quot; Problem"&gt;&lt;img src="http://farm7.static.flickr.com/6005/5973249039_be90a010a9.jpg" alt="The &amp;quot;Agile Charlatan&amp;quot; Problem by Keith Braithwaite" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="margin: 0;"&gt;&lt;a href="http://www.flickr.com/photos/keithbraithwaite/5973249039/"&gt;The "Agile Charlatan" Problem&lt;/a&gt;, a photo by &lt;a href="http://www.flickr.com/photos/keithbraithwaite/"&gt;Keith Braithwaite&lt;/a&gt; on Flickr.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;It needs some explanation, though.&lt;br /&gt;&lt;br /&gt;"Quack" is an evocative word. "Snake-oil salesman". "Charlatan". We felt that these words appeal to an analogy something along these lines: Agile consultants are like bogus medical practitioners.&lt;br /&gt;&lt;br /&gt;The poster shows a 2-by-2 matrix (naturally!): well or ill against conventional medicine or alternative therapy. The model is that conventional medicine is mainly for people who really are ill and need to get better, while alternative therapy is mainly for people who are basically well but feel entitled to be "well-er".&lt;br /&gt;&lt;br /&gt;Yes, that is quite cynical. We did talk about the fact that some alternative therapies do work, for the things they work for, but when that happens it's not for the reason that the practitioner thinks. And we talked about how&lt;a href="http://www.cochrane.org/about-us/evidence-based-health-care"&gt; some conventional medicine is not nearly as well founded&lt;/a&gt; as many people would like (you) to think. But, bear with me.&lt;br /&gt;&lt;br /&gt;So, the top right and bottom left cells of the chart are the exemplars. Bottom right is the really bad place: trying to treat a mangled road traffic accident victim with a very, very, very dilute solution of London Bus, for example.  Top left is pretty bad too: pushing pills for restless leg syndrome and things even less needing of allopathic intervention.&lt;br /&gt;&lt;br /&gt;It seems that there is a problem with some kinds of Agile coaching or consulting or training or certification practices. They could be trying to address a really serious organizational problems with techniques that cannot possibly help (and maybe they even know it), or they can be barging in to teams that are functioning perfectly well and crashing about the place changing things that don't need to change.&lt;br /&gt;&lt;br /&gt;How could we recognise these cases? Maybe this way:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;conventional medicine often leads to treatment regimes that are quite unpleasant&lt;/li&gt;&lt;li&gt;people often need to be talked into consulting a conventional medic (partly because of [1])&lt;/li&gt;&lt;/ol&gt;vs&lt;br /&gt;&lt;ol&gt;&lt;li&gt;alternative therapies are often really rather enjoyable&lt;/li&gt;&lt;li&gt;people often self-refer to an alternative practitioner (partly because of [1])&lt;/li&gt;&lt;/ol&gt;How to avoid breaking a working team by spuriously making them "Agile"? Watch out for one-size-fits-all solutions. Watch out for inflexibility, a rejection of new ideas (on the part of the consultant or coach).&lt;br /&gt;&lt;br /&gt;How to increase the chances that you're really helping? Look for objective evidence of improvement, change your behaviour based upon that evidence.&lt;br /&gt;&lt;br /&gt;The final question we came up with extends the analogy. If Agile coaches are a bit like certain kinds of medical practitioners, then what is the equivalent for us of &lt;span style="font-style: italic;"&gt;public health&lt;/span&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-8640889179716499825?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/8640889179716499825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=8640889179716499825&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/8640889179716499825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/8640889179716499825'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2011/07/agile-charlatans.html' title='Agile Charlatans'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6005/5973249039_be90a010a9_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-8259619695732996530</id><published>2010-10-25T22:54:00.003+01:00</published><updated>2010-10-25T23:24:38.919+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lessons from life'/><title type='text'>No More Than Two</title><content type='html'>London’s “convenience” stores are replacing staffed checkouts with self-service robots. Some of these offer lessons in user interface design painful to behold.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This evening I watched someone attempt to use one to buy paracetamol. The particular self-service robot checkout that I saw presented the user with a message very much like “paracetamol sale: you may only buy two packs” above a yes/no button pair. What is the casual paracetamol buyer to make of this? I watched with interest as my co-emptor pondered this. And then she did the only reasonable thing: she went and got a second pack. After all, it does say you may &lt;i&gt;only&lt;/i&gt; buy two packs. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quite what anyone is supposed to make of the yes/no buttons following a statement not a question I don't know.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The really sad thing is that, apart from the shame of confusing your customer, the behaviour I saw here—which I believe is the only reasonably response to the message from the robot—is &lt;i&gt;the exact opposite&lt;/i&gt; of what is intended.               &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-8259619695732996530?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/8259619695732996530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=8259619695732996530&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/8259619695732996530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/8259619695732996530'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/10/no-more-than-two.html' title='No More Than Two'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-870803979070942486</id><published>2010-05-22T21:19:00.004+01:00</published><updated>2010-05-22T21:36:23.030+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cynefin'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>fixed-length iterations: a transitional practice</title><content type='html'>I find it had to think of a development practice that isn't almost certainly a transitional practice. Configuration management, maybe.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, Scrum, XP, and all the rest I've come to understand as each a record of a reaction against some bad condition, with transitional practices to get a team away form that condition to a better one. Fo example, as Michael Feathers says in&lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2010/04/zenolength-iterations.html"&gt; this post&lt;/a&gt;, regular, fixed-length Iterations require (and enable) a certain kind of discipline, force a certain set of tradeoffs. And maybe doing that can help a team a lot. And maybe not, as the case may be. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That doesn't mean that, once the use of that practice has taken the team away from the bad condition then no further change to practices can be beneficial.   In the specific case of regular fixed-length iterations I mainly see the application being to teams moving from a condition where no-one ever has any idea at all when anything is going to be delivered to a condition where everyone always knows a date when something is going to be delivered. In many settings that would be considered a major improvement by those paying the team. And consistently working that way is a great way for a team to gain the trust of the business. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once that trust is established, and once the conditions are in place for frequent delivery, what need for the fixed-length iterations? I suspect that what worries a lot of people who've seen the transition from chaos to iterations is that they can't imagine a world without iterations which is not also a (return to) chaos. Michael suggests an experiment:&lt;blockquote&gt;Suppose that you had an iteration of one week, followed by an iteration of 2 days, followed by an iteration of 1 day, followed by an iteration of one-half a day, and so on.  If you still had your sanity at the end of this process, would you have learned anything?  I haven’t tried it with a team yet, but here’s the thing that I hope would come across: if you apply enough ingenuity and you’ve acquired enough skill, you can deliver business value in shorter times than you can currently imagine. &lt;/blockquote&gt;That would be cool. Of course, the Kanbanista's seem to suggest going straight to that world in one step. And maybe that can work in a certain setting, and maybe not. The idea scares me, whe I look at most of the teams I help.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The aspect of this sort of thing that really interests me, though, is this: if what the Certified Scrum Masters say about software development living on the &lt;a href="http://www.controlchaos.com/seminal-articles/"&gt;“edge of chaos”&lt;/a&gt; is right and if what the &lt;a href="http://en.wikipedia.org/wiki/Cynefin"&gt;Cynefin&lt;/a&gt; people say about that being exactly the place where “emergent practice” lives then by their own argument, we would expect Scrum to consist of mostly transitional practices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fixed-length iterations (excuse me, “sprints”) seem like a good candidate to be one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-870803979070942486?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/870803979070942486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=870803979070942486&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/870803979070942486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/870803979070942486'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/05/fixed-length-iterations-transitional.html' title='fixed-length iterations: a transitional practice'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7791156822579547495</id><published>2010-05-20T15:04:00.003+01:00</published><updated>2010-05-20T17:58:23.537+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='government IT'/><title type='text'>Government IT projects: who can politicians listen to?</title><content type='html'>As you may have heard, the UK has at the time of writing a rather confusing new government. We, and I suspect, they are still trying to understand what this means.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing that it might mean is an opportunity for government departments to change the way they deal with their IT suppliers. Recently (ie during the Labour administration we had since 1997 until 2010), it hasn't gone well.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Accenture build a system for the RPA: not fit for purpose, &lt;a href="http://www.zdnet.com/blog/projectfailures/uk-rural-payments-agency-rpa-it-failure-and-gross-incompetence-screws-farmers/536"&gt;£46.5 million overspend&lt;/a&gt;&lt;/li&gt;&lt;li&gt;BT, Fujitsu and others build NPfIT for the NHS: not fit for purpose, &lt;a href="http://www.zdnet.co.uk/blogs/security-bullet-in-10000166/campaigners-criticise-10bn-nhs-it-overspend-10014501/"&gt;£10.4 billion (with a “b”) overspend&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fujitsu build an information system for magistrates courts: &lt;a href="http://www.computerweekly.com/Articles/2009/11/20/239392/More-than-half-of-16319bn-overspend-on-government-projects-due-to.htm"&gt;£342 million overspend&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Cap Gemini build PRISM for the FCO: not fit for purpose, £34.5 million overspend&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And so on. It has been estimated that the ten worst IT project failures under Labour cost the country around &lt;a href="http://www.eweekeurope.co.uk/news/news-government-it/cost-of-labours-botched-it-projects-exposed-3076"&gt;£26 billion&lt;/a&gt;. That's half the annual budget for schools. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, a new government setting out to tame a spectacular deficit might want to bring these projects under control. Unfortunately, they get their advice from places such as Fujitsu, the very firms who do so well form these failed projects. &lt;a href="http://www.computing.co.uk/computing/analysis/2263194/labour-legacy-live-haunt"&gt;Says Fujitsu's marketing director Simon Carter&lt;/a&gt;  of discussions held with the Conservatives when they were still the shadow cabinet:&lt;blockquote&gt;[the Conservatives] began to take on some of our suggestions, as they came to better understand government IT. For example, their proposal to cut IT contracts into smaller and shorter chunks was dropped as they realised they would have to act as system integrator to each of these smaller projects.&lt;/blockquote&gt;What is the taxpayer to do in the face of this sort of thing? Particularly the well–informed taxpayer who knows full well that in no way whatsoever is this argument from Mr Carter valid. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this year's Spa conference there was a Birds of a Feather session about this issue. Some of the signatories of &lt;a href="http://petitions.number10.gov.uk/ITProcessReview/"&gt;this petition&lt;/a&gt;—a petition only 62 signatures away, as I write, from the 500 needed for it to have anyone inside 10 Downing Street pay any attention to it. If you are a UK resident and would rather that the new government were not wasting money on entirely   avoidable IT project failures I urge you to sign the petition and to urge others to.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7791156822579547495?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7791156822579547495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7791156822579547495&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7791156822579547495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7791156822579547495'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/05/government-it-projects-who-can.html' title='Government IT projects: who can politicians listen to?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5756528084650378871</id><published>2010-05-16T08:59:00.004+01:00</published><updated>2010-05-16T09:44:42.291+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lessons from life'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>T-shaped designers</title><content type='html'>BBC 2 is running a series of documentaries called &lt;i&gt;The Genius of Design&lt;/i&gt;. Programme 2 is "Design for Living"  and discusses, amongst other things, the &lt;a href="http://www.bauhaus-dessau.de/index.php?en"&gt;Bauhaus&lt;/a&gt; and its influence. It's getting on for a century since the hay-day of the Bauhaus and it's always worth being reminded of the influence it had—got any tubular steel furniture in your house or office? Bauhaus. Any lighting fixtures with push–on/push–off switches? Bauhaus. Got a fitted kitchen? Bauhaus. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The segment on the fitted kitchen was interesting. A fitted kitchen seems like a natural and obvious thing now, but the idea had to be &lt;a href="http://en.wikipedia.org/wiki/Frankfurt_kitchen"&gt;invented&lt;/a&gt;. The discussion of the Frankfurt Kitchen in the programme was the start of an interesting thread. Users of the kitchen tended to be a bit ill-disciplined. Certainly the tended to disregard the labels permanently attached to the custom–made drawers and put any old thing in them. Users found that the kitchen was built to support well only certain workflows, workflows that they didn't like, didn't understand and couldn't change. Workflows devised by an architect &lt;i&gt;who couldn't cook&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meanwhile, another Bauhaus architect, Le Corbusier, is being given free reign to redesign entire cities, up to the point of making models, anyway. Filling them with great towers full of his “machines for living in”. And &lt;a href="http://en.wikipedia.org/wiki/Pruitt-Igoe"&gt;we know how that worked out&lt;/a&gt; once people started taking it seriously. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are a regular reader of this blog you probably know where I'm going next.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Commentators on software development often seem to exhibit a lot of discipline envy. Two common themes are that 1) our projects should exhibit the &lt;a href="http://news.bbc.co.uk/1/hi/uk/4735812.stm"&gt;reliability&lt;/a&gt; of those in the “established” branches of engineering, and 2) our projects should exhibit the conceptual integrity attained by building architects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That conceptual integrity can be a dangerous thing. Lihotzky's kitchens had a lot of conceptual integrity (and a lot of research to back that up), Corb's vision of mass housing (and its implementation by later architects) had a &lt;a href="http://en.wikipedia.org/wiki/Modulor"&gt;really astonishing amount of conceptual integrity&lt;/a&gt;. Neither leads to much in the way of joy for users (&lt;a href="http://peripateticaxiom.blogspot.com/2010/05/t-shaped-designers.html#corb"&gt;*&lt;/a&gt;).  The Bauhaus architects designed a lot of chairs, none are comfortable to sit in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the designers interviewed in the programme explained the problem along these lines: architects tend to be ‘I’ shaped, by which he means they have a very deep knowledge and skill in their craft, but not a lot else going on. Designers tend to be ‘T’ shaped, deep in craft but also with a breadth that touches many other disciplines. And from that breadth comes the ability to design objects that people can comfortably incorporate into their lives.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that the application of this thought to the software world is clear.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(&lt;a id="corb"&gt;*&lt;/a&gt;) The very few dense housing projects that Le Corbusier himself built have proven to be resilient and popular. It's the shoddy works inspired by his ideas and executed without his art that are the problem.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5756528084650378871?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5756528084650378871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5756528084650378871&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5756528084650378871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5756528084650378871'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/05/t-shaped-designers.html' title='T-shaped designers'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1363868067350294824</id><published>2010-04-27T22:37:00.003+01:00</published><updated>2010-04-27T22:39:29.603+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Tests vs checks</title><content type='html'>Trying to spread the good word on "testing" vs "checking" in &lt;a href="http://www.testmagazine.co.uk/2010/04/automation-your-check-mate/"&gt;this article&lt;/a&gt; for T. E. S. T. Magazine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1363868067350294824?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1363868067350294824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1363868067350294824&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1363868067350294824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1363868067350294824'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/04/tests-vs-checks.html' title='Tests vs checks'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1408328440609273213</id><published>2010-03-23T07:26:00.004Z</published><updated>2010-03-23T17:42:27.100Z</updated><title type='text'>Software Engineering?</title><content type='html'>I wish that the people in the software industry who bang on about a need for "software engineering" showed more evidence of ever having met an engineer. The latest run at it, &lt;a href="http://www.semat.org/bin/view"&gt;SEMAT&lt;/a&gt;, seems to be making the same old mistakes all over again.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not all bad. I'm pleased to see Ivar Jacobson repeat his call to move beyond "process" to "practices". On the other hand, I'm dismayed to see the SEMAT programme described at it's highest level by these streams: &lt;i&gt;definitions&lt;/i&gt;, &lt;i&gt;theory&lt;/i&gt;, &lt;i&gt;universals&lt;/i&gt;, &lt;i&gt;kernel language&lt;/i&gt;, &lt;i&gt;assessments&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Really? Definitions, theory, universals? Are these really the things that the software industry is lacking? The problem here, I think, is that just as at the original "Software Engineering" conferences in the 60's the SEMAT folks have confused the retrospective coherence with which engineering (that is, the mechanical, chemical, electrical, electronic and other flavours) is described with how engineering is actually done.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Similarly, the presence of a spring bow compass in the SEMAT logo worries me. The 60's effort at SE also confused the contingent artefacts produced by engineers (which at the time were actual drawings produced with things like spring bow compasses) with the essence of what engineers &lt;i&gt;do&lt;/i&gt;. With this logo SEMAT are associating themselves not just with tools and outputs rather than principles and practices, but with mightily outdated tools. They might as well have put a slide rule in their logo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It really seems as if an historic mistake is about to be repeated. I need to study SEMAT more, but for now &lt;a href="http://alistair.cockburn.us/Alistairs+January+2010+proposed+agenda+for+the+SEMAT+software+engineering+initiative"&gt;Alistair Cockburn's commentary&lt;/a&gt; resonates strongly with me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He urges that SEMAT does these to things:&lt;/div&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;Look at what engineers &lt;strong&gt;‘do’&lt;/strong&gt;, not what they &lt;strong&gt;build.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Catch up with the state of the art in what is conventionally called &lt;strong&gt;engineering.&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;I can hope.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1408328440609273213?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1408328440609273213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1408328440609273213&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1408328440609273213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1408328440609273213'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/03/software-engineering.html' title='Software Engineering?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6908527341582622620</id><published>2010-02-01T14:18:00.007Z</published><updated>2010-02-01T16:38:41.671Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='diffusion'/><category scheme='http://www.blogger.com/atom/ns#' term='invention'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><title type='text'>Innovation</title><content type='html'>Last year &lt;a href="http://www.lukehohmann.com/blog/index.php"&gt;Luke Hohmann&lt;/a&gt; demonstrated some of his &lt;a href="http://en.wikipedia.org/wiki/Innovation_game"&gt;innovation games&lt;/a&gt; at &lt;a href="http://xpday-london.editme.com/XTC20091117"&gt;an XtC event &lt;/a&gt;hosted at the &lt;a href="http://www.zuehlke.com/en/jobs/vacancies/detailview/job/principal-consultantsolutions-architect/jobbpid/142/"&gt;Zuhlke Ltd office in London&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One theme was that innovation is different from invention. That's a topic close to my heart. Zuhlke has a division named "Product Innovation" and indeed they innovate like crazy (for example, &lt;a href="http://www.zuehlke.com/uploads/tx_zepublications/pn_344_e_bsr_web.pdf"&gt;repurposing the optical sensor for a mouse to better control sewing machines&lt;/a&gt; [pdf]) but they rarely &lt;i&gt;invent&lt;/i&gt; anything (although they do from time to time, for example &lt;a href="http://www.zuehlke.com/uploads/tx_zepublications/pn_328_e_waterless_urinals_web.pdf"&gt;a newly patented waterless urinal trap&lt;/a&gt; [pdf]). Knowing a bit about those folks and &lt;a href="http://www.zuehlke.com/fileadmin/pdf/flyers/fl_055_e_pep_zrh.pdf"&gt;what they do&lt;/a&gt; has helped make me very sensitive to abuses of the term "engineering" as (mis-) applied to software development. But that's a story for another time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;The Shock of the Old&lt;/h2&gt;&lt;div&gt;I've just finished reading &lt;a href="http://www.amazon.co.uk/Shock-Old-Technology-Global-History/dp/1861973063/"&gt;The Shock of the Old&lt;/a&gt;. It goes on a bit, it's a bit repetitive, it's highly polemical and a bit repetitive. Pretty good, though. The key observation is that the history of technology as usually presented (for example, in institutions like the &lt;a href="http://www.sciencemuseum.org.uk/"&gt;Science Museum&lt;/a&gt;) is largely bunk. This history for the most part ignores use and so also ignores folk technology and what Edgerton calls &lt;i&gt;creole&lt;/i&gt; technology. He presents numerous case studies to show that what has been made to look like invention is really innovation and diffusion. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quick quiz: when was the first document transmitted by fax? Answer: depending on quite what you think a fax is, &lt;a href="http://www.hffax.de/html/hauptteil_faxhistory.htm"&gt;sometime between 1843 and 1865&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the average householder couldn't go and buy a fax machine until about a century later. When faxes became available to the general public that wasn't invention, it wasn't even innovation, it was diffusion.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;The Revolutionary Period of Big Innovation&lt;/h2&gt;&lt;div&gt;&lt;a href="http://www.mindviewinc.com/Index.php"&gt;Bruce Eckel&lt;/a&gt; has come to realize that &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=281005"&gt;"software development has stalled"&lt;/a&gt;. He says, &lt;blockquote&gt;in recent years it has started to look like we're moving out of the revolutionary period of big innovation, and into a phase of relative stability.&lt;/blockquote&gt; I don't believe this for a minute. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think the revolutionary period of big innovation in the tools of programming ended about the time that Sun dropped &lt;a href="http://selflanguage.org/"&gt;Self&lt;/a&gt;. I'd say that the gold standard development environment for mainstream languages right now is &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;. As &lt;a href="http://en.wikipedia.org/wiki/David_Ungar"&gt;Dave Ungar&lt;/a&gt; explains towards the end of &lt;a href="http://www.youtube.com/watch?v=3ka4KY7TMTU"&gt;this video about the history and influence of Self&lt;/a&gt;, Eclipse represents the continuation of the tool-based approach to building a programming environment developed in &lt;a href="http://www.smalltalk.org/main/"&gt;Smalltalk&lt;/a&gt;. I'd say that Eclipse, even the best-of-breed Java environment built with it, still isn't as good as the best Smalltalk environments for ease of use, productivity &lt;i&gt;and fun&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sun pulled the plug on Self about fifteen years ago. Ironically, they had to buy back the &lt;a href="http://java.sun.com/products/hotspot/whitepaper.html#method"&gt;technology for making dynamic dispatch in a dynamically typed language on a VM go fast&lt;/a&gt; from &lt;a href="http://www.cs.ucsb.edu/~urs/"&gt;Self project staff who had left Sun&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What has happened since then is a steady diffusion of features from good object-oriented development environments of the 80's and 90's into the mainstream. Sadly, few features of the very best object-oriented environment of that time (Self, of course) have made it through.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Sources of Diffusion&lt;/h2&gt;&lt;div&gt;Where else are ideas diffusing from? From &lt;a href="http://sloan.stanford.edu/MouseSite/1968Demo.html"&gt;the mother of all demos&lt;/a&gt;. Unfortunately, that seam is about worked out. &lt;a href="http://www.vpri.org/html/people/founders.htm"&gt;Alan Kay&lt;/a&gt; &lt;a href="http://unrev.stanford.edu/introduction/introduction.html"&gt;is supposed to have said&lt;/a&gt; "I don't know what Silicon Valley will do when it runs out of Doug's ideas." We may be about to find out. Further diffusion (disguised as innovation) in the field of living with computers may well require actual invention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fortunately, that seam is about worked out. We, the public (at least in high-income countries with stable governments) do now finally live in the world that Englebart invented in 1968.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And what of software development tools?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bruce says: &lt;blockquote&gt;no matter how good and powerful our software tools get, we are only getting a fraction of the leverage out of them that we &lt;em&gt;could&lt;/em&gt; get.&lt;p&gt;&lt;em&gt;Programming tools are no longer where the greatest potential lies.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;We will get the biggest leverage, not just in programming but in all our endeavors, by discovering better ways to work together. [emphasis in original]&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;and I think he's right. I wonder what it is about the world that Bruce works in that has hidden this from him for so long. After all, in 2001 &lt;a href="http://agilemanifesto.org/"&gt;one group&lt;/a&gt; said:&lt;/div&gt;&lt;blockquote&gt;  We are uncovering better ways of developing&lt;br /&gt;software by doing it and helping others do it.&lt;br /&gt;Through this work we have come to value:&lt;br /&gt;&lt;br /&gt;Individuals and interactions over processes and tools [etc]&lt;/blockquote&gt;&lt;/div&gt;Behind the manifesto is a use-based story about the history of technology. Notice that it's &lt;i&gt;uncovering by doing&lt;/i&gt;, and not inventing. I'd like to think that Edgerton would approve. It is also a story of diffusion. In &lt;i&gt;&lt;a href="http://www.amazon.co.uk/Agile-iterative-development-Craig-Larman/dp/0131111558/"&gt;Agile and Iterative Development&lt;/a&gt;&lt;/i&gt;&lt;a href="http://www.craiglarman.com/wiki/index.php?title=Main_Page"&gt; Larman&lt;/a&gt; quotes &lt;a href="http://www.geraldmweinberg.com/Site/Home.html"&gt;Weinberg&lt;/a&gt;:&lt;blockquote&gt;We were doing incremented development as early as 1957, in Los Angeles, under the direction of Bernie Dimsdale. He was a colleague of John von Neumann, so perhaps he learned it there, or assumed it was totally natural. [...] the technique used was, as far as I can tell, indistinguishable from XP. [...] much of the same team was reassembled [...] in 1958 to develop Project Mercury, we had our own machine [...] whose symbolic modification and assembly allowed us to build the system incrementally, which we did, with great success. &lt;/blockquote&gt;&lt;div&gt;What has happened is that techniques that were once restricted to research projects at the cutting edge of &lt;i&gt;a technological nation's story of existential survival&lt;/i&gt; are now available to the mainstream.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What, I would like to know is, next?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6908527341582622620?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6908527341582622620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6908527341582622620&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6908527341582622620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6908527341582622620'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/02/innovation.html' title='Innovation'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-606326979523258298</id><published>2010-01-26T13:40:00.004Z</published><updated>2010-01-26T13:54:42.115Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='government IT'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>UK Goverment IT Failures</title><content type='html'>&lt;a href="http://www.independent.co.uk/"&gt;&lt;i&gt;The Independent&lt;/i&gt;&lt;/a&gt; recently &lt;a href="http://www.independent.co.uk/news/uk/politics/labours-computer-blunders-cost-16326bn-1871967.html"&gt;reported&lt;/a&gt; on the very, very sorry state of Government IT projects in the UK. It's a mess:&lt;blockquote&gt;[...]the total cost of Labour's 10 most notorious IT failures is equivalent to more than half of the budget for Britain's schools last year. Parliament's spending watchdog has described the projects as "fundamentally flawed" and blamed ministers for "stupendous incompetence" in managing them.&lt;/blockquote&gt;&lt;div&gt;I thought that the article missed a trick and wrote to tell them so. My letter didn't make it to the paper paper, but has appeared on &lt;a href="http://opinion.independentminds.livejournal.com/1628420.html"&gt;their blog&lt;/a&gt;. It's somewhat hidden, though, so I reproduce it here. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It would be easy to conclude that large government IT projects fail primarily for technical reasons. Technical mistakes certainly are made, but the root cause of many failed projects seems to be the procurement process with which they begin. The question which is asked of the suppliers is not one that allows for the kind of answer that leads to success. It is well known in the private sector that very large monolithic projects have little chance of success, but this is the only kind for which the Civil Service seems to know how to ask.&lt;/div&gt;&lt;div&gt;&lt;p&gt;I have no doubt that ministers are, as &lt;a href="http://muckrack.com/michaelsavage"&gt;Michael Savage&lt;/a&gt; puts it, "too easily wooed by suppliers". The suppliers which we see winning government contracts again and again might also find it too easy to woo a minister. Particularly a minister and a department which would rather launch a high-profile, high-budget, high-risk project than adopt the smaller scale, incremental approach that creates few headlines when launched, but also has a much better chance of creating few headlines when it does not fail.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-606326979523258298?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/606326979523258298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=606326979523258298&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/606326979523258298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/606326979523258298'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/01/uk-goverment-it-failures.html' title='UK Goverment IT Failures'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7976575628749844307</id><published>2010-01-22T03:17:00.004Z</published><updated>2010-01-22T05:19:30.214Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='corporate IT'/><title type='text'>It's the Screaming</title><content type='html'>Tim Bray &lt;a href="http://www.tbray.org/ongoing/When/201x/2010/01/02/Doing-It-Wrong"&gt;observes&lt;/a&gt;: &lt;blockquote&gt;The community of developers whose work you see on the Web, who probably don’t know what ADO or UML or JPA even stand for, deploy &lt;em&gt;better systems at less cost in less time at lower risk&lt;/em&gt; than we see in the Enterprise. [emphasis in original]&lt;/blockquote&gt;That's a pretty bold claim. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, certainly, the Enterprise makes a botch of IT projects on a titanic scale, and Tim gives a partial list of very high profile failures. I think this data is tainted. Firstly, these project failures (such as the UK NHS &lt;a href="http://en.wikipedia.org/wiki/NHS_National_Programme_for_IT#Criticisms_of_the_programme"&gt;NPfIT&lt;/a&gt; programme) are, well, very high profile—but they aren't representative. Plenty of corporate IT projects do very OK. Secondly, the specific examples Tim gives are actually government projects. Government IT is the &lt;i&gt;reductio ad absurdum&lt;/i&gt; of Enterprise IT. These might not be the most informative examples to look at.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other side of the matter, Tim cites the successes of Facebook, Google and Twitter. These are also not representative. Quickly, name three failed web 2.0 startups...that's a hard ask because those startups that don't succeed sink without trace. Which, if you believe in the &lt;a href="http://ycombinator.com/about.html"&gt;Y Combinator&lt;/a&gt; argument, is the point. A web 2.0 startup needs so little initial investment that western civilisation can afford to throw them away in bulk without noticing. The result is a sort of &lt;a href="http://en.wikipedia.org/wiki/Monte_Carlo_method"&gt;Monte Carlo method&lt;/a&gt; for product innovation. I wonder how that's working out for them now that money is no longer so cheap.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But still, something &lt;i&gt;is&lt;/i&gt; very wrong with enterprise IT.  Would the "web 2.0" way of working help?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe, maybe not. I think Tim has made the mistake of assuming that a technique that he's seen work in one context will necessarily work in another. And should be deployed there post-haste. The IT industry collectively makes this mistake about every seven years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some commentators have noted some of the differences between the Web and the Enterprise. In summary: web 2.0 startups don't have to integrate with a heterogeneous  ecosystem of legacy systems older than the combined ages of their founders. Web 2.0 startups don't have to operate within multiple tight and complex regulatory regimes. Some were even so unkind as to observe that &lt;a href="http://en.wikipedia.org/wiki/Tim_Bray#XML"&gt;Tim is one of the devisors of XML&lt;/a&gt; and so some of the chest–deep mud that Enterprise developers have to slog through is his fault.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think there are two more issues that Enterprise groups have to deal with that web 2.0 startups don't, and don't have a good story for.&lt;/div&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Scale&lt;/h2&gt;&lt;div&gt;I'm going to say that enterprise IT faces a much tougher scale problem than do web developers. Part of the web 2.0 model is that the initial user base is the founders plus their &lt;a href="http://en.wikipedia.org/wiki/Dunbar's_number"&gt;immediate circle&lt;/a&gt;. The problem that startups face is that if they are one of the (very) few that make it, their user base may grow very quickly. Their problem is &lt;i&gt;scaleability&lt;/i&gt;. This is a tough problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem for the Enterprise is &lt;i&gt;scale&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Citigroup, Bank of America and JP Morgan Chase all have &lt;a href="http://www.bankspider.com/topbanks.php?sel=employees"&gt;slightly less than a quarter of a million employees&lt;/a&gt;. If you are deploying a "corporate IT app" at one of those organisations then you have to plan for all quarter of a million of them to hit your app at 9am their local time tomorrow. And all day and everyday thereafter. That's a different problem. And by the standards of corporate IT this is no–where near as bad as it can get.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You know that NPfIT project that Tim holds up as an exemplar of corporate IT failure? In 2008 the NHS had &lt;a href="http://www.ic.nhs.uk/statistics-and-data-collections/workforce/nhs-staff-numbers/nhs-staff-1998--2008-non-medical"&gt;1.12 million non–medical staff&lt;/a&gt;, &lt;a href="http://www.ic.nhs.uk/statistics-and-data-collections/workforce/nhs-staff-numbers/nhs-staff-1998--2008-medical-and-dental"&gt;99,000 medics and dentists&lt;/a&gt; and &lt;a href="http://www.ic.nhs.uk/webfiles/publications/nhsstaff2008/gp/Bulletin%20Sept%202008.pdf"&gt;34,000 General Practitioners&lt;/a&gt;. Imagine that they are all going to start using your app tomorrow. To help them treat patients. Of which there are several million a week handled by NHS services. Putting up the &lt;a href="http://fredericiana.com/2009/08/01/why-wikipedia-might-need-a-fail-pet-and-why-mozilla-does-not/"&gt;fail whale&lt;/a&gt; isn't going to cut it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And that's the real problem that corporate IT have the deal with: &lt;i&gt;the screaming&lt;/i&gt;.&lt;/div&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Screaming&lt;/h2&gt;&lt;div&gt;Let's say that your web 2.0 startup thingy that you put together in record time in your buddy's mum's spare room falls over. What's the worst thing that can happen? A few snarky tweets? The odd complaining blog post?  The whole point of your business model is that your service (and company) are disposable, at least in the early days. It's not as if you have a revenue stream to protect. As if!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now lets imagine what happens when your FX app you just deployed into Mammon Inc's trading floors falls over. What happens then is that a head of desk in Farawayvia phones you up at 3 am your time and &lt;i&gt;will not stop screaming at you&lt;/i&gt; until you get it fixed. I exaggerate for comic effect, but not by much. If you are a Web 2.0 type then you have the luxury of fixing stuff up in something like your own time. If you are a Corporate IT type then you might well have someone who believes that you, personally, are trying to steal their &lt;a href="http://www.telegraph.co.uk/finance/newsbysector/banksandfinance/6958528/Record-bonus-pot-at-JP-Morgan.html"&gt;bonus&lt;/a&gt; from them raging at you until you get the damn thing working again. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or that you, personally, are trying to kill their patient.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you were a founder of a web startup and the users of your service had your personal mobile number and believed that five minutes of downtime could cost them personally millions of bottletops (the currency of Farawayvia, ticker symbol BTP), or lead them to a malpractice suite over a dead patient, do you think you would behave the same way that other founders do?&lt;/div&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Solutions?&lt;/h2&gt;&lt;div&gt;So, what's the answer? I don't there is any "the answer". Not a technical one, anyway. There are a bunch of tools and techniques that I've come to think will help a lot, and I encourage my clients who happen to be in corporate IT to use them. I fact, Tim mentions some of them in his post. He notes that startups get a lot of help from:&lt;blockquote&gt; dynamic languages and Web frameworks and TDD and REST and Open Source and NoSQL at varying levels of relative importance&lt;/blockquote&gt; Too right. But, as &lt;a href="http://www.geraldmweinberg.com/Site/Home.html"&gt;Gerry Weinberg&lt;/a&gt; says: it's always a people problem. It always is. It's the screaming. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Get people into a place where they believe they can do the right thing and they mostly will. The technology can then, to a surprising extent, look after itself. This is the really big advantage that startups have, I think: no–one to tell them not to do the right thing. It's not that corporate IT is full of people saying "don't do the right thing" (although in the worst case that does happen). Rather it's that the social context inside any organisation big enough to call itself an "enterprise", without any actual malice on the part of any individual, works against the right thing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think it was &lt;a href="http://xprogramming.com/blog/"&gt;Ron Jeffries&lt;/a&gt; that I first heard say that most of the advice given to software developers to help them do better is about as useful as telling them to be taller. Telling folks who work in corporate IT to behave more like the folks in web startups seems no more useful than that to me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand, if one does end up working in a really toxic environment that does work against the right thing it can be worth looking around. Look around to see who, exactly, is holding the gun to your head to make you put up with it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7976575628749844307?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7976575628749844307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7976575628749844307&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7976575628749844307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7976575628749844307'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/01/its-screaming.html' title='It&apos;s the Screaming'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7914239097064579026</id><published>2010-01-17T20:33:00.104Z</published><updated>2010-04-05T20:38:23.650+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modelling'/><category scheme='http://www.blogger.com/atom/ns#' term='alloy'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='formal'/><title type='text'>Complex Domains: playing with Alloy</title><content type='html'>Before digging in to more Bayesian ideas I want to take a step back. The &lt;a href="http://peripateticaxiom.blogspot.com/2009/12/bayesian-testing.html#example"&gt;example in this previous post&lt;/a&gt;, which I worked through with Laurent, has an interesting property: Each subsequent test halves the remaining uncertainty about the correctness of the system under test. This is a property of the problem domain, not the solution. For a next example I want to look at a more complex domain. But what makes a domain complex (in the sense of &lt;a href="http://www.bigvisible.com/asroka/essential-complexity-part-one/"&gt;essential complexity&lt;/a&gt;)? That's not a rhetorical question.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And what tools are appropriate to handling a complex domain? Let me tell you a story... (if you want to skip the story and go direct to the techie stuff, it's &lt;a href="#techie"&gt;here&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Microcell Predictor&lt;/h2&gt;&lt;div&gt;Back in the day I worked on a tool used by radio engineers to design mobile phone networks. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In particular I worked on a so–called "microcell predictor". This would take a description of a dense urban environment and a proposed low–power base station location and calculate the expected signal strength at various points in the area. The input was a file containing a bunch of polygons describing building footprints and some materials data (steel and glass, masonry, etc) and the base station location and properties (antenna design and so forth). The output was a raster of predicted signal strengths. This could overlay the building polygons and generate a map that the engineers could first eyeball and then if necessary analyse more closely to help them optimise the base station placement. This was a lot faster and cheaper than putting up a temporary antenna and then driving around in a vehicle with a meter measuring the actual signal strength, which was the way the very first networks were planned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The requirement for this came from the radio specialists in the form of pages of maths describing various "semi-empirical" models of microwave propagation and how these interacted with buildings. Let's say we are looking at GSM 900. If a 900 MHz microwave photon were moving in free space it would have a wavelength of approximately  3×10&lt;sup&gt;9&lt;/sup&gt; ms&lt;sup&gt;-1&lt;/sup&gt;/9×10&lt;sup&gt;8 &lt;/sup&gt;s&lt;sup&gt;-1 &lt;/sup&gt;or around 33mm. This makes such photons quite good at seeming to go around the corners of "human scale" structures by diffraction. To calculate that exactly would be very messy and on &lt;a href="http://obsolyte.com/sun_ss5/"&gt;the boxes we used&lt;/a&gt;, impracticable. So we had these other methods which hid a lot of the details and gave results that the radio experts deemed good enough and that we could compute with. The input didn't have to be especially large or complicated for the prediction to take long enough that the user would give up, but the point of microcells is that they only cover a small area in a city centre anyway so that was OK. This was fifteen years ago, the techniques used now are a lot more sophisticated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Semi-formal&lt;/h2&gt;&lt;div&gt;We used a development process called &lt;a href="http://www.syntropy.co.uk/syntropy/"&gt;Syntropy&lt;/a&gt;. It's an unusual day in which if I spend any time at all thinking about software I don't use ideas from Syntropy to good effect. Amongst other things Syntropy combines a graphical notation for object structures much like &lt;a href="http://en.wikipedia.org/wiki/Object-modeling_technique"&gt;OMT&lt;/a&gt; with a textual notation for facts about them much like &lt;a href="http://en.wikipedia.org/wiki/Z_notation"&gt;Z&lt;/a&gt;. Some (but not nearly enough) of these ideas made it into UML, particularly the &lt;a href="http://en.wikipedia.org/wiki/Object_Constraint_Language"&gt;OCL&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, we had these mathematical requirements and we produced from them mathematically supported specifications and designs, full of ∀'s and ∃'s, and we had to turn these into working software. I learned a great deal about the art of doing that there, other parts of which are a story for another time. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main thing for my current purpose, though, is that when I think back to those times I'm stunned by the amount of effort we put into determining if those specifications and designs were &lt;i&gt;correct&lt;/i&gt;. The only way we knew how was to round up a bunch of seriously smart people (which luckily we had) and check these models manually. Management were smart about it and paid for us to be trained in &lt;a href="http://en.wikipedia.org/wiki/Fagan_inspection"&gt;Fagan inspection&lt;/a&gt; techniques, which helped a lot. But the expense! six or eight top-flight programmers in a room for a couple of hours is not a trivial investment. And to do that many times per document. Sometimes many times per page of a document, over the years that we worked on this thing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But that was then. As it happens, more–or–less exactly &lt;i&gt;then&lt;/i&gt; another group in the UK were using much more advanced formal methods to address a much trickier problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;This is Now&lt;/h2&gt;&lt;div&gt;In &lt;a href="http://www.spaconference.org/spa2007/programme.html"&gt;2007&lt;/a&gt; Sir &lt;a href="http://en.wikipedia.org/wiki/C._A._R._Hoare"&gt;Tony Hoare&lt;/a&gt; delivered a keynote at the &lt;a href="http://www.spaconference.org/"&gt;Spa conference&lt;/a&gt;. He talked about the effort required to prove (really, &lt;i&gt;prove&lt;/i&gt;) that the &lt;a href="http://www.mondex.com/"&gt;Mondex&lt;/a&gt; electronic money system was secure. The thing about Mondex is that the money is actually on the card, rather than being in the network with the card acting as a credential to allow the money to be moved. This made the Bank of England  &lt;a href="http://www.bankofengland.co.uk/education/museum/exhibitions/past2.htm"&gt;very nervous&lt;/a&gt; (Mondex was developed in the UK). Developing that 200 page proof was very expensive. &lt;a href="http://www.springerlink.com/content/w5x622t55187u2l5/"&gt;This effort&lt;/a&gt; has become something of a &lt;a href="http://vsr.sourceforge.net/Activities.htm#The%20Mondex%20case%20study"&gt;celebrity&lt;/a&gt; amongst the Verified Software community. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The folks who worked on the Mondex proof were, almost certainly, much smarter than my colleagues and I who worked on the microcell predictor (sorry guys), but they seem not to have known a better way to proceed than manual checking, either. In fact they, so they say, they said at the time&lt;blockquote&gt;mechanising such a large proof cost–effectively is beyond the state of the art&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Hoare's keynote explained that between then and now, in fact in that year 2007, the problem had been re–addressed. The goal was to discover to what extent the state of the art had moved on in ten years and whether mechanisation had become cost–effective. Hoare suggested strongly that through improvements in theory and hardware that cost–effectiveness is within reach.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the things that came out of that effort was a &lt;a href="http://vsr.svn.sourceforge.net/viewvc/vsr/projects/mondex/alloy/"&gt;model&lt;/a&gt; written in &lt;a href="http://alloy.mit.edu/community/"&gt;Alloy&lt;/a&gt; (note: the link was dead at the time of writing but the Alloy site &lt;i&gt;is&lt;/i&gt; actively maintained).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alloy is actually what I wanted to write about. Alloy seems to live at an interesting place: the intersection of &lt;i&gt;proof&lt;/i&gt; and &lt;i&gt;examples&lt;/i&gt;. What Alloy does is help you develop a proof of various properties of a specification by on the one hand generating examples (if the specification is consistent) or counter–examples (if it isn't).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Testing&lt;/h2&gt;&lt;div&gt;Over time, and quite naturally, our focus changed while working on the microcell predictor. We became less interested in demonstrating that our code conformed to a design that conformed to a specification that conformed to a requirement. We became more interested that the code conformed to the users' needs. We showed this through intensive automated testing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My boss at the time insisted that we write fully automated tests for every function we wrote. He had an automated testing framework that he carried around in his head and regenerated at each new place of work. I think he had learned this from previous boss of his and the framework had, IIRC, originally been written in Pascal. So we crated a C++ version and off we went writing tests and I can't begin to mention the number of times that writing the tests, and running them, again and again and again, was crucial to overcoming what would otherwise have been show–stopping problems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was especially interesting that one of the guys on the team, a real code–basher and much better programmer than I am, built a graphical test runner (polygons, remember) that let you see what the code was doing as a test ran. See the building footprint polygons, see the triangulation of the line–of–sight region, see the first–order rays from the antenna to the corners of buildings, see the second–order virtual sources, see the triangulation of their line–of–sight, and so on. See it in all these various scenarios, each devised specifically to check that some particularly interesting feature of the &lt;i&gt;problem&lt;/i&gt; was dealt with correctly. At one time I had several sheets of big flipchart paper covered in the tiniest writing I could manage describing all the ways I could think of that a line segment could meet a set of polygons. I missed a few.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Something like Alloy would have helped &lt;i&gt;so much&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These animated tests became the premier way of explaining what the microcell predictor did. Even to customers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice that my work on microcells, with the intensive automate testing, and the original Mondex proof took place more–or–less contemporaneously with the discovery of Extreme Programming. I think I recall a lunchtime conversation during the microcell work to the effect that there was this &lt;a href="http://c2.com/cgi/wiki?ChryslerComprehensiveCompensation"&gt;mad project&lt;/a&gt; going on where they had automated tests for everything (as we did), but they &lt;i&gt;wrote the tests first!&lt;/i&gt; I think I recall some comment along the lines that this was fine only so long as you knew the requirement in great and final detail, but in practice you never do. I'm now pretty confident that the converse is true: while we hardly ever do have great and finally detailed requirements, this is exactly when writing the tests first does help. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm glad that I dropped off the "models" path to correctness and onto the "test first" one. And I'm glad that I had the experience of doing the "models" approach. I find it interesting to look back over the fence sometimes, and see how those folks are getting along.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Alloy&lt;/h2&gt;&lt;div&gt;And so to Alloy&lt;A id="techie"&gt;&lt;/A&gt;. I have Alloy 4.1.10 here on my MacBook Pro (2.4 GHz Core 2 Duo, 4GB ram). I'm going to try to develop a formal model of the points on a Goban. If you'd like to play along, there's &lt;a href="http://bitbucket.org/keithb/goban-alloy/"&gt;an hg repo&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Points&lt;/h3&gt;&lt;div&gt;Alloy models are essentially relational although the syntax is deliberately chosen to be as familiar as possible to users of "curly bracket" OO languages. I begin by writing a kind of test. This takes the form of a predicate called &lt;code&gt;correct&lt;/code&gt; which says&lt;pre&gt;pred correct {&lt;br /&gt; there_are_such_things_as_points&lt;br /&gt;}&lt;/pre&gt; and I can ask Alloy to run this test&lt;pre&gt;run correct&lt;/pre&gt;and Alloy tells me that &lt;code&gt;The name "there_are_such_things_as_points" cannot be found.&lt;/code&gt; which is excellent news. I'm well on the way to using the familiar TDD cycle. Not compiling is failure and here is a failing test. I can make the test fail in a slightly more informative way by defining  &lt;code&gt;there_are_such_things_as_points&lt;/code&gt; like so&lt;pre&gt;pred there_are_such_things_as_points{&lt;br /&gt;  #Point &gt; 0&lt;br /&gt;}&lt;/pre&gt;which says that the size of the set named &lt;code&gt;Point&lt;/code&gt; (which is the set of all tuples conforming to the signature &lt;code&gt;Point&lt;/code&gt;—it's a relational model, remember) is strictly greater than zero. Of course I haven't defined that signature yet so Alloy tells me that &lt;code&gt;The name "Point" cannot be found.&lt;/code&gt; I define &lt;code&gt;Point&lt;/code&gt; like so&lt;pre&gt;sig Point {}&lt;/pre&gt;and now Alloy reports that&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;Executing "Run correct"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Sig this/Point scope &lt;= 3&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Sig this/Point in [[Point$0], [Point$1], [Point$2]]&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Solver=minisatprover(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=2 Symmetry=20       &lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;18 vars. 3 primary vars. 23 clauses. 183ms.&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Instance found. Predicate is consistent. 41ms.&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a lot of information there. The important part for now is that Alloy could find an &lt;i&gt;instance&lt;/i&gt; (that is, a bunch of tuples) that conforms to the model and of which the predicate is true. Therefore the model and the predicates I have defined are &lt;i&gt;consistent&lt;/i&gt; (that is, contain no contradictions). I can also ask Alloy not to run my predicate but instead to &lt;i&gt;check&lt;/i&gt; it. The news here is not so good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;Executing "Check check$1"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Sig this/Point scope &lt;= 3&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Sig this/Point in [[Point$0], [Point$1], [Point$2]]&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Solver=minisatprover(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=2 Symmetry=20       &lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;18 vars. 3 primary vars. 24 clauses. 11ms.&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="white-space: pre; "&gt; &lt;/span&gt;Counterexample found. Assertion is invalid. 18ms.&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;It turns out although my model is consistent it is not &lt;i&gt;valid&lt;/i&gt;. It is possible to construct instances of the model for which the predicate is not true.&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice the lines in the reports about &lt;code&gt;sig this/Point&lt;/code&gt;. In working with my model Alloy has made some instances of &lt;code&gt;Point&lt;/code&gt; form which it has then constructed instances of the model. By default it chooses to make up to 3 instances of a signature. Here is a graphical (in both senses) representation of the instance of the model which Alloy built&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_itmSz8f6ak4/S7nd4gCQRSI/AAAAAAAAAB0/9JbzgKflXfc/s1600/instance.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 92px; height: 66px;" src="http://2.bp.blogspot.com/_itmSz8f6ak4/S7nd4gCQRSI/AAAAAAAAAB0/9JbzgKflXfc/s200/instance.png" border="0" alt="Point$0" id="BLOGGER_PHOTO_ID_5456636386277868834" /&gt;&lt;/a&gt;Do you see this instance named in the array of three instances which Alloy reported it had created? Clearly the predicate is satisfied. Alloy will also produce a graph of the counterexample which it found—which is empty. (Well, strictly it's a message telling me that "every atom is hidden" in a "this page intentionally left blank" sort of way).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is nothing in the model which says that there are any points, only that there possibly is such a thing as a &lt;code&gt;Point&lt;/code&gt;. The problem domain can help us here, as it turns out that some of the points on the board have &lt;a href="http://senseis.xmp.net/?Tengen"&gt;names&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;pred tengen[p : Point]{}&lt;br /&gt;&lt;br /&gt;fact tengen_exists {&lt;br /&gt;  one p : Point |&lt;br /&gt;      tengen[p]&lt;br /&gt;}&lt;/pre&gt;Here I state a fact, which is very much like a predicate, except that it is information for Alloy to use not a question for it to ask of the model. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Read the fact &lt;code&gt;tengen_exists&lt;/code&gt; like this: "it's true of exactly one instance, named &lt;code&gt;p&lt;/code&gt;, of the signature &lt;code&gt;Point&lt;/code&gt; that the predicate &lt;code&gt;tengen&lt;/code&gt; is true of &lt;code&gt;p&lt;/code&gt;". The predicate itself is parameterised on an instance of &lt;code&gt;Point&lt;/code&gt; but does not depend upon that instance. Which seems as if it should smell.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Running the predicate as before finds that same instance of the model with one point in it. I can pop up an evaluator on that instance and ask for the value of &lt;code&gt;tengen[Point$0]&lt;/code&gt; which is (of course) &lt;code&gt;true&lt;/code&gt;. If I ask Alloy to check the model it now reports &lt;code&gt;No counterexample found. Assertion may be valid. 69ms. &lt;/code&gt;Note the "may be" there. Alloy can't be absolutely sure because it only instantiates a small number of tuples for each signature. This is a manifestation of the Small Instance Hypothesis (sometimes "small model" or "small scope") which claims that if your model is bogus then this will show up very quickly after looking at a small number of small examples—exhaustive enumeration of cases is not required.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So now I have a model, however feeble, which is consistent and cannot be shown (using up to three &lt;code&gt;Point&lt;/code&gt;s) to be invalid. I'll check in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Refinement&lt;/h3&gt;&lt;div&gt;I'm not very happy with this model. I said that some points are named, such as tengen, but that's not really very well expressed. There's that smelly predicate which doesn't depend upon its parameter. If some instances of Point have names, then we can say that. After going around the fail-pass loop (trust me, I am doing that but I'm not going to write it out every time) the model looks like this&lt;/div&gt;&lt;pre&gt;enum Name { Tengen }&lt;br /&gt;&lt;br /&gt;sig Point {&lt;br /&gt;  name : lone Name&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pred tengen[p : Point]{&lt;br /&gt;  p.name = Tengen&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fact tengen_exists {&lt;br /&gt;  one p : Point |&lt;br /&gt;  tengen[p]&lt;br /&gt;}&lt;/pre&gt;Several new Alloy features are used here. Since Alloy 4 doesn't support string literals I use an atom (an instance of a signature with no further structure). The &lt;code&gt;enum&lt;/code&gt; clause creates quite a complex structure behind the scenes but gets me the atom &lt;code&gt;Tengen&lt;/code&gt;.  The signature of &lt;code&gt;Point&lt;/code&gt; is extended to have a field named &lt;code&gt;name&lt;/code&gt; which will, in a navigation expression such as &lt;code&gt;p.name&lt;/code&gt; resolve to an instance of signature &lt;code&gt;Name&lt;/code&gt;, or to &lt;code&gt;none&lt;/code&gt;, as shown by the cardinality marker &lt;code&gt;lone&lt;/code&gt;. These navigation expressions look like dereferencing  as found in OO languages, but are actually joins.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This looks a lot healthier to me, and the model is still both consistent and not demonstrably invalid. Here's the new instance of the model. I'll check in.&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_itmSz8f6ak4/S7nqN23gsAI/AAAAAAAAAB8/3NqB0sIyjgs/s1600/instance.png" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 97px; height: 163px;" src="http://3.bp.blogspot.com/_itmSz8f6ak4/S7nqN23gsAI/AAAAAAAAAB8/3NqB0sIyjgs/s200/instance.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456649947323609090" /&gt;&lt;/a&gt;&lt;h3&gt;Directions&lt;/h3&gt;&lt;div&gt;There are many points on a goban, however. And these points stand in a certain relationship. Specifically, every point on the board has some neighbours. Tengen has four neighbouring points, one in each of the four directions I will call N, E, S and W. I start with N and obtain this &lt;i&gt;invalid&lt;/i&gt; model &lt;pre&gt;&lt;br /&gt;enum Name { Tengen }&lt;br /&gt;&lt;br /&gt;sig Point {&lt;br /&gt;  name : lone Name,&lt;br /&gt;  neighbour : Direction -&gt; lone Point&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pred tengen[p : Point]{&lt;br /&gt;  p.name = Tengen&lt;/pre&gt;&lt;pre&gt;}&lt;br /&gt;&lt;br /&gt;fact tengen_exists {&lt;br /&gt;  one p : Point | tengen[p]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;enum Direction {N}&lt;/pre&gt; which admits a counterexample which does not satisfy this predicate&lt;pre&gt;pred tengen_has_a_neighbour_in_each_direction{&lt;br /&gt;  let tengen = {p : Point | p.name = Tengen} {&lt;br /&gt;      not tengen.neighbour[N] = none&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt; The counterexample looks like this&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_itmSz8f6ak4/S7n7Q3BDqCI/AAAAAAAAACE/cqNL-WbyArg/s1600/counter_example.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 159px; height: 166px;" src="http://2.bp.blogspot.com/_itmSz8f6ak4/S7n7Q3BDqCI/AAAAAAAAACE/cqNL-WbyArg/s200/counter_example.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456668690600929314" /&gt;&lt;/a&gt;&lt;div&gt;New Alloy features are the mapping &lt;code&gt;Direction -&gt; lone Point&lt;/code&gt; which is pretty much the same as a typical "dictionary" and the &lt;code&gt;let&lt;/code&gt; form and its binding of the name &lt;code&gt;tengen&lt;/code&gt; to the value of a comprehension. The comprehension should be read as "the set of things &lt;code&gt;p&lt;/code&gt;, which are instances of &lt;code&gt;Point&lt;/code&gt; of which it is true that the value of &lt;code&gt;p.name&lt;/code&gt; is equal to &lt;code&gt;Tengen&lt;/code&gt;" Some sugar in Alloy means that we don't need to distinguish between a value and the set of size 1 who's sole member is that value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Running the model produces the somewhat surprising result that it is consistent. Looking at the example shows that this is a red herring. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_itmSz8f6ak4/S7n_Pt47kkI/AAAAAAAAACM/0Txl7prPZ8Q/s1600/instance.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 155px;" src="http://1.bp.blogspot.com/_itmSz8f6ak4/S7n_Pt47kkI/AAAAAAAAACM/0Txl7prPZ8Q/s200/instance.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456673069017567810" /&gt;&lt;/a&gt;This is an interesting state of the world, so I check in with a suitable caveat in the message.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;A YAGNI Moment&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;The invalid aspect of the model comes from the cardinality on &lt;code&gt;Point.direction&lt;/code&gt;. There are points on a Goban which do not have four neighbours, one in each direction. But I haven't mentioned any of them yet. There's a good chance that eventually points will need to have optional neighbours, but right now YAGNI.&lt;br /&gt;&lt;br /&gt;As the (so far, incomplete) predicate's name suggests, tengen really does have four neighbours. The cardinality should be &lt;code&gt;one&lt;/code&gt;. Making that change produces a model which no cannot be shown to be invalid. However, the example instance is still bogus. I know from TDD practice what to do: write a test that will fail until the problem is fixed. Here it is&lt;pre&gt;pred points_are_not_their_own_neighbour {&lt;br /&gt;  all p : Point |&lt;br /&gt;      not p in univ.(p.neighbour)&lt;br /&gt;}&lt;/pre&gt;The construction &lt;code&gt;univ.r&lt;/code&gt; for any relation &lt;code&gt;r&lt;/code&gt; evaluates to the range of the relation.&lt;br /&gt;&lt;br /&gt;As I hoped, this test fails. Although running the predicates can produce an instance in which the northerly neighbour of tengen is not tengen, checking can also still produce an invalidating counterexample in which it is. I must add a predicate to apply to all &lt;code&gt;Point&lt;/code&gt;s forcing them not to be their own neighbour&lt;pre&gt;&lt;br /&gt;sig Point {&lt;br /&gt;  name : lone Name,&lt;br /&gt;  neighbour : Direction -&gt; one Point&lt;br /&gt;}{&lt;br /&gt;  not this in ran[neighbour]&lt;br /&gt;}&lt;/pre&gt;Here I use the function &lt;code&gt;ran&lt;/code&gt; imported from the module &lt;code&gt;util/relation&lt;/code&gt; to state the constraint on the range of &lt;code&gt;neighbour&lt;/code&gt;. The conjunction of the predicates listed in curleys immediately after a sig are taken as facts true of all instances of that signature. The model is now consistent and not demonstrably invalid, but a glance at the example reveals that all is not well&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_itmSz8f6ak4/S7oGgMPb5cI/AAAAAAAAACU/uDVZU_XKxuo/s1600/instance.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 140px;" src="http://4.bp.blogspot.com/_itmSz8f6ak4/S7oGgMPb5cI/AAAAAAAAACU/uDVZU_XKxuo/s200/instance.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456681048624326082" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is interesting, so I check it in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;Complementary Directions&lt;/h3&gt;Once again, I need to strengthen the tests. If a point is the northern neighbour of tengen, then tengen is the southern neighbour of the that point. Directions on the board come in complementary pairs.&lt;pre&gt;pred directions_are_complementary{&lt;br /&gt;  N.complement = S&lt;br /&gt;  S.complement = N&lt;br /&gt;}&lt;/pre&gt; and now I have to de-sugar &lt;code&gt;Direction&lt;/code&gt; in order to insert the &lt;code&gt;complement&lt;/code&gt; relation. And now we see how enums work&lt;pre&gt;abstract sig Direction{&lt;br /&gt;  complement : one Direction&lt;br /&gt;}{&lt;br /&gt;  symmetric[@complement]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;one sig N extends Direction{}{complement = S}&lt;br /&gt;one sig S extends Direction{}&lt;br /&gt;&lt;/pre&gt; In the fact appended to &lt;code&gt;Direction&lt;/code&gt; I say that the relation &lt;code&gt;complement&lt;/code&gt; (the &lt;code&gt;@&lt;/code&gt; means that I'm refering to the relation itself and not its value) is symmetric using the predicate &lt;code&gt;util/relation/symmetric&lt;/code&gt;. Thus I do not have to specify that &lt;code&gt;S&lt;/code&gt;'s complement is &lt;code&gt;N&lt;/code&gt; having once said the converse. The same pattern applies to &lt;code&gt;E&lt;/code&gt; and &lt;code&gt;W.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The instance is now a spectacular mess.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_itmSz8f6ak4/S7oQh5VPiWI/AAAAAAAAACk/Vk3pgsaDVCU/s1600/instance.png" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 152px;" src="http://3.bp.blogspot.com/_itmSz8f6ak4/S7oQh5VPiWI/AAAAAAAAACk/Vk3pgsaDVCU/s320/instance.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456692073024424290" /&gt;&lt;/a&gt;I will check in anyway.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Distinct Neighbours&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;What I might like to say is&lt;pre&gt;pred neighbours_are_distinct{&lt;br /&gt;  all p : Point |&lt;br /&gt;      all disj d, d' : Direction |&lt;br /&gt;          p.neighbour[d] != p.neighbour[d']&lt;br /&gt;}&lt;/pre&gt;The nested quantification uses the disj modifier and should be read "for all distinct pairs of &lt;code&gt;Direction&lt;/code&gt;, named &lt;code&gt;d&lt;/code&gt; and &lt;code&gt;d'&lt;/code&gt;..." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This immediately renders the model (seemingly) inconsistent. More specifically the problem is that Alloy can no longer find an instance. I don't think that this is because the model contains contradictions so much as that it now requires more than three points in order to satisfy it. I can increase the number of instances available when the predicates are run like this &lt;code&gt;run correct for 5 Point&lt;/code&gt; The resulting example is a rats nest of dodgy looking relations (it's in the repo as instance.dot if you want a look)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A less extravagant predicate is&lt;pre&gt;pred neighbours_of_tengen_are_distinct{&lt;br /&gt;  let tengen = {p : Point | p.name = Tengen} |&lt;br /&gt;      all disj d, d' : Direction |&lt;br /&gt;          tengen.neighbour[d] != tengen.neighbour[d']&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;and with this I see a much less tangled, but still wrong, instance (instance1.dot). And the model is also demonstrably invalid. I'm going to make a significant change to the model. One I've been itching to do for some time. I check in before this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;A Missing Abstraction?&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;I feel as if I'm missing a degree of freedom, which is making it hard to say what I want. I'm going to promote tengen to be a signature, or rather to create a signature of which tengen will be the only instance at the moment: &lt;code&gt;InteriorPoint&lt;/code&gt;. I remove the predicates about distinct neighbours and introduce &lt;code&gt;InteriorPoint&lt;/code&gt;&lt;pre&gt;sig InteriorPoint extends Point{}&lt;/pre&gt;and can then quite happily say&lt;pre&gt;pred interior_points_have_a_neighbour_in_each_direction{&lt;br /&gt;all p : InteriorPoint {&lt;br /&gt;  not p.neighbour[N] = none&lt;br /&gt;  not p.neighbour[E] = none&lt;br /&gt;  not p.neighbour[S] = none&lt;br /&gt;  not p.neighbour[W] = none&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; and this gets me back to a consistent, not demonstrably invalid (although still wrong) model. I check in. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I can say&lt;pre&gt;sig InteriorPoint extends Point{}{&lt;br /&gt;  #ran[neighbour] = #Direction&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;and leave other kinds of point to look after themselves. If the range of the neighbour relation (which is a set) is the same size as the set of Directions, then there must be one neighbour per direction. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;This leaves me with the model in this state&lt;pre&gt;sig Point {&lt;br /&gt;  neighbour : Direction -&gt; lone Point&lt;br /&gt;}{&lt;br /&gt;  not this in ran[neighbour]&lt;br /&gt;  all d : dom[neighbour] |&lt;br /&gt;      this = neighbour[d].@neighbour[d.complement]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sig InteriorPoint extends Point{}{&lt;br /&gt;  #ran[neighbour] = #Direction&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fact tengen_exists {&lt;br /&gt;  #InteriorPoint = 1&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;abstract sig Direction{&lt;br /&gt;  complement : one Direction&lt;br /&gt;}{&lt;br /&gt;  symmetric[@complement]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;one sig N extends Direction{}{complement = S}&lt;br /&gt;one sig S extends Direction{}&lt;br /&gt;&lt;br /&gt;one sig E extends Direction{}{complement = W}&lt;br /&gt;one sig W extends Direction{}&lt;br /&gt;&lt;/pre&gt;a little bit of tidying up and I check in. The model is consistent and cannot be shown to be invalid. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_itmSz8f6ak4/S7oxwLnQIaI/AAAAAAAAACs/sZQjQHrRv08/s1600/instance.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://1.bp.blogspot.com/_itmSz8f6ak4/S7oxwLnQIaI/AAAAAAAAACs/sZQjQHrRv08/s320/instance.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456728602333684130" /&gt;&lt;/a&gt;The example instance looks respectable too—so long as we focus on the interior point and don't worry about how its neighbours relate to one-another, which is clearly wrong. But there are no tests for that. This diagram has been cleaned up in omnigraffle to focus on the interior point but the .dot of the original is checked in.  Maybe another time I'll sort out the regular points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Thoughts&lt;/h2&gt;Wow, that was hard work. Took a long time, too (although not so long as the timestamps make it look, I was also doing laundry and so forth during the elapsed). Does that make what is after all merely a rectangular array of points a "complex domain"? No. I'm out of practice with this kind of thing, and not fluent with the tool. Even so, I'm impressed by how good a fit the TDD cycle seems to be for this formal modelling tool. I even got into a bit of trouble towards the end but was rescued by recalling the TDD technique of making the tests dumb and repetitive—&lt;i&gt;but concrete and clear&lt;/i&gt;. And how the same subtle trap of thinking too far ahead applies here too.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Would this have helped with the microcell predictor? Maybe not. Alloy doesn't do numbers at all well, and that was an intrinsically numerical problem. Could this approach help with other things? I think so. This tiny model(ling) problem has turned out to be harder and more time-consuming than I expected it to be, but it is my first go with the tool. I'm going to play around with it some more, as time allows, and see what comes up. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm certainly impressed with the tool. Alloy comes very close to making powerful models an everyday tool for the working programmer, but I don't think its quite there yet. The gulf, as it always was, is between that very succinct model and working code. How to bridge that gulf in a useful way I don't yet know. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7914239097064579026?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7914239097064579026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7914239097064579026&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7914239097064579026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7914239097064579026'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/01/complex-domains-playing-with-alloy.html' title='Complex Domains: playing with Alloy'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_itmSz8f6ak4/S7nd4gCQRSI/AAAAAAAAAB0/9JbzgKflXfc/s72-c/instance.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-200898352864757424</id><published>2010-01-03T19:03:00.002Z</published><updated>2010-01-03T19:24:48.846Z</updated><title type='text'>Observations on Spotify</title><content type='html'>I use &lt;a href="http://en.wikipedia.org/wiki/Spotify"&gt;Spotify&lt;/a&gt;, but not quite enough to want to pay for the ad–free premium service just yet. I'm getting pretty good at not paying any attention to the ads (which seems as if it could be an increasingly useful life skill in the apparently inevitable entirely ad–funded on–line world to come), but a couple just now caught my...ear.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Spotify make a big noise about their targeted ads: better value for advertisers, less annoying for listeners. And yet here I am half way through the third act of &lt;i&gt;Tristan&lt;/i&gt; and it's choosing to tell me about a campaign called &lt;a href="http://www.dance4life.com/"&gt;dance4life&lt;/a&gt; which encourages clubbers under 25 to "start dancing and stop aids". A worthy goal, but unless Spotify knows something about Wagnerians that I don't this seems &lt;i&gt;a little odd&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also notice that while playing music in its peer–to–peer mode Spotify is gratifyingly parsimonious of bandwidth, but when the ads are streaming in my network suddenly jump up to 125KB/s and stay there for the duration of the ads. I wonder why that should be.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-200898352864757424?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/200898352864757424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=200898352864757424&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/200898352864757424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/200898352864757424'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2010/01/observations-on-spotify.html' title='Observations on Spotify'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6349104514374266512</id><published>2009-12-28T14:09:00.040Z</published><updated>2009-12-30T19:42:38.418Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Bayesian Testing?</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;&lt;div&gt;I'm tossing this idea out into the world. It's half-formed and I'm learning as I go along. It may be invalid, it may be old news, it may not. What I'm hoping for is that someone who knows more about at least one of testing and Bayesian inference than I do will come and set me straight. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;UPDATE:&lt;/span&gt;&lt;/b&gt; Laurent Bossavit turned out to be that person. The results below have be adjusted significantly a a result of a very illuminating conversation with him. Whatever virtue these results now have is due to him (and the defects remain my responsibility). Laurent, many thanks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In addition, a bunch of folks kindly came along to an &lt;a href="http://xpday-london.editme.com/TestsAsEvidence"&gt;open space session&lt;/a&gt; at &lt;a href="http://www.xpday.org/"&gt;Xp Day London&lt;/a&gt; this year. &lt;a href="http://dolsonagile.wordpress.com/2009/12/08/xpday-day-2/"&gt;Here is the commentary of one&lt;/a&gt;. From that already the idea became better formed, and this article reflects that improvement, thanks all. If you want to skip the motivation and cut to the chase, go &lt;a href="http://peripateticaxiom.blogspot.com/2009/12/bayesian-testing.html#example"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Evidence&lt;/h2&gt;You may have &lt;a href="http://faculty-staff.ou.edu/W/Jonathan.D.Wren-1/The%20Fine%20Art%20of%20Baloney%20Detection.htm"&gt;read&lt;/a&gt; that &lt;i&gt;absence of evidence is not evidence of absence&lt;/i&gt;. Of course, this is exactly wrong. I've just looked, and there is no evidence to be found that the room in which I am sitting (nor the room in which you are, I'll bet: look around you right now) contains an elephant. I consider this strong evidence that there is no elephant in the room. Not proof, and in some ways not the best reason for inferring that there is no elephant, but certainly evidence that there is none. This seems to be different from the form of bad logic that Sagan is actually criticising, in which the absence of evidence that there isn't an elephant in the room would be considered crackpot-style evidence that there &lt;i&gt;was&lt;/i&gt; an elephant in the room.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You may also have &lt;a href="http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF"&gt;read&lt;/a&gt; (on page 7 of that pdf) that &lt;i&gt;program testing can be used to show the presence of bugs, but never to show their absence!&lt;/i&gt; I wonder. In the general case this certainly seems to be so, but I'm going to claim that working programmers don't often address the general case.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dijkstra's argument is that, even in the simple example of a multiplication instruction, we do not have the resources available to exhaustively test the implementation but we still demand that it should correctly multiply any two numbers within the range of the representation. Dijkstra says that we can't afford to take even a representative sample (whatever that might look like) of all the possible multiplications that our multiplier might be asked to do. And that seems plausible, too. Consider how many distinct values a numerical variable in your favourite language can take, and then square it. That's how many cases you expect the multiplication operation in your language to deal with, and deal with correctly. As an aside: do you expect it to work correctly? If so, why do you?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a id="example"&gt;In this post I want to explore an approach that seems as if it might help us to decide how much confidence in the correctness of some code we should have, given the test results we can obtain about it.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;A Small Example of Confidence&lt;/h2&gt; Let's say that we wish to write some code to recognise if a stone played in a game of &lt;a href="http://en.wikipedia.org/wiki/Go_(game)"&gt;Go&lt;/a&gt; is in atari or not (this is my favourite example, for the moment). The problem is simple to state: a stone with two or more "liberties" is not in atari, a stone with one liberty is in atari. A stone can have 1 or more liberties. In a real game situation it can be some work to calculate how many liberties a stone has, but the condition for atari is that simple. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A single stone can have only 1, 2, 3 or 4 liberties and those are the cases I will address here. I write some code to implement this function and I'll say that I'm fairly confident I've got it right (after all, it's only an &lt;code&gt;if&lt;/code&gt;), but not greatly so. Laurent proposed a different question to ask from the one I was asking before—a better question, and he helped me find and understand a better answer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The prior probability of correctness that question leads to is 1 ⁄ 16. This is because there are 16 possible one-to-one onto mappings from {1, 2, 3, 4} to {T, F} and only one of them is the correct function. Thus, the prior is the prior probability that my function behaves identically to some other function that is correct by definition.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How might a test result influence that probability of correctness? There is a &lt;a href="http://spreadsheets.google.com/pub?key=tnjLDV9k47GnGraUnKmTD8Q&amp;amp;single=true&amp;amp;gid=0&amp;amp;output=html"&gt;spreadsheet&lt;/a&gt; which shows a scheme for doing that using what very little I understand of &lt;a href="http://en.wikipedia.org/wiki/Bayesian_inference"&gt;Bayesian inference&lt;/a&gt;, slightly less naïvely applied than before. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cells in the spreadsheet are colour–coded to give a guide as to how the various values are used in the Bayesian formula. The key, as discussed in the XpDay session is how to count cases to find the conditional probabilities of seeing the evidence. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The test would look something like this:&lt;br /&gt;&lt;style type="text/css"&gt;table.test td{ border-style:solid; border-width:1px; border-color:gray} .sig{background:LightGray} .pass{background:LightGreen} .fail{background:LightPink}&lt;/style&gt;&lt;table class="test"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;One Liberty Means Atari&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="sig"&gt;liberties&lt;/td&gt;&lt;td class="sig"&gt;atari?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td class="pass"&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; The posterior probability of correctness is &lt;b&gt;0.125 &lt;/b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Adding More Test Cases&lt;/h2&gt;Suppose that I add another case that shows that when there are 2 liberties the code correctly determines that the stone is not in atari.&lt;br /&gt;&lt;table class="test"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;One Liberty Means Atari&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="sig"&gt;liberties&lt;/td&gt;&lt;td class="sig"&gt;atari?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td class="pass"&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td class="pass"&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;Using the same counting scheme as in the first case and using the updated probability from the first case as the prior in the second then it seems as if the updated probability of correctness with the new evidence is increased to &lt;b&gt;0.25&lt;/b&gt; as &lt;a href="http://spreadsheets.google.com/pub?key=tnjLDV9k47GnGraUnKmTD8Q&amp;amp;single=true&amp;amp;gid=1&amp;amp;output=html"&gt;this&lt;/a&gt; sheet shows.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;But suppose that the second test actually showed  an incorrect result: 2 liberties and atari true. &lt;table class="test"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;One Liberty Means Atari&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="sig"&gt;liberties&lt;/td&gt;&lt;td class="sig"&gt;atari?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td class="pass"&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td class="fail"&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Then, as we might expect, the updated probability of correctness falls to &lt;b&gt;0.0&lt;/b&gt; as shown &lt;a href="http://spreadsheets.google.com/pub?key=tnjLDV9k47GnGraUnKmTD8Q&amp;amp;single=true&amp;amp;gid=2&amp;amp;output=html"&gt;here&lt;/a&gt;. And as the formula works by multiplication of the prior probability by a factor based on the evidence, the updated probability will stay at zero no matter what further evidence is presented—which seems like the right behaviour to me.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;This problem is very small, so in fact we can exhaustively test the solution. What happens to the probability of correctness then? Extending test coverage to these cases&lt;br /&gt;&lt;table class="test"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;One Liberty Means Atari&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="sig"&gt;liberties&lt;/td&gt;&lt;td class="sig"&gt;atari?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td class="pass"&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td class="pass"&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td class="pass"&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; gives an updated probability of &lt;b&gt;0.5&lt;/b&gt; as shown &lt;a href="http://spreadsheets.google.com/pub?key=tnjLDV9k47GnGraUnKmTD8Q&amp;amp;single=true&amp;amp;gid=3&amp;amp;output=html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;One more case remains to be added:&lt;br /&gt;&lt;table class="test"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;One Liberty Means Atari&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="sig"&gt;liberties&lt;/td&gt;&lt;td class="sig"&gt;atari?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td class="pass"&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td class="pass"&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td class="pass"&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td class="pass"&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; and the posterior probability of correctness is updated to &lt;b&gt;1.0&lt;/b&gt; as shown &lt;a href="http://spreadsheets.google.com/pub?key=tnjLDV9k47GnGraUnKmTD8Q&amp;amp;single=true&amp;amp;gid=4&amp;amp;output=html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That result seems at to contradict Dijkstra:  exhaustive testing, in a case where we can do that, does show the absence of bugs. He probably knew that.&lt;br /&gt;&lt;img src="http://spreadsheets.google.com/oimg?key=0AgiIblVYHDgsdG5qTERWOWs0N0duR3JhVW5LbVREOFE&amp;amp;oid=1&amp;amp;v=1262156070431" /&gt;&lt;/div&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Next?&lt;/h2&gt;My brain is fizzing with all sorts of questions to ask about this approach: I talked here about retrofitted tests, can it help with TDD? Can this approach guide us in choosing good tests to write next? How can the structure of the domain and co-domain of the functions we test guide us to high confidence quickly? Or can't they? Can the current level of confidence be a guide to how much further investment we should make in testing?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some interesting suggestions are coming in in the comments, many thanks for those.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My next plan I think will be to repeat this exercise for a slightly more complex function.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6349104514374266512?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6349104514374266512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6349104514374266512&amp;isPopup=true' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6349104514374266512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6349104514374266512'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/12/bayesian-testing.html' title='Bayesian Testing?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7445627264435765188</id><published>2009-11-25T11:26:00.002Z</published><updated>2009-11-25T11:27:58.184Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='articles'/><title type='text'>New article for BCW</title><content type='html'>If you read this blog then there's likely little new for you in &lt;a href="http://www.businesscomputingworld.co.uk/?p=1618"&gt;this article&lt;/a&gt; for Business Computing World, but it might amuse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7445627264435765188?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7445627264435765188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7445627264435765188&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7445627264435765188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7445627264435765188'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/11/new-article-for-bcw.html' title='New article for BCW'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-9149063043224656262</id><published>2009-11-12T15:16:00.003Z</published><updated>2009-11-12T15:24:53.816Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='xtc'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Innovation Games</title><content type='html'>Next Tuesday there will be a special &lt;a href="http://xpday-london.editme.com/eXtremeTuesdayClub"&gt;XtC&lt;/a&gt; event at Zuhlke's office in London. &lt;a href="http://www.lukehohmann.com/blog/index.php"&gt;Luke Hohmann&lt;/a&gt; will be demonstrating his &lt;a href="http://www.innovationgames.com/"&gt;innovation games&lt;/a&gt; for Agile teams. Should be good. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Details &lt;a href="http://xpday-london.editme.com/XTC20091117"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-9149063043224656262?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/9149063043224656262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=9149063043224656262&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9149063043224656262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9149063043224656262'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/11/innovation-games.html' title='Innovation Games'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7226528979665693405</id><published>2009-11-09T10:17:00.003Z</published><updated>2009-11-09T10:21:57.785Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='xpday'/><title type='text'>Places remain at  XP Day London 2009</title><content type='html'>&lt;a href="http://www.xpday.org/"&gt;XP Day London&lt;/a&gt; is filling up, but places remain. The &lt;a href="http://www.xpday.org/programme"&gt;programme&lt;/a&gt; is looking very good. Register &lt;a href="http://booking.xpday.org/registration.php"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7226528979665693405?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7226528979665693405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7226528979665693405&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7226528979665693405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7226528979665693405'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/11/places-remain-at-xp-day-london-2009.html' title='Places remain at  XP Day London 2009'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-9198354732297973865</id><published>2009-11-03T17:51:00.004Z</published><updated>2009-11-04T09:54:37.159Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lessons from life'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Sketches</title><content type='html'>One of the things I like to do in my free time is to dabble, in the most unschooled fashion imaginable, in music composition. Composing is hard. About as hard (and remarkably similar to) programming. &lt;a href="http://www.schoenberg.at/default_e.htm"&gt;Arnold Schoenberg&lt;/a&gt; offers this "advice for self-criticism" to students of composition:&lt;blockquote&gt;6. MAKE MANY SKETCHES&lt;br /&gt;Join the best sketches to produce others and improve them until the result is satisfactory.&lt;p&gt;To make sketches is a humble and unpretentious approach toward perfection. &lt;/p&gt;—&lt;em&gt;Fundamentals of Musical Composition, Ch XII&lt;/em&gt;&lt;/blockquote&gt;I think that this applies equally well to programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-9198354732297973865?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/9198354732297973865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=9198354732297973865&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9198354732297973865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9198354732297973865'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/11/sketches.html' title='Sketches'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7055025867114965092</id><published>2009-10-19T22:14:00.002+01:00</published><updated>2009-10-19T22:19:46.873+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='xpday'/><title type='text'>XP Day London 09: Programme</title><content type='html'>After a lot of wrangling the almost-but-not-quite final &lt;a href="http://xpday.org/programme"&gt;programme for XP Day London&lt;/a&gt; is now available. Because of illness and other asynchronous distractions some of the presenters had to change at the last minute we still have to nail down one session, but this will be pretty much it.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This year we have a lot of excellent experience reports from a range of practitioners who've been doing exiting new things and some really &lt;a href="http://xpday.org/2009/keynotes"&gt;outstanding keynotes&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://xpday.org/register"&gt;Register now!&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7055025867114965092?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7055025867114965092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7055025867114965092&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7055025867114965092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7055025867114965092'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/10/xp-day-london-09-programme.html' title='XP Day London 09: Programme'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-956763838570467765</id><published>2009-10-18T13:51:00.010+01:00</published><updated>2009-10-18T18:13:37.561+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><title type='text'>Scheduling by value?</title><content type='html'>David Peterson has started &lt;a href="http://www.kanbanblog.com/"&gt;a new blog&lt;/a&gt; on Kanban (and snaffled a very tasty URL for it). He presents &lt;a href="http://www.kanbanblog.com/article/time-at-bottleneck.html"&gt;this discussion&lt;/a&gt; of scheduling features into a development team. The case the David presents is related to a behaviour I sometimes see with inexperienced teams who's just had someone go learn Scrum. Comes the next planning meeting and this idea pops up that the backlog needs to be ordered by "business value" so that the "most valuable" features can be delivered earliest.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This can easily lead to some very nasty scenes where the Scrum Master demands that the Product Owner produce a "value" for each story—actually write a number on the card. The problem comes to a head when it turns out that the Product Owner not only doesn't know the value of the stories they are putting on the backlog, but they also have no way of finding out what they value of a story is. And this isn't because they are stupid, nor incompetent, nor malicious. It's because finding that value is far, far too difficult and time consuming an activity. And there's a good chance that any answer that came out of it would be so well hedged as to be meaningless.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometimes the Product Owner does know, or can find out at reasonable cost, a value for a story or feature. Being able to trade a new asset class probably can be valued. Changing a flow to give 10% high conversion probably can be valued. Improving a model to get 1% higher efficiency in the machines it's used to design can probably be valued. These valuations will be functions of time time and various other parameters. If you really have to, you could get a number of them that's valid today (and perhaps only today). David makes the point that even if you do know that number for a feature, scheduling the next one simply on the basis of highest value might not be the smartest move. There are other variables to consider. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a case to be made that within the context of a project value isn't the best figure of merit to use anyway, since someone should have made a go/no-go decision at some point that the planned budget and planned value seemed reasonable. That decision should be re-assessed frequently (far too little of this goes on) based on progress to date, and action taken if the actuals have come too far adrift, but in-between those times trying to optimise on value is perhaps not worth it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another option is to indeed demand (and obtain) those value numbers and then &lt;a href="http://legalizeadulthood.wordpress.com/2009/09/04/agile-roundtable-notes-september-3rd-2009/"&gt;schedule work &lt;/a&gt;&lt;i&gt;&lt;a href="http://legalizeadulthood.wordpress.com/2009/09/04/agile-roundtable-notes-september-3rd-2009/"&gt;primarily&lt;/a&gt;&lt;/i&gt;&lt;a href="http://legalizeadulthood.wordpress.com/2009/09/04/agile-roundtable-notes-september-3rd-2009/"&gt; on the basis of business value&lt;/a&gt; and dispense with effort estimates, so-called "&lt;a href="http://agiletoolkit.libsyn.com/index.php?post_id=400364"&gt;naked planning&lt;/a&gt;". This has &lt;a href="http://alistair.cockburn.us/Internal+versus+commercial+value"&gt;caused eyebrows to be raised&lt;/a&gt;. The underlying claim is that&lt;/div&gt;&lt;blockquote&gt;value varies along an exponential scale while development costs vary along a linear scale. Therefore delivering the most valuable features trumps any consideration of whether or not the most valuable feature is cheap or easy to develop&lt;/blockquote&gt;whihc, if true of your environment, might give pause for though. How this interacts with the desire to schedule so as to maximise throughput at the bottleneck is an open question, for me at least.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-956763838570467765?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/956763838570467765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=956763838570467765&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/956763838570467765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/956763838570467765'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/10/scheduling-by-value.html' title='Scheduling by value?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2942335547606177056</id><published>2009-09-09T19:51:00.005+01:00</published><updated>2009-09-09T20:25:37.060+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='service oriented architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons from life'/><title type='text'>Service-Oriented Architecture</title><content type='html'>I'm currently embroiled in the long and fraught process of having telephony and data services installed in a certain location. One supplier steadfastly and consistently refused to respond to my offers to become a paying customer, so I selected another who were very responsive at first, but have become less and less so over time. In fact, it's about two months since I signed and still no service has been provided (although bills have been sent). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Part of my frustration with this is that it's very hard to find out what's going on. The company, a British telecoms provider and let's leave it at that, was once a monolithic monopoly but now has been dissected into multiple different business units, components, we might almost call them, each—I suppose—focussing on its so–called Core Competence (and more on that in a later post). Each of these components has its various workflows that it does and one or more contracts with other components for services it supplies or consumes and the components communicate by passing electronic messages to one another. Sometimes they pass electronic messages to me, complete with the URL of some other component where I have to go and do some action. It's all very slick and automated and orchestrated and, indeed, seems to have a mind of its own. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For instance, the putting-in-wires component received a message telling it to come to my location and do just that. Unfortunately, the agent of the no-I-mean-really-putting-in-wires component to which they delegated implementation of that action was not able to complete it. He sent a message saying so and various exception flows kicked off, requiring a &lt;i&gt;lot&lt;/i&gt; of manual intervention, oh yes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meanwhile, the arrange-for-telephony component turned out to have a clock running and when a certain (unpublicised) duration had elapsed without it receiving a notification of success from the putting-in-wires component (which was busy with some recovery actions on the no-I-mean-really-putting-in-wires component) it triggered a flow that cancelled my original request to have some services. A notification was received by one (but not all) of the taking-money-off-you components and one of them sent me a message telling me that my order for some services had been cancelled. A good thing, because otherwise I would have been blissfully unaware of the situation. On the other hand I am now angrily aware of the situation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, here's the fun bit: irrespective which component sends me a message, no agent working for that component can explain to me what the message means, because whatever it means that meaning belongs to whatever other component sent the earlier message that lead the the message I received being sent. And no, they can't put me through to an agent in that component. There is no interoperability layer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today I spoke with five agents in three different components. One of them gave me quite the run–around because although I had contacted him through the callback given in the message I'd received from his component I had mis–configured part of my message header leading to my message being dispatched to the wrong agent because I had misunderstood the published specification for that header which he freely admitted was itself a shoddy piece of work with unreasonable and misleading contents but it was still my problem that I'd botched the message send.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, I've learned that to get to speak to an agent at all I have to go twice around the loop of failing a handshake because I can't provide a piece of data that the protocol requires but that I won't get until the request succeeds. After two failures in a row a supervisory process notices and I'm failed over to a more generic service through which I can contact an agent, but that service is not exposed on a public URL.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To all of which I say: bring back the mainframe.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2942335547606177056?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2942335547606177056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2942335547606177056&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2942335547606177056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2942335547606177056'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/09/service-oriented-architecture.html' title='Service-Oriented Architecture'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-8251069171736387238</id><published>2009-09-08T10:09:00.008+01:00</published><updated>2009-11-12T15:40:50.889Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='estimation'/><title type='text'>Observations on Estimation</title><content type='html'>Teams following a process like Scrum tend to estimate the "size" of stories as an aid to figuring out a commitment for a sprint. My view is that this is a transitional practice, and that the aim should be to learn how to make stories all roughly the same size so that commitments (also a transitional practice) can be determined by counting.&lt;br /&gt;&lt;br /&gt;While all of that is going on teams that want to use a numerical scale to estimate (rather than, say,  "t-shirt" sizing) tend to choose a scale, a sequence of licit values from which estimates must be drawn. The various planning tools that demand a numerical field be filled in tend to force this issue.&lt;br /&gt;&lt;br /&gt;I've noticed a tendency for "expert" level practitioners to want to use some clever non-linear scale, maybe Fibonacci numbers (1,2,3,5,8,13), maybe a geometric series (1,2,4,8,16) and they will have some sophisticated reason why this or that series is preferred. And I've noticed that a lot of teams aren't comfortable with this. They want to use a linear scale.&lt;br /&gt;&lt;br /&gt;It seems to be traumatic enough that the estimates don't have units, or even dimensions. The idea that estimates are dimensionless but also structured can be a double cause of confusion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anecdote:&lt;/span&gt; a team had been estimating and planning and delivering consistently for a good long time. Their velocity was fairly constant, but drifted over time (fair enough). One day it turned out that their velocity happened to be numerically equal to the number of team members times the number of days to the next planning horizon. Someone noticed this and with a huge sigh of relief the team concluded that these mysterious "units" in which they estimated were actually man-days in disguise. Now they finally understood what they were estimating! And they promptly lost the ability to estimate: their next planning session was all over the place and it took some time for their planning activities to converge again. My inference was that it's actually quite important that estimates are dimensionless.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anecdote:&lt;/span&gt; a User Experience expert at a client had been involved in some research whereby (as a side effect) members of the general public had to create a scale that made sense to them within which to rank the usability of features. These folks were presented with different  generic objects and asked to give them a "size",  and then to give a corresponding "size" to some other generic objects in order to create a scale that made sense to them, which would then be applied to the merit of the system features that were the actual target of the research. They created linear scales. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[After seeing this he added the observation that this process was in aid of avoiding what often happens with the strongly disagree, disagree, no preference... type of scale which is either polarised or bland results, neither of which is that useful]&lt;br /&gt;&lt;br /&gt;That surprised me at first, since I know that the physics of our sensory apparatus are generally non-linear, and memory is non-linear and so forth. But thinking about it some more I realised that our &lt;span style="font-style: italic;"&gt;experience&lt;/span&gt; tends to seem to be linear, even if the underlying phenomena aren't.&lt;br /&gt;&lt;br /&gt;Meanwhile, if one did want to use a particular scale for estimating the size of stories, why not use one of the series of &lt;a href="http://en.wikipedia.org/wiki/Preferred_number#Renard_numbers"&gt;prefered values&lt;/a&gt;? They are very well established in engineering and product design and offer interesting error-minimising properties. On the other hand, it might be a real struggle to get a team to decide if a story was a 1.6 or a 3.15&lt;br /&gt;&lt;br /&gt;I don't have a grand narrative into wich to fit these observations, but &lt;a href="http://blogs.msdn.com/cellfish/archive/2009/10/23/never-convert-your-story-points-to-time.aspx"&gt;here&lt;/a&gt; is another related anecdote about estimation.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-8251069171736387238?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/8251069171736387238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=8251069171736387238&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/8251069171736387238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/8251069171736387238'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/09/observations-on-estimation.html' title='Observations on Estimation'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6747627483747581074</id><published>2009-08-17T21:22:00.005+01:00</published><updated>2009-09-23T10:34:31.755+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='real engineers'/><title type='text'>Real Engineers</title><content type='html'>There's a recurring fashion for beating up those who would build software for a living with tales of how "real" engineers do it. This started with the woefully misguided "Software Engineering" conferences of the late 1960's and continues on-and-off to this day.&lt;br /&gt;&lt;br /&gt;As a response to this I like to collect examples of "real" engineers screwing up. Not out of malice, but out of a desire to ground certain aspects of my professional life in something resembling fact. Here are&lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2009/07/09/AR2009070903020.html"&gt; some reported facts&lt;/a&gt; about the Lockheed Martin F-22 "Raptor" fighter aircraft:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the aircraft has recently required more than 30 hours of maintenance for every hour in the skies&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the canopy needs refurbishing after 331 hours of flying, less than half the design goal of 800 hours, and this costs $120,000 a pop&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the aircraft is almost twenty thousand dollars more expensive to fly &lt;i&gt;per hour&lt;/i&gt; than its predecessor (which costs an already eye-watering 30+ grand per hour—what do they run on, Chanel No 5? Single malt whisky?)&lt;/li&gt;&lt;/ol&gt;And so on. Just to add to the fun, the development cycle for this aircraft was so long that the class of mission for which it was designed &lt;i&gt;no longer takes place&lt;/i&gt;.Is this the fault of the folks at Lockheed Martin? Not really. It's the fault of a system that put politics ahead of engineering, a circumstance under which no-one can be successful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6747627483747581074?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6747627483747581074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6747627483747581074&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6747627483747581074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6747627483747581074'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/08/real-engineers.html' title='Real Engineers'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3762170785622192226</id><published>2009-08-11T08:34:00.003+01:00</published><updated>2009-08-11T08:44:29.500+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='iso 9000'/><title type='text'>Change</title><content type='html'>We aim to keep all our offices ISO 9000 certified. This means updating the procedures to reflect our increasing tendency to run software development projects under an Agile process. It's fallen to me to update our existing "Change Control" procedure which of its kind is very good, but does build up from the assumption that to have a change to control is an exceptional (although expected) event. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I keep wanting to turn that inside out and say—deal with &lt;i&gt;every&lt;/i&gt; requirement this way, make this the default, make the threshold of cost/schedule/risk impact for triggering change control be 0.0 in all cases, have the Change Control Board meet every week, have them assess the impact of every item and decide whether or not to schedule it, have no other way to schedule any activity than via the change log. And bingo! Your project would pretty much be agile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In fact, I might just do that.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3762170785622192226?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3762170785622192226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3762170785622192226&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3762170785622192226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3762170785622192226'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/08/change.html' title='Change'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6456101729279924044</id><published>2009-08-04T20:37:00.005+01:00</published><updated>2009-08-04T21:54:53.923+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tangential rambling'/><title type='text'>De–skilling through Technology: friend and foe</title><content type='html'>Once, and for a mercifully short time, I lived  on the very western edge of Bournemouth. You might recall that Ford considered his article for the &lt;i&gt;Guide&lt;/i&gt; describing how to have a good time in Bournemouth to be one of his finest pieces of fiction. So, I was often wanting to go away, farther away than I could sensibly go on my &lt;a href="http://www.royal-enfield.com/"&gt;pseudo-vintage motorcycle&lt;/a&gt; in what time was available. That meant going&lt;a href="http://maps.google.com/maps?f=d&amp;amp;source=s_d&amp;amp;saddr=Westbourne+Park+Rd&amp;amp;daddr=Unknown+road&amp;amp;hl=en&amp;amp;geocode=FcrnBQMd4-ni_w%3BFRcIBgMdr43j_w&amp;amp;mra=ls&amp;amp;sll=50.722791,-1.888833&amp;amp;sspn=0.016763,0.033345&amp;amp;ie=UTF8&amp;amp;z=14"&gt; from the County Gates to Bournemouth railway station&lt;/a&gt;. This could be done on the cramped, slow local bus or at great expense by taxi. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I noticed that the long–distance coaches coming in from the even further south and west of England made one last stop before Bournemouth Coach Station (adjacent to the railway station) in Westbourne, just around the corner from me. These coaches are large, have luggage space and go fast on major roads. And the on–line booking system did not blink an electronic eye at me buying and downloading to print out a 90 pence ticket to ride from Westbourne to Bournemouth. The drivers of the coaches did blink when I got on there, but I had a ticket so they shrugged and went about their business. That's nice. Imagine the counter–arguments that would likely come from a human ticket agent who knows only too well the various alternatives to doing so preposterous a thing as riding a long–haul coach half–way across the town where you live.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, much more recently I was on the very edge of the very agreeable city of Charlotte, North Carolina. I had been down–town to check out the excellent &lt;a href="http://www.mintmuseum.org/"&gt;Mint Museum&lt;/a&gt;. Being a citizen of the Socialist People's Republic of Europe I naturally tried to do the journey by public transport. Charlotte has a pretty good public transport system, C.A.T.S. However, it turned out that the bus service that would otherwise run from exactly the last stop of the light rail system (the "Lynx") to exactly my hotel was not running that day. Nice try, but I have to do the last few miles by cab. Now, I am a stranger to the city and am in any case in a fairly obscure part of it. I call a cab company and while I can explain with a certain degree of accuracy where I want to &lt;i&gt;go&lt;/i&gt;, I don't know where I &lt;i&gt;am&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And that's a problem. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The cabs are guided by GPS, so they need an exact street address for pickup and set down. This is so that the drivers do not need to know their way around. That's a pretty shocking concept for a resident of London, where cab drivers &lt;a href="http://www.tfl.gov.uk/businessandpartners/taxisandprivatehire/1412.aspx"&gt;know their way around&lt;/a&gt; so well &lt;a href="http://www.pnas.org/content/97/8/4398.full"&gt;it changes their brains&lt;/a&gt;. Troublesome de–skill #1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All I know is that I'm at the last stop of the Blue Line, but I don't know where that is. And neither does the dispatcher at the cab company—after all, all they do is pass on the co–ordinates of two places they don't know the location of to drivers who don't know the route between them. De–skill #2. Luckily for me, the dispatcher thought that they knew someone who might be able to figure out where this Lynx station was. I should call back in a few minutes. I do so, and by virtue of the elevated situation of the station I can call off enough landmarks (that is, names of shopping malls) for this person at the other end to work out where I am. My hotel, for some reason, they can look up very easily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some time later a cab rolls up. And it turns out that all this marvellous de–skilling has been wasted because the guy is a veteran driver and knows the district like the back of his hand.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, once I'm seated and strapped in, his first question is: &lt;i&gt;so, where are we going?&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6456101729279924044?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6456101729279924044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6456101729279924044&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6456101729279924044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6456101729279924044'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/08/deskilling-through-technology-friend.html' title='De–skilling through Technology: friend and foe'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5934617020963863030</id><published>2009-07-12T01:00:00.004+01:00</published><updated>2009-07-12T01:28:23.834+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='don&apos;t serialise activities'/><title type='text'>Finish-start Dependencies: just say no!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_itmSz8f6ak4/SlkqxDXtYVI/AAAAAAAAABk/gJv-IboEpCY/s1600-h/serial.png" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 258px; height: 259px;" src="http://1.bp.blogspot.com/_itmSz8f6ak4/SlkqxDXtYVI/AAAAAAAAABk/gJv-IboEpCY/s320/serial.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5357360253940621650" /&gt;&lt;/a&gt;I'm working with a team that have (as do we all) a tendency when under stress to fall back upon what they are comfortable with—in particular, to serialising their activities. "We can't &lt;i&gt;x&lt;/i&gt; because they haven't finished &lt;i&gt;y&lt;/i&gt; because they're waiting for &lt;i&gt;z&lt;/i&gt;..."&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To help them remember that this isn't the best move they can make, I've devised this symbol to display in the team area. You are welcome to use it yourself.&lt;/div&gt;&lt;br /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/uk/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/2.0/uk/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/StillImage" property="dc:title" rel="dc:type"&gt;No Serialised Activities&lt;/span&gt; by &lt;a cc="http://creativecommons.org/ns#" href="http://peripateticaxiom.blogspot.com/2009/07/finish-start-dependencies-just-say-no.html" property="cc:attributionName" rel="cc:attributionURL"&gt;Keith Braithwaite&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/uk/"&gt;Creative Commons Attribution-Noncommercial-Share Alike 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.&lt;br /&gt;Based on a work at &lt;a dc="http://purl.org/dc/elements/1.1/" href="http://1.bp.blogspot.com/_itmSz8f6ak4/SlkqxDXtYVI/AAAAAAAAABk/gJv-IboEpCY/s1600-h/serial.png" rel="dc:source"&gt;1.bp.blogspot.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5934617020963863030?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5934617020963863030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5934617020963863030&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5934617020963863030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5934617020963863030'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/07/finish-start-dependencies-just-say-no.html' title='Finish-start Dependencies: just say no!'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_itmSz8f6ak4/SlkqxDXtYVI/AAAAAAAAABk/gJv-IboEpCY/s72-c/serial.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2196042387143936336</id><published>2009-07-04T21:14:00.004+01:00</published><updated>2009-07-05T20:40:08.357+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book review'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='metaphor'/><title type='text'>Learning from Architects</title><content type='html'>From dog–houses to skyscrapers, the discipline of the building architect has long been a rich source of metaphor for system architects. I don't disagree, indeed in one of my contributions to the &lt;a href="http://www.amazon.co.uk/Things-Every-Software-Architect-Should/dp/059652269X"&gt;97 Things Every Software Architect Should Know&lt;/a&gt; I recommended that software architects should &lt;a href="http://97-things.near-time.net/wiki/Learn%20from%20Architects%20of%20Buildings"&gt;learn from architects of buildings&lt;/a&gt;. So, you can imagine that my eye was caught by Matthew Frederick's &lt;a href="http://www.amazon.co.uk/101-Things-Learned-Architecture-School/dp/0262062666/"&gt;101 Things I Learned in Architecture School&lt;/a&gt;. This small book contains the eponymous count of hints, tips and tricks from a qualified architect to architecture students. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a good resource for those of us who would learn from architects of buildings, as it is advice to would–practitioners from a practitioner and as such relates to what building architects actually do, rather than what someone who isn't a practitioner thinks they must, surely, do. This latter is a common failure mode of software professionals seeking inspiration from other disciplines—all the way back to the very first Software Engineering conferences of the late 1960's, in which an hallucinatory notion of what "engineers" do was foisted upon us. But I digress.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Some of the 101 are very low level and very specific (eg &lt;b&gt;Number 90&lt;/b&gt; "Roll your drawings for transport or storage with the image side facing out"), others are much broader and seem to me to have relevance for any sort of design work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 15&lt;/b&gt; tells us that "A &lt;i&gt;parti&lt;/i&gt; is the central idea or concept of a building." &lt;a href="http://en.wikipedia.org/wiki/Parti"&gt;Wikipedia&lt;/a&gt; tells us that &lt;i&gt;parti&lt;/i&gt; is from the French &lt;i&gt;prendre parti&lt;/i&gt; "to make a decision". The &lt;i&gt;parti&lt;/i&gt; captures, presents and summarises the highest level decision that has been made about the organising principle of an entire building or building project, and examples are given where the &lt;i&gt;parti&lt;/i&gt; expresses all that in one, highly abstract, diagram. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A &lt;i&gt;parti&lt;/i&gt; sounds to me a lot like a &lt;a href="http://c2.com/xp/SystemMetaphor.html"&gt;system metaphor&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 100&lt;/b&gt; tells us that the &lt;i&gt;parti &lt;/i&gt;should have a name, such as "half–eaten donut" or "meeting of strangers".  Could the nominal (or de facto [&lt;a href="http://www.blogger.com/post-edit.g?blogID=23912478&amp;amp;postID=2196042387143936336#arch"&gt;*&lt;/a&gt;&lt;a id="arch-back"&gt;&lt;/a&gt;]) architect of the system that you are working on draw such a diagram? Would it tell anyone anything if they did? Could they name the &lt;i&gt;parti&lt;/i&gt;, the very highest level design decision from which the rest of the system design flows?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 28&lt;/b&gt; tells us that a good designer isn't afraid to throw away a good idea. Notice: a &lt;i&gt;good&lt;/i&gt; idea. An idea can be good and not fit with the &lt;i&gt;parti&lt;/i&gt;, in which case it has no place in the design. We are advised to "save [...] good but ill–fitting ideas for another time and project—and with the knowledge that they might not work then, either." When was the last time you (or your team) threw out a good idea? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 46 &lt;/b&gt;tells us to "Create architectural richness through &lt;i&gt;informed simplicity&lt;/i&gt; or an &lt;i&gt;interaction of simples &lt;/i&gt;rather than through unnecessarily busy agglomerations". Frederick warns particularly against "busying up a project with doodads because it is boring without them; agglomerating many unrelated elements without concern for their unity because they are interesting in themselves." What interesting doodads does your current project have?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One reason to follow the guidance of Number 46 is given in &lt;b&gt;Number 51&lt;/b&gt;, which observes that "Beauty is due more to the harmonious relationships among the elements of a composition than to the elements themselves". One achieves this beauty through a design process, or system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 77&lt;/b&gt; cautions that "No design system is or should be perfect. Designers are often hampered by a well–intentioned by erroneous belief that a good design solution is perfectly systematic [...] but nonconforming oddities can be enriching, humanising aspects of your project." 77 also observes that "exceptions to the rule are often more interesting that the rules themselves."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 81&lt;/b&gt; notes that "Properly gaining control of the design process tends to feel like one is &lt;i&gt;losing&lt;/i&gt; control of the design process" 81 advises that the designer should "accept uncertainty. Recognise as normal the feeling of lostness that attends to much of the process. Don't seek to relieve your anxiety by marrying yourself prematurely to a design solution; design divorces are never pretty" No, they never are. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Number 99&lt;/b&gt; can help. It says "Just do something. [...] don't wait for clarity to arrive before beginning to draw. Drawing is not simply a way of depicting a design solution; it is itself a way of learning about the problem you are trying to solve." I think that much the same can be said for coding. Are the design procedures in your team aligned with these principles?  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[&lt;a id="arch"&gt;&lt;/a&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=23912478&amp;amp;postID=2196042387143936336#arch-back"&gt;*&lt;/a&gt;] Even the most self–organised, most cross–functional, most Agile, most collectively–code–owning software development team will have one individual who knows most about (and likely has most influence over) the architecture of the system. You can pretend otherwise, or you can take advantage of it.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2196042387143936336?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2196042387143936336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2196042387143936336&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2196042387143936336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2196042387143936336'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/07/learning-from-architects.html' title='Learning from Architects'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7776751819730099371</id><published>2009-06-29T22:15:00.002+01:00</published><updated>2009-06-29T22:19:47.235+01:00</updated><title type='text'>Plaudit</title><content type='html'>&lt;a href="http://www.noop.nl/2009/06/top-200-blogs-for-developers-q2-2009.html"&gt;Apparently&lt;/a&gt;, this is the 141st most "top" blog for developers (as of Q2 2009). That's probably pretty far out along some long tail of topness. Ah well. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The metric used captures something like degree of interest of the rest of the blogosphere. So, thanks for your interest. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7776751819730099371?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7776751819730099371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7776751819730099371&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7776751819730099371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7776751819730099371'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/06/plaudit.html' title='Plaudit'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3877152177530466653</id><published>2009-06-29T21:21:00.003+01:00</published><updated>2009-06-29T22:13:05.641+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metrics'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='comfort'/><title type='text'>Let's talk about feelings</title><content type='html'>I seem to recall that back in the days when he was prone to wild outbursts of public self-examination (this even before blogging and twitter) &lt;a href="http://www.cleeseblog.com/"&gt;John Cleese&lt;/a&gt; gave an interview in part about his early experiences with therapy, with a "talking" cure. His therapist would begin, "How do you feel?" and John would say "Well, I think..." and his therapist would interrupt "No. How do you feel?" and John would say "Well, I think..." and his therapist would interrupt "No. How do you feel?" And so on. You can see the problem. And he couldn't, I suppose. Which was the problem.&lt;br /&gt;&lt;br /&gt;More and more these days I want to ask people how they &lt;span style="font-style:italic;"&gt;feel&lt;/span&gt; about their code. Here's part of why.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://puttingtheteaintoteam.blogspot.com/"&gt;Ivan  Moore&lt;/a&gt; and "the other" Mike Hill have this conference session that they do called &lt;a href="http://jaoo.dk/london-2009/file?path=/qcon-london-2009/slides/IvanMoore_ProgrammingInTheSmall.pdf"&gt;Programming in the Small&lt;/a&gt; [pdf]. I love it. They put little examples of code in front of folks and invite them to refactor, just a little bit. And then reflect on the refactoring. One of the things they've noticed that programers tend to do under these conditions is futz around with the code before getting down to actually improving the design.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mike and &lt;a href="http://www.m3p.co.uk/blog"&gt;Steve Freeman&lt;/a&gt; do a similar session called "Programming without Getters" This is in the so-called "dojo" format, where a revolving pair of programmers is invited to take some fairly typical "enterprise" class code and refactor it to remove the getters. There are those of us that believe that there can be &lt;a href="http://peripateticaxiom.blogspot.com/2008/06/tdd-mocks-and-design.html"&gt;something quite special&lt;/a&gt; about OO code with that property, but the session didn't really get there. That's because the pairs couldn't bring themselves to do the refactoring as asked, they couldn't even start to remove any getters, until they'd futzed around with the code first. And since a new person rolls into the pair every five minutes or so, it's pretty much a non-stop futz-fest. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.lindarising.org/"&gt;Linda Rising&lt;/a&gt; saw &lt;a href="http://www.keithbraithwaite.demon.co.uk/professional/presentations/2008/qcon/MeasureForMeasure.pdf"&gt;a talk&lt;/a&gt; I give about this &lt;a href="http://blog.objectmentor.com/articles/2009/06/08/metrics-of-moment"&gt;design metric&lt;/a&gt; that I've been &lt;a href="http://peripateticaxiom.blogspot.com/search/label/test-first%20complexity"&gt;playing with&lt;/a&gt; over the last couple of years (I have a &lt;a href="http://www.zuehlke.com/en/the-company/locations/united-kingdom/"&gt;day job&lt;/a&gt;, so progress has been slow). She was struck by my observation that folks who've tried this metric on their own code have reported that refactoring which made them happier with the code also increases the value of the metric. Linda wanted to know if they really said "happier". They really do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It turns out that Linda did some research back in the day on a design metric of her own. During this work she had noticed that in general, programers like to futz around with code before they get down to work on it. If I recall correctly, she asked &lt;a href="http://www.dreamsongs.com/"&gt;Dick Gabriel&lt;/a&gt; about this and he said that "programmers do that", along with some allusion to that metaphorical aphorism about the flavour of soup and pissing in it. I'm sure a lot of that goes on. But what Linda (again, this is as well as I recall) further noticed was that they tended to do this&lt;i&gt; much less &lt;/i&gt;with code that scored well on her metric. And they described themselves as being more &lt;i&gt;comfortable&lt;/i&gt; working on this code than on code that had a low score.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, I've nothing against metrics in principle (after all, I seem to be in the middle of inventing one) but I'm rather dubious about all this dashbordery and piechartism that's going on  these days, all this getting of the CI server to dish up trends of metrics and blah, blah, blah. It's nice to have the numbers, it's nice to see a healthy trend, but.......&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How do you &lt;i&gt;feel&lt;/i&gt; about your code? Does it make you &lt;i&gt;happy&lt;/i&gt;? Is it &lt;i&gt;comfortable&lt;/i&gt;?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3877152177530466653?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3877152177530466653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3877152177530466653&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3877152177530466653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3877152177530466653'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/06/lets-talk-about-feelings.html' title='Let&apos;s talk about feelings'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-4115294738716434813</id><published>2009-06-28T20:07:00.005+01:00</published><updated>2009-06-29T20:05:24.157+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>XP Day London 09: Call for Sessions</title><content type='html'>Submissions are now open for programmed sessions at XpDay London 2009, to be held 7th and 8th December 2009. &lt;a href="http://www.xpday.org/" style="text-decoration: none; color: rgb(145, 54, 173); "&gt;http://www.xpday.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You are invited to propose a session for the first day of the conference. We are particularly interested in the following&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Experience reports—share your stories of challenge and success with Agile and Lean techniques. Experience reports will be intensively shepherded by experienced practitioners.&lt;/li&gt;&lt;li&gt;Hands-on technical sessions—share techniques and practices in practical sessions: workshops, tutorials, simulations&lt;/li&gt;&lt;li&gt;Practitioners' advances in the art—share the techniques of expert Agile and Lean practitioners, work with them to move the craft forward.&lt;/li&gt;&lt;/ul&gt;The second day of the conference will be an OpenSpace session with topics selected at the end of the first day. Programmed sessions are most suitable for topics requiring some set up or extensive preparation.&lt;br /&gt;&lt;br /&gt;To submit a session, please go to &lt;a href="http://xpday-london.editme.com/XpDay2009Submissions"&gt;http://xpday-london.editme.com/XpDay2009Submissions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Submissions will be accepted until Friday 14th August.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-4115294738716434813?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/4115294738716434813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=4115294738716434813&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4115294738716434813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4115294738716434813'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/06/xp-day-london-08-call-for-sessions.html' title='XP Day London 09: Call for Sessions'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-430079782998857316</id><published>2009-06-08T20:48:00.003+01:00</published><updated>2009-06-08T21:02:09.158+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='models'/><title type='text'>Flow: are two dimensions enough?</title><content type='html'>Inspired by a comment by &lt;a href="http://www.metaprog.com/blogs/"&gt;Joseph&lt;/a&gt; at the recent &lt;a href="http://www.agilecoachesgathering.org/wiki/index.php/Home"&gt;Agile Coach's Gathering&lt;/a&gt; I've been experimenting with the use of &lt;a href="http://en.wikipedia.org/wiki/File:Challenge_vs_skill.jpg"&gt;this model&lt;/a&gt; in mid-year reviews for my team.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the guys observed that it seems to have a missing dimension. It seems that it's possible to have a case whereby an individual is working on a solidly challenging problem, well up the y-axis, and they have the high level of skill to meet that challenge, well along the x-axis...and when all's said and done they'd really rather be doing something a bit more enjoyable. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Missing axis: &lt;i&gt;fun&lt;/i&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-430079782998857316?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/430079782998857316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=430079782998857316&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/430079782998857316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/430079782998857316'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/06/flow-are-two-dimensions-enough.html' title='Flow: are two dimensions enough?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5007714223060812717</id><published>2009-06-07T15:27:00.005+01:00</published><updated>2009-06-07T17:35:05.172+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book review'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Bridging the Communication Gap</title><content type='html'>&lt;div&gt;Call it automated acceptance testing, functional test driven development, checked examples or what you will—the use of automatic validation is one of the most effective tools in the Agile developer's kit.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;It's a large and involved field, touching on almost every aspect of development. Handy, then, that &lt;a href="http://gojko.net/"&gt;Gojko Adzic&lt;/a&gt; has published a very comprehensive guide to the use of automated acceptance tests in contemporary Agile development practice, &lt;a href="http://www.acceptancetesting.info/the-book/"&gt;&lt;i&gt;Bridging the Communication Gap&lt;/i&gt;&lt;/a&gt;&lt;i&gt;: Specification by example and agile acceptance testing. &lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;This book is a much-needed checkpoint in the on-going adventure to discover (and re-discover) how to write software effectively. Gojko is a very energetic enthusiast for these ideas, and a very experienced practitioner of them. His knowledge and expertise is present on every page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A strong theme runs through the book—that the reason we capture examples of required behaviour and automate validation of them is to improve communication. Examples turn out to be a very powerful way to understand a problem domain and to explore a solution suitable for that domain. There turn out to be fascinating reasons for why this is true, but Gojko quite reasonably focusses on practical advice. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main body of the book tells a story, a story of understanding, finding, and using examples to create shared understanding across a team. Gojko gives very concrete advice in a series of short chapters and explains how to do this. How to organise a workshop to find examples, how to find good examples, how to use tools to automate validation, how to use the resulting tests to guide development. Each chapter ends with a handy bullet list of key points. Together with other material on the best use for developers to make of such checked examples, and how to fit example discovery and capture into a typical Agile development process &lt;i&gt;Bridging the Communication Gap&lt;/i&gt; provides as close to a &lt;i&gt;vade mecum&lt;/i&gt; for newcomers to the discipline of functional test driven development as we are likely to see.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Gojko draws informative parallels with other techniques more or less strongly aligned with the Agile development world. This places the practice of Agile acceptance testing in context, and as a team-wide activity, reinforcing the cross-functional nature of the tool. Always the emphasis is on helping the various stakeholders in a development project communicate better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a survey of tools available for this kind of work, which I might wish were slightly broader in scope and a little more detailed, but it does give a good overview of the market leaders. "Market leaders" in the weakest sense, since it turns out that the best tools for this kind of work are all FOSS: big-ticket corporate testing tools really aren't in this game.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Various points regarding writing and using tests are illustrated with (of course) illuminating examples. Also described are limitations of these techniques and some pitfalls to watch out for, something that more promoters of development techniques should provide.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is self-published and my copy was printed by Lightening Source. Books produced this way are getting better all the time, but are still not presented at the level of quality one would expect from a commercial publishing house. The pages seem very full and with the choice of font made the text a very dark colour which I don't find easy to read. The section and sub-section headings are sometimes over long and are not laid out well, a combination that I found made the book less easy to navigate than it might have been.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will be using with book with clients and recommending it to them for future reference. A boon to the community.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5007714223060812717?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5007714223060812717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5007714223060812717&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5007714223060812717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5007714223060812717'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/06/bridging-communication-gap.html' title='Bridging the Communication Gap'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5758211233957798093</id><published>2009-06-06T17:53:00.016+01:00</published><updated>2009-06-06T23:01:44.010+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='velocity'/><title type='text'>The Quality of non-declining Velocity</title><content type='html'>I'm supposing that anyone reading this blog will be familiar with the stuff-left-to-do &lt;i&gt;vs&lt;/i&gt; time chart used by many Agile teams to track the progress and (with due care an attention) predict the outcome of a development episode:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_itmSz8f6ak4/Siqj49FfmmI/AAAAAAAAAAM/nYqRwm7VzCg/s1600-h/burndown.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 201px; height: 151px;" src="http://3.bp.blogspot.com/_itmSz8f6ak4/Siqj49FfmmI/AAAAAAAAAAM/nYqRwm7VzCg/s320/burndown.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5344264106694122082" /&gt;&lt;/a&gt;In his &lt;a href="http://www.scrum-breakfast.com/2009/04/lean-agile-scrum-conference-in-zurich.html"&gt;Zurich Lean/Scrum/Agile show&lt;/a&gt; keynote &lt;a href="http://www.scrumalliance.org/profiles/7"&gt;Ken Schwaber&lt;/a&gt; presented an interesting slant on this chart (&lt;a href="http://twitter.com/RonJeffries/statuses/2058380901"&gt;apparently&lt;/a&gt; he got this from &lt;a href="http://xprogramming.com/blog"&gt;Ron Jeffries&lt;/a&gt;). The argument is that if you have poor internal quality—in particular if your "definition of done" is not strong enough and does not require you to keep your code in tip-top condition—then there will be a hidden accumulation of stuff-left-to-do. So your chart is in effect more like this:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_itmSz8f6ak4/SiqlqxkPJ9I/AAAAAAAAAAU/u469U5AgHxM/s1600-h/hidden-dip.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 254px; height: 179px;" src="http://3.bp.blogspot.com/_itmSz8f6ak4/SiqlqxkPJ9I/AAAAAAAAAAU/u469U5AgHxM/s320/hidden-dip.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5344266062106929106" /&gt;&lt;/a&gt;&lt;div&gt;This is interestingly different from the technique that some use to show scope added during an episode, with a stepped baseline. Here, additional work is accumulating, invisibly, inside your code. Work that you will have to do at some point to get a releasable increment. This has the effect of making a burn-down line more shallow than it appears, suggesting that there will be either unanticipated under-delivery of scope or (worse yet) a need to slip delivery.&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_itmSz8f6ak4/SiqmahWRd3I/AAAAAAAAAAc/Qc-C7iDostg/s1600-h/slip.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 262px; height: 212px;" src="http://4.bp.blogspot.com/_itmSz8f6ak4/SiqmahWRd3I/AAAAAAAAAAc/Qc-C7iDostg/s320/slip.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5344266882387113842" /&gt;&lt;/a&gt;If the causes of poor internal quality are not rectified, then this effect will repeat, and over successive episodes the team in question will get slower and slower (or deliver less and less)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_itmSz8f6ak4/SirBXAVliLI/AAAAAAAAAA0/uCnsKjjc2CQ/s1600-h/slope.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 264px; height: 185px;" src="http://2.bp.blogspot.com/_itmSz8f6ak4/SirBXAVliLI/AAAAAAAAAA0/uCnsKjjc2CQ/s320/slope.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5344296508800207026" /&gt;&lt;/a&gt;Talking about this with &lt;a href="http://availagility.wordpress.com/"&gt;Karl Scotland&lt;/a&gt; and &lt;a href="http://www.metaprog.com/blogs/"&gt;Joseph Pelrine&lt;/a&gt; in the bar afterwards we tossed around the idea that this shows internal quality (traditionally a hard thing to measure) to be something like the first derivative of project velocity with respect to time. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And now to stretch the metaphor to breaking point. For that to make sense quantitatively it seems as if what we're really saying is that if the internal quality &lt;i&gt;Q&lt;/i&gt; is less than some threshold &lt;i&gt;Q&lt;sub&gt;cv&lt;/sub&gt;&lt;/i&gt; (the quality of non-decreasing velocity) then the velocity &lt;i&gt;V&lt;/i&gt; will decrease over time: &lt;/div&gt;&lt;div style="text-align: center;"&gt;∂&lt;i&gt;V&lt;/i&gt;/∂&lt;i&gt;t&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;∝&lt;/span&gt;&lt;/i&gt; &lt;i&gt;Q-Q&lt;sub&gt;cv&lt;/sub&gt;&lt;/i&gt;&lt;/div&gt;Well, it seems reasonable that this will hold for low quality, when &lt;i&gt;Q - Q&lt;sub&gt;cv&lt;/sub&gt;&lt;/i&gt; is negative. But what about when &lt;i&gt;Q - Q&lt;sub&gt;cv&lt;/sub&gt;&lt;/i&gt; is positive? Is it possible to take a team that is writing code at the level of quality required for non-decreasing velocity—that is, not accumulating hidden extra work—and then &lt;i&gt;increase&lt;/i&gt; velocity by increasing quality?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think it is.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that a team can push really hard on internal quality and have it turn out that there is less work to do than they thought to get finished.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/_itmSz8f6ak4/SirDqJNx7DI/AAAAAAAAAA8/J_SaeGSGMBc/s320/sope-up.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5344299036624153650" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 253px; height: 162px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;And maybe that's obvious—and maybe it isn't—but certainly I now feel as if I have a much better handle on how to explain to someone why (as the Software Craftsmanship folks say) the only way to go fast is to go well.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5758211233957798093?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5758211233957798093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5758211233957798093&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5758211233957798093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5758211233957798093'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/06/quality-of-non-declining-velocity.html' title='The Quality of non-declining Velocity'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_itmSz8f6ak4/Siqj49FfmmI/AAAAAAAAAAM/nYqRwm7VzCg/s72-c/burndown.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2264469811357527602</id><published>2009-05-28T06:10:00.001+01:00</published><updated>2009-05-28T06:12:56.321+01:00</updated><title type='text'>The Vendor/Client Relationship in Real Life</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=R2a8TRSgzZY"&gt;What would happen&lt;/a&gt;[youtube] if clients tried to deploy the kinds of arguments they use with "professional services" suppliers in other situations...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2264469811357527602?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2264469811357527602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2264469811357527602&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2264469811357527602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2264469811357527602'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/05/vendorclient-relationship-in-real-life.html' title='The Vendor/Client Relationship in Real Life'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-9184606265171363867</id><published>2009-05-19T12:58:00.004+01:00</published><updated>2009-09-10T07:46:58.147+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='user interface'/><title type='text'>Epic user interface fail of Homeric proportions</title><content type='html'>A little while ago I was riding the now sadly degenerate &lt;a href="http://en.wikipedia.org/wiki/East_Coast_Main_Line"&gt;East Coast Main Line &lt;/a&gt;service in a &lt;a href="http://en.wikipedia.org/wiki/British_Rail_Mark_4"&gt;Mk IV&lt;/a&gt; coach and noticed a bit of a curfuffle in the vestibule (I love it that British railway carriages are still referred to as having "vestibules"). Paying attention I discovered that an elderly lady had required assistance from the train staff with the door of the toilet. This seemed a little odd, so after a suitably discreet interval I went to investigate. One has to make one's own enertainment on the train.&lt;br /&gt;&lt;br /&gt;What I found was a flabbergasting cascade of fail.&lt;br /&gt;&lt;br /&gt;This advice is welcome:&lt;br /&gt;&lt;a title="DSC00106 by Keith Braithwaite, on Flickr" href="http://www.flickr.com/photos/keithbraithwaite/3544526551/"&gt;&lt;img height="114" alt="DSC00106" src="http://farm4.static.flickr.com/3330/3544526551_376f1814d2_m.jpg" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;Judging by the design and finish, this is the original signage.&lt;br /&gt;&lt;br /&gt;But how to close and lock the door?&lt;br /&gt;&lt;a title="DSC00104 by Keith Braithwaite, on Flickr" href="http://www.flickr.com/photos/keithbraithwaite/3545334842/"&gt;&lt;img height="238" alt="DSC00104" src="http://farm3.static.flickr.com/2333/3545334842_8463ff4d75.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;Ok, slightly non-obvious. Also, lacking some rather crucial information, it will turn out.&lt;br /&gt;&lt;br /&gt;Seems as if more people than the lady I saw have had problems with the door, since there was this later, auxiliary sign:&lt;br /&gt;&lt;a title="DSC00107 by Keith Braithwaite, on Flickr" href="http://www.flickr.com/photos/keithbraithwaite/3544526749/"&gt;&lt;img height="180" alt="DSC00107" src="http://farm3.static.flickr.com/2137/3544526749_75f444a9a4_m.jpg" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;Apologies for the poor quality. The text at the bottom reads "If the 'lock' button is not illuminated, the toilet doot is &lt;strong&gt;NOT&lt;/strong&gt; locked" It might very well be &lt;em&gt;closed&lt;/em&gt;, you see, but not &lt;em&gt;locked&lt;/em&gt;. The original signage has braille attached, not so this vital little nugget of information (as I recall).&lt;br /&gt;&lt;br /&gt;It seems that not even this prompt has quite been doing the job, as this third sign had also been added:&lt;br /&gt;&lt;a title="DSC00105 by Keith Braithwaite, on Flickr" href="http://www.flickr.com/photos/keithbraithwaite/3545334968/"&gt;&lt;img height="290" alt="DSC00105" src="http://farm3.static.flickr.com/2454/3545334968_304bec6362.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;The visually impared (and those on urgent business) are now in serious trouble.&lt;br /&gt;&lt;br /&gt;Being of an equiring mind, and finding the complexity of this control system too hard to believe, I did a few experiments and made an important discovery not covered by any of the above instructions but of no little importance I think.&lt;br /&gt;&lt;br /&gt;If you press, or, let us say, accidentally nudge, the 'lock' button while the door is closed and locked the door (which is powered in the interest of the mobility impared, a good thing in itself) both &lt;em&gt;unlocks and opens&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Now, how hard could this be? What am I missing from this design?&lt;br /&gt;&lt;br /&gt;Still two buttons, their respective behaviour being:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If the door is open, close and lock it. If the door is closed and locked, no action.&lt;/li&gt;&lt;li&gt;If the door is closed and locked, open it. If the door is open, no action.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I'll be popping over to Switzerland in a couple of weeks, a place where they still take trains (and much else) seriously.  And shall on the trip from Flughafen Zurich to the Haputbahnhof be paying close attention to the toilet doors.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-9184606265171363867?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/9184606265171363867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=9184606265171363867&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9184606265171363867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9184606265171363867'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/05/epic-uer-interface-fail-of-homeric.html' title='Epic user interface fail of Homeric proportions'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3330/3544526551_376f1814d2_t.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-4312067199028188360</id><published>2009-05-08T10:16:00.002+01:00</published><updated>2009-05-08T10:24:30.089+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='second opinion'/><title type='text'>Second Opinions</title><content type='html'>Got an opinion piece up in E&amp;amp;T magazine regarding second opinions.&lt;br /&gt;&lt;br /&gt;Many thanks to all who &lt;a href="http://www.reddit.com/r/programming/comments/7yqzr/why_dont_we_see_it_consultancies_getting_second/"&gt;responded &lt;/a&gt;to my earlier &lt;a href="http://peripateticaxiom.blogspot.com/2009/02/consulting-engineers.html"&gt;posts &lt;/a&gt;and &lt;a href="http://www.linkedin.com/answers/technology/software-development/TCH_SFT/441523-2064343?browseIdx=0&amp;amp;sik=1241774570392"&gt;enquiries &lt;/a&gt;about that. I'll be posting digests of some stories soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-4312067199028188360?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/4312067199028188360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=4312067199028188360&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4312067199028188360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4312067199028188360'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/05/second-opinions.html' title='Second Opinions'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5270717966246691397</id><published>2009-04-23T08:08:00.003+01:00</published><updated>2009-04-23T08:36:34.839+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='autopoiesis'/><title type='text'>Identity as a Process</title><content type='html'>Returning to a topic I've &lt;a href="http://clublet.com/why?TempleThing"&gt;thought about&lt;/a&gt; before: identity is a problem. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I expect that most of you to be familiar with the "my grandfather's axe/&lt;a href="http://en.wikipedia.org/wiki/Ship_of_Theseus"&gt;boat&lt;/a&gt;/knife..." problem. In short, how does the identity of a composite object vary (or not) as the identities of the components vary?  One proposed solution is the so–called &lt;i&gt;perdurantist&lt;/i&gt; approach which hinges on the observation (at once both banal and deeply challenging) that what we think of as objects in the world are really structures with extent in three spacial and one temporal dimension (pace &lt;a href="http://en.wikipedia.org/wiki/Kaluza%E2%80%93Klein_theory"&gt;Kaluza-Klein&lt;/a&gt; type arguments). We don't seem to be very good at that sort of thinking. Note that perdurantism seems still to be talking about fixing the boundaries of a thing in order to identify it. I think that's missing a trick.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://vorlon.case.edu/~beer/Papers/varela.pdf"&gt;This&lt;/a&gt; [pdf] (via &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/"&gt;Michael Feathers&lt;/a&gt;) is a treatment of that trick I've not seen before. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In that paper the biological concept of &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/"&gt;autpoiesis&lt;/a&gt; (and the complex of ideas around it) is used to analyse the working of the &lt;a href="http://en.wikipedia.org/wiki/Glider_(Conway's_Life)"&gt;glider&lt;/a&gt; pattern in &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;Conway's Game of Life&lt;/a&gt;. I read the paper as telling us that identity of a glider is extent of the continuation of the &lt;i&gt;process&lt;/i&gt; which at any given time looks to us like a glider.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, how to apply this understanding elsewhere...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5270717966246691397?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5270717966246691397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5270717966246691397&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5270717966246691397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5270717966246691397'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/04/identity-as-process.html' title='Identity as a Process'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7370967944504450942</id><published>2009-04-17T16:46:00.003+01:00</published><updated>2009-04-17T17:22:49.530+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='panel'/><title type='text'>QCon Panel: A Great Leap Forward or Exposed Artery?</title><content type='html'>A &lt;a href="http://www.infoq.com/QConLondon2008"&gt;QCon &lt;/a&gt;panel disucssion re "Transparency" &lt;a href="http://www.infoq.com/news/2009/04/transparency-leap-or-exposure"&gt;is now up&lt;/a&gt;. It features &lt;a href="http://www.threeriversinstitute.org/blog/"&gt;Kent Beck&lt;/a&gt;, Chris Matts, John Nolan and myself, with &lt;a href="http://www.m3p.co.uk/blog/"&gt;Steve Freeman&lt;/a&gt; in the chair.&lt;br /&gt;&lt;br /&gt;The &lt;em&gt;Treppenwitz&lt;/em&gt; was pretty strong on this one. What I'm thinking now is that instead of all that ghastly droning on I did, I should have said &lt;a href="http://www.biblegateway.com/passage/?search=John%208:32;&amp;amp;version=9;"&gt;"the truth shall make you free" &lt;/a&gt;. The only thing to watch out for is that being free, although far superior to the alternative, might not be particularly comfortable.&lt;br /&gt;&lt;br /&gt;But it is still far superior.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7370967944504450942?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7370967944504450942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7370967944504450942&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7370967944504450942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7370967944504450942'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/04/qcon-panel-great-leap-forward-or.html' title='QCon Panel: A Great Leap Forward or Exposed Artery?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-9003237916455125997</id><published>2009-04-11T16:25:00.003+01:00</published><updated>2009-04-11T16:49:46.256+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsmanship'/><title type='text'>Software Craftsmanship 2010</title><content type='html'>Apparently &lt;a href="http://parlezuml.com/blog/?postid=797"&gt;there will be one&lt;/a&gt;. Excellent! For all my growing distaste for the This Movement and That Manifesto and what all that's springing up around the parts of the industry that I see most closely, a place that happens to be of the same name as one where people can come together and share an enjoyment of good code and coding is a fine thing.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jason says that he's "banning talks, presentations or any other kind of session that doesn't involve real live coding" I appreciate the gesture, but I'm not sure that's quite right. I found that Ade's session on &lt;a href="http://www.kerrybuckley.org/2009/03/02/software-craftsmanship-2009/"&gt;mapping personal practices&lt;/a&gt; particularly valuable—although it could have benefited from another hour or so. None–the–less a programmers' conference with programming as its core topic illustrated through programming is a too–rare thing and Jason is to be commended for making one happen. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both of the sessions that I ran there involved real coding by attnedees and even though I wasn't coding myself I learned plenty from the reactions of those who were, such as &lt;a href="http://gojko.net/2009/02/27/thought-provoking-tdd-exercise-at-the-software-craftsmanship-conference/"&gt;Gojko's&lt;/a&gt; on the TDD session. I've not come across a better forum elsewhere for that kind of discussion on that sort of scale than the SC conference, so having another one seems like a very good thing.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-9003237916455125997?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/9003237916455125997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=9003237916455125997&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9003237916455125997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/9003237916455125997'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/04/software-craftsmanship-2010.html' title='Software Craftsmanship 2010'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3514425722115090899</id><published>2009-04-08T13:19:00.005+01:00</published><updated>2009-04-08T14:15:03.815+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhetoric'/><title type='text'>Fallacy as tool</title><content type='html'>In the comments to &lt;a href="http://www.juliansanchez.com/2009/04/06/climate-change-and-argumentative-fallacies/"&gt;this post&lt;/a&gt; regarding the level of debate regarding climate change in certain circles &lt;a href="http://www.pithandsubstance.blogspot.com/"&gt;Pithlord &lt;/a&gt;has this to say:&lt;br /&gt;&lt;blockquote&gt;Most fallacies aren’t really fallacies when you reinterpret them as Bayesian reasons to give an idea more credence rather than iron-clad syllogisms. Without [...] the “ad hominem fallacy” [...] you’d give all your money to Nigerian spammers.&lt;/blockquote&gt;That's a very nice formulation of the idea that the "fallacies" of logic are amongst the tools of rehtoric. This is an notion that has fasinated me ever since I first read &lt;em&gt;Zen and the Art of Motorcyle Maintainance&lt;/em&gt;. The rhetorical apporach may not demand agreement (in the way that a sound and valid argument would) but it does tend to persuade. And the answers given by fallacious arguments are not neccessarily wrong, just uncertain.&lt;br /&gt;&lt;br /&gt;Many folks in the IT industry seem to want to bludgeon their interlocutors into agreement with something that looks a lot like a proof (mea culpa). As I get older the gentle art of persuasion seems more and more attractive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3514425722115090899?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3514425722115090899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3514425722115090899&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3514425722115090899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3514425722115090899'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/04/fallacy-as-tool.html' title='Fallacy as tool'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1767766735961400473</id><published>2009-03-29T12:27:00.005+01:00</published><updated>2009-04-13T16:01:02.260+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='teams'/><category scheme='http://www.blogger.com/atom/ns#' term='wabi-sabi'/><title type='text'>Seduced by the drama?</title><content type='html'>Have you ever watched those shows on the Discovery channel (or similar) where the huge construction project goes a bit wrong? If it were more mainstream programming the story would pretty quickly stop being about the stuff and start being about the people, but since it is intended for 14-year old boys of every age these programmes don't quite go down that route. Big yellow machines, yum! But they do always have that drama to them. Drama comes form conflict and in these shows the conflict is between what the plan says should happen and the conditions in the world. A smooth and straightforward  project would be less than gripping. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are lots of those, but they wouldn't make great television. I find that many of these shows still don't make especially great television anyway because what actually happens is that, for example, a smooth technocrat (often German, the best sort) arrives, points out a few alternatives, gets everything back on track and off we go to a successful delivery. That's how it mostly is in the grown-up world of proper stuff. Risks materialise as issues (as it is expected they will, from time to time) and are dealt with in a calm and orderly way. There's the occasional stopppage, the odd bout of overtime, the best crane driver in the world has to be lured out of retirement for this one last job or whatever it may be. But there's no food fight. Food fight? Bear with me.&lt;a href="http://www.scottberkun.com/about/"&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.scottberkun.com/about/"&gt;Scott Berkun&lt;/a&gt;  has an essay out called "&lt;a href="http://fyi.oreilly.com/2009/03/why-ugly-teams-win--scott-berk.html"&gt;Ugly Teams Win&lt;/a&gt;", a part of the forthcoming &lt;a href="http://oreilly.com/catalog/9780596518028/"&gt;&lt;i&gt;Beautiful Teams&lt;/i&gt;&lt;/a&gt;. He presents an...interesting model:&lt;blockquote&gt;[...] when things get tough, it's the ugly teams that win. People from ugly teams expect things to go wrong and show up anyway.&lt;/blockquote&gt; Well. He passes through some interesting observations about the, what shall we say? &lt;i&gt;challenging personalities&lt;/i&gt; of several stellar individuals in several fields. You might be very happy to have a Picasso in your house, but to have had Picasso himself would be a different matter. Fine. Of course, a gang of stellar performers is a very different thing from a well-performing team.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, Berkun's point is well made that the best people to have on your project for the good of the project might not appear to be the best people generally, in all sorts of ways. Building effective teams is a tricky business. He goes further, though:&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;The only use of beauty applied to teams that makes sense is the Japanese concept of &lt;i&gt;wabi-sabi&lt;/i&gt;. Roughly, &lt;i&gt;wabi-sabi&lt;/i&gt; means there is a special beauty found in things that have been used.&lt;/blockquote&gt;I'm not sure that it does, although things that have been used often end up &lt;i&gt;wabi-sabi&lt;/i&gt;. Here's &lt;a href="http://www.japaneseaesthetics.com/gpage3.html"&gt;a description of &lt;i&gt;wabi-sabi&lt;/i&gt;&lt;/a&gt; as I've come to understand it&lt;blockquote&gt;&lt;i&gt;Wabi&lt;/i&gt; refers to that which is humble, simple, normal, and healthy, while &lt;i&gt;sabi&lt;/i&gt; refers to elegant detachment and the rustic maturity that comes to something as it grows old. It is seen in the quiet loneliness of a garden in which the stones have become covered with moss or an old twig fence that seems to grow naturally from the ground. In the tearoom it is seen in the rusty tea kettle (&lt;i&gt;sabi&lt;/i&gt; literally means rusty). The total effect of &lt;i&gt;wabi&lt;/i&gt; and &lt;i&gt;sabi&lt;/i&gt; is not gloominess or shabbiness, however, but one of peace and tranquillity&lt;/blockquote&gt;In summary "&lt;i&gt;wabi-sabi&lt;/i&gt; refers to the delicate balance between the pleasure we get from things and the pleasure we get from freedom from things"&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One interesting aspect of this is that things made from natural materials (wood, stone, leather) may acquire charm with wear, but things made form synthetic materials seem not to. Objects can become &lt;i&gt;wabi-sabi&lt;/i&gt; through use, wear, or the simple passage of time and the natural processes that they take part in. Berkun wants that to apply to teams:&lt;blockquote&gt;In this sense, the ugly teams I described at the beginning of this chapter, the underdog, the misfit, represent the wabi-sabi teams&lt;/blockquote&gt; That seems like a huge leap to me, especially when we find out what he means for a team to be &lt;i&gt;used&lt;/i&gt;. Here's how he describes the early days of a project, the "Channels" functionality of IE 4:&lt;blockquote&gt;The deals we made forced legal contracts into the hands of the development team: the use of data [...] had many restrictions and we had to follow them, despite the fact that few doing the design work had seen them before they were signed. Like the day the Titanic set sail with thousands of defective rivets, our fate was sealed well before the screaming began. Despite months of work, the [...] team failed to deliver. The demos were embarrassing. The answers to basic questions were worse. &lt;/blockquote&gt;"Our fate was sealed well before the screaming began" Oooh-kay. And this is the steady-state:&lt;blockquote&gt;somewhere in our fourth reorg, under our third general manager and with our fifth project manager for Channels, the gallows humor began. It is here that the seeds of team &lt;i&gt;wabi-sabi&lt;/i&gt; are sown. Pushed so far beyond what any of us expected, our sense of humor shifted into black-death Beckett mode. It began when we were facing yet another ridiculous, idiotic, self-destructive decision where all options were comically bad. "Feel the love," someone would say.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;At least one of Berkun and I have completely and utterly failed to understand what &lt;i&gt;wabi-sabi&lt;/i&gt; means. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But that's the least of the issues I have with this. It looks to me as if this team is not being used in the way that an old shoe was used (and so gained its comfort, charm, personality and identity). This team is being &lt;i&gt;abused&lt;/i&gt;. Here's how they ended up:&lt;blockquote&gt;Late in the project, I became the sixth, and last, program manager for Channels. My job was to get something out quickly for the final beta release, and do what damage control I could before it went out the door in the final release. When we pulled it off and found a mostly positive response from the world, we had the craziest ship party I'd ever seen. It wasn't the champagne, or the venue, or even how many people showed up. It was how little of the many tables of food was eaten: in just a few minutes, most of it had been lovingly thrown at teammates and managers. &lt;/blockquote&gt; &lt;/div&gt;And there's the food-fight. Don't be distracted by the hysterical high-jinks (as bad a sign as they are). Note that they've had six programme managers by this point. The end-point of the project is described in terms of damage control. Does that sound like the &lt;i&gt;wabi-sabi&lt;/i&gt; of the moss-covered stone lantern in the quiet garden? Does it in fact sound like an in any way attractive or desirable outcome? Berkun certainly seems to want to call this a success. He says "The few who remained to work on Internet Explorer 5.0 had a special bond". No doubt they did, no doubt they did. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's where this story starts to turn my stomach a little. You see, after going through this dreadful experience "the few that remained" went on to make "Internet Explorer 5.0 [...] the best project team I'd ever work on, and one of the best software releases in Microsoft's history" Maybe so. But at what cost? The majority that didn't remain (it's hard not to imagine them being considered washouts, dropouts, failures), how did they feel about being placed in this outrageous position on IE4? And what are we to infer about teams toughing it out through pre-doomed projects?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the few cogent points to have emerged form the recent spasm of interest in so-called Software Craftsmanship is the idea that &lt;a href="http://groups.google.com/group/software_craftsmanship/msg/4105619a8c8cfa68"&gt;a "craftsman" has a line that they will not cross&lt;/a&gt;, things that they will not do. I tend to agree. I think that the industry would be in globally better shape if more people were prepared to locally say "no" to destructive madness of, well, of exactly the kind reported here for IE4 Channels. I don't consider the members of that team heroic for having made it through and bonded and all that stuff. Well, certainly not "the few". I'm inferring that some folks gave up on this project, walked away from the screaming and got on with something less harmful to themselves. Those are the folks I want to celebrate. And at every scale.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm very disturbed that a story such as this one is going to make it into a book about "beautiful teams", even if the point of it is supposed to be the subsequent success of the IE 5 team after their traumatic bonding experience. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This story celebrates failure. And it celebrates a particularly seductive kind of failure, one with which the IT industry is riddled. It celebrates a macho bullshit kind of failure that looks like success to stupid, evil people. It celebrates a kind of failure that too many programmers have come to (secretly) enjoy, and that too many businesses have come to expect that their programmers will (secretly) enjoy and therefore put up with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the grown-up world of proper stuff stupid, doomed, destructive projects &lt;i&gt;get cancelled&lt;/i&gt;. And that is a successful outcome. We should do more of that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1767766735961400473?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1767766735961400473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1767766735961400473&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1767766735961400473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1767766735961400473'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/03/seduced-by-drama.html' title='Seduced by the drama?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1690448871131332453</id><published>2009-03-28T13:03:00.004Z</published><updated>2009-03-28T13:20:10.434Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Life in APL, programming in a live environment</title><content type='html'>This &lt;a href="http://www.youtube.com/watch?v=a9xAKttWgP4"&gt;gorgeous screencast of an APL session&lt;/a&gt; shows an implementation of Conway's &lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt;Game of Life&lt;/a&gt; being derived in &lt;a href="http://en.wikipedia.org/wiki/APL_(programming_language)"&gt;APL&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a very delicious demonstration of what can be achieved in 1) a "live" computational environment (rather than a mere language 'n' platform) with 2) a language that works by evaluating expressions (rather than merely marshalling operations) and 3) already knows how to show you what complicated values look like (because it understands its work to be symbolic not operational).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ponder what the Dyalog folks (no affiliation) are showing you there, ponder just how far towards that same goal you'd get in whatever programming system you use at work in 7 minutes 47 seconds (&lt;i&gt;even if&lt;/i&gt; you'd done as much rehearsal as I'm sure they did) and then ponder the state of our industry. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then have a stiff drink.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1690448871131332453?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1690448871131332453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1690448871131332453&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1690448871131332453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1690448871131332453'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/03/life-in-apl-programming-in-live.html' title='Life in APL, programming in a live environment'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6061996830479404998</id><published>2009-03-25T15:37:00.003Z</published><updated>2009-03-25T15:39:34.333Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Agile Coaches Gathering</title><content type='html'>I'm going to the &lt;a href="http://www.agilecoachesgathering.org/wiki/index.php/Home"&gt;Agile Coaches Gathering&lt;/a&gt; at (and partly in aid of) &lt;a href="http://www.bletchleypark.org.uk/"&gt;Bletchley Park&lt;/a&gt; in May. I commend the event to you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6061996830479404998?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6061996830479404998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6061996830479404998&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6061996830479404998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6061996830479404998'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/03/agile-coaches-gathering.html' title='Agile Coaches Gathering'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3460915950018638554</id><published>2009-03-23T18:53:00.006Z</published><updated>2009-03-31T18:08:38.635+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>The Lives of Others, the Lives of Ourselves</title><content type='html'>I've kept to a rule with this blog, that the posts on it should be of broadly technical and mostly professional nature. I'm going to break that rule now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some time ago I watched the film &lt;i&gt;&lt;a href="http://www.imdb.com/title/tt0405094/"&gt;Das Leben der Anderen&lt;/a&gt;&lt;/i&gt;, a bitter-sweet offering from Florian Henckel von Donnersmarck. It's a love story, of several kinds, and a thriller and little bit of (and little bit of a response to) an &lt;a href="http://en.wikipedia.org/wiki/Ostalgie"&gt;Ostalgie&lt;/a&gt; comedy.  In one scene Hauptmann Wiesler, a &lt;a href="http://en.wikipedia.org/wiki/Stasi"&gt;Stasi&lt;/a&gt; interrogator and surveillance officer, teaches a class of prospective secret policemen. He puts great emphasis on the importance of the handling of the seat cover after an interview. This was a real thing: during interrogation a cloth would be used absorb the personal odours of the subject and then sealed in a jar. When, not if, the Stasi needed to find you the jar would be unsealed and used to give tracker dogs your scent. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I recall hearing about this in a John Peel piece many years ago. He went to interview some punks in the former DDR and they spoke of this and many other horrors of living in an authoritarian surveillance society. And this sort of thing was considered a genuine horror. A fine example of the reason why it was worth the grinding fear of the Cold War, to avoid living in that sort of society.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Between the time of watching that film and writing this piece I got into a conversation with a Daily Mail type of fellow, who was complaining that "the UK is becoming a complete police state. Like[sic], on the level of Nazi Germany". This is &lt;a href="http://en.wikipedia.org/wiki/Godwin's_law"&gt;well known&lt;/a&gt; to be a bad way to argue. My response was that it wasn't really, not even on the level of Communist Germany, go watch &lt;i&gt;Das Leben der Anderen&lt;/i&gt; to see what a real police state looked like.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today I'm thinking that I might owe that guy a  little bit of  an apology. This &lt;a href="http://www.jrrt.org.uk/uploads/Database%20State%20-%20Executive%20Summary.pdf"&gt;report&lt;/a&gt; [pdf] from the Rowntree Reform Trust makes dismaying reading:&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;A quarter of the public-sector databases reviewed are almost certainly illegal under human rights or data protection law&lt;/li&gt;&lt;li&gt;Fewer than 15% of the public databases assessed in this report are effective, proportionate and necessary, with a proper legal basis for any privacy intrusions&lt;/li&gt;&lt;li&gt;The benefits claimed for data sharing are often illusory.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;Well, joy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Top of the list of problematical databases is the National DNA Database. A little background: England and Wales (Scotland and Northern Ireland have their own arrangements) are Common Law countries and like other such used to have a distinction between summary offences, misdemeanours and felonies. We don't any more (much as we don't have Grand Juries, either) we only have summary vs indictable offences. But that only applies if you are brought to trial.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We used also to have a distinction between arrestable offences (effectively, felonies) and non-arrestable offences. Over the years so many more offences have been created that this distinction was seen as unhelpful and at first it was blurred and eventually, in the &lt;i&gt;Serious Organised Crime and Police Act 2005&lt;/i&gt;, abolished.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Under &lt;a href="http://www.opsi.gov.uk/acts/acts2005/ukpga_20050015_en_10#pt3-pb1-l1g110"&gt;section 110&lt;/a&gt; of that act a constable may arrest, without warrant, anyone he or she "has reasonable grounds for suspecting to be about to commit an offence" (any offence at all, remember, however minor) if this is "necessary". For example "to enable the name of the person in question to be ascertained" (and for various other reasons listed in the Act). What this amounts to is a summary power of arrest, of anyone, at any time. This was &lt;i&gt;spectacularly&lt;/i&gt; under-reported at the time. And here's the punchline: everyone who is arrested is obliged to give a DNA sample and that goes on the National DNA Database. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And it stays there. It stays there if you are released without charge. It stays there even if you are charged, go to trial and are acquitted. This was &lt;a href="http://cmiskp.echr.coe.int/tkp197/viewhbkm.asp?&amp;amp;action=html&amp;amp;key=74844"&gt;already known&lt;/a&gt; to be in breach of the European Convention on Human Rights. In that unanimous ruling the European Court of Human Rights made a number of interesting statements:&lt;blockquote&gt;The Court was struck by the blanket and indiscriminate nature of the power of retention in England and Wales. In particular, the data in question could be retained irrespective of the nature or gravity of the offence with which the individual was originally suspected or of the age of the suspected offender; the retention was not time-limited; and there existed only limited possibilities for an acquitted individual to have the data removed from the nationwide database or to have the materials destroyed.&lt;/blockquote&gt;And indeed &lt;a href="http://www.guardian.co.uk/commentisfree/2009/mar/19/dna-database-comment"&gt;it turns out to be non-trivial&lt;/a&gt; to get the DNA of innocent persons removed from the database.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, &lt;blockquote&gt;The Court noted that England, Wales and Northern Ireland appeared to be the only jurisdictions within the Council of Europe to allow the indefinite retention of fingerprint and DNA material of any person of any age suspected of any recordable offence.&lt;/blockquote&gt; and&lt;blockquote&gt;The Court expressed a particular concern at the risk of stigmatisation, stemming from the fact that persons in the position of the applicants, who had not been convicted of any offence and were entitled to the presumption of innocence, were treated in the same way as convicted persons.&lt;/blockquote&gt;So we are, here in the UK, faced with a police system that in this regard at least makes no distinction between the innocent and the guilty. And on a grand scale. The &lt;a href="http://www.jrrt.org.uk/uploads/Database%20State.pdf"&gt;full version&lt;/a&gt;[pdf] of the RRT report states that &lt;blockquote&gt;Over half a million innocent people (people not convicted, reprimanded, given a final warning or cautioned, and with no proceedings pending against them) – including over 39,000 children – are now on the database&lt;/blockquote&gt;and to no good effect &lt;blockquote&gt;doubling the number of people on the database from about 2m to about 4m has not increased the proportion of crimes solved using DNA, which remains steady at about 1 in 300. Indeed, in 2007 the number actually fell slightly&lt;/blockquote&gt;&lt;/div&gt;I'm no longer sure that I know how this is much different from the Stasi bottling seat covers.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Except maybe that we do still have a chance to do something about it. A shame that we must appeal to the European institutions for protection from our own executive. Time to join &lt;a href="http://www.liberty-human-rights.org.uk/"&gt;Liberty&lt;/a&gt;. Hope I'm not too late.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3460915950018638554?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3460915950018638554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3460915950018638554&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3460915950018638554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3460915950018638554'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/03/lives-of-others-lives-of-ourselves.html' title='The Lives of Others, the Lives of Ourselves'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2916060770289073681</id><published>2009-03-19T20:34:00.004Z</published><updated>2009-03-20T07:42:49.046Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><title type='text'>Slipping through our fingers?</title><content type='html'>It was close. So close. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's the really exiting thing about the Agile development movement? Is it getting to ship working software? That's pretty good. Is it not having to lie about status all the time? That's great too! Is it being able (and allowed, and required) to take true responsibility for our work? Wonderful stuff! But I don't think these are the best part.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that the best part is that we were starting to normalise the idea that programmers are valuable knowledge workers who collaborate with other valuable workers in the business as peers. Big chunks of the industry had to (re)learn how to do all that shipping and telling the truth and stuff in order to get to that point, but that's only the means. The end is to be dealt with by our paymasters as if we make a genuine contribution to our businesses. And even that is only a starting point for the &lt;i&gt;really&lt;/i&gt; interesting stuff.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And now along come folks shouting about Lean. A lot of them are Agile folks looking (quite properly) for what to do next that's better. And the message seems to be: programmers are operators of a technical workflow, and nothing else. They pull to-do items from a queue (which someone else manages) and work them through various states of a purely technical nature until they can be handed off into production (where someone else creates value using them). Again and again and again forever. And it is claimed that if they are organised this way then they will be more efficient and shipping those to-do items than if organzied in other ways. This is almost certainly true.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In which case it is going to be hard to avoid being shoe-horned into that mode once the development managers wake up to it. Back down into the engine room. Back to being, rather more literally than before, a cog in a machine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Agile approach to developing software (or, something a lot like it) is gaining more and more interest because, along with the stuff about getting to look up at the stars it is actually a more productive way to develop than a lot of the incumbent approaches. If Lean is more productive again but doesn't even have that social stuff as a hidden agenda, I'm not sure that we as inhabitants of this corner of the industry will turn out to have done ourselves much of a favour.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2916060770289073681?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2916060770289073681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2916060770289073681&amp;isPopup=true' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2916060770289073681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2916060770289073681'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/03/slipping-through-our-fingers.html' title='Slipping through our fingers?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7828602782527612174</id><published>2009-02-25T12:07:00.003Z</published><updated>2009-02-25T12:15:34.247Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='social networking'/><title type='text'>Fauxtrovert</title><content type='html'>It took me a long time to overcome my distaste of blogs. I'm still not a huge fan but writing &lt;span class="Apple-style-span" style="font-style: italic;"&gt;peripatetic axiom&lt;/span&gt; does seem to be better than useless. After a certain amount of prodding I've started to dabble with &lt;a href="http://twitter.com/keithb_b"&gt;twitter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm not finding it easy. One problem is that a lot of the time I'm doing things that I'm not supposed to tell anyone else about (because they are commercially sensitive) and a lot of the rest of the time I'm doing things that I just can't believe anyone would be interested to know about. That second part would seem to be a part of the introvert type.&lt;br /&gt;&lt;br /&gt;As with blogs in the early days ("I like beer", "isn't my cat cute" etc.) the art of twittering all the miscellaneous stuff of ones' life seem fairly pointless in a way I've found difficult to explain. But now redditor &lt;a href="http://www.reddit.com/user/shenpen/"&gt;shenpen&lt;/a&gt; has expressed it very well for me. The twitter stance would appear often to be not introversion, and not extroversion, but &lt;a href="http://www.reddit.com/r/technology/comments/80538/twitter_facebook_etc_are_all_about_being"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;fauxtroversion&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7828602782527612174?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7828602782527612174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7828602782527612174&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7828602782527612174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7828602782527612174'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/02/fauxtrovert.html' title='Fauxtrovert'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7361346654105020251</id><published>2009-02-23T23:01:00.007Z</published><updated>2009-02-24T07:13:41.393Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><title type='text'>Lumpy Kanban</title><content type='html'>The coalescing of bits and bobs in &lt;a href="http://finance.groups.yahoo.com/group/kanbandev/message/1934"&gt;this&lt;/a&gt; posting to the kanbandev Y! group have brought me to a realisation of why Kanban-for-software seems to make me cringe so much. &lt;del&gt;I thought that I'd replied in the group, but apparently not, so I'll do it here.&lt;/del&gt; &lt;ins&gt;Reply now &lt;a href="http://finance.groups.yahoo.com/group/kanbandev/message/1947"&gt;here&lt;/a&gt;&lt;/ins&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Versus what I'm used to seeing (expect to see, want to see) in an Agile development organisation the Kanban that I've seen explained in numerous posts, conference sessions and so forth has far too large a batch size. There's far too much work in progress. The flow of value is far too uneven. I mean, really, the Kanbanista's want us to organise our work around something as big and lumpy and lengthy as &lt;span class="Apple-style-span" style="font-style: italic;"&gt;an entire feature!?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7361346654105020251?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7361346654105020251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7361346654105020251&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7361346654105020251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7361346654105020251'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/02/lumpy-kanban.html' title='Lumpy Kanban'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6114041970792224686</id><published>2009-02-16T06:26:00.005Z</published><updated>2009-02-21T07:36:32.670Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsmanship'/><title type='text'>Consulting Engineers</title><content type='html'>For the last couple of years I've lived at the bottom of Syndenham Hill (on the Kent side). At the top is the place to where the &lt;a href="http://en.wikipedia.org/wiki/The_Crystal_Palace"&gt;Crystal Palace&lt;/a&gt; was moved after the Great Exhibition. The Palace and the park built around it had many water features and for this and other reasons water towers were erected to give sufficient head of pressure, something otherwise hard to achieve at the top of the biggest hill for miles around. Big park, lots of features, huge towers. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The engineer who built these towers proved to be mentally unsound and the towers structurally unsound, so &lt;a href="http://en.wikipedia.org/wiki/Isambard_Kingdom_Brunel"&gt;Brunel&lt;/a&gt; was brought in to rebuild them (which might happen &lt;a href="http://www.guardian.co.uk/society/2007/apr/29/communities.artnews"&gt;again&lt;/a&gt;). The story goes that he was at first most reluctant to pass judgement on the work of another engineer, however bonkers. Gentlemen didn't do that to one another. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was in 1855, when engineering as a profession was young and about twenty years before the &lt;a href="http://en.wikipedia.org/wiki/Tay_Bridge_disaster"&gt;Tay Bridge disaster&lt;/a&gt; firmly fixed in people's heads the idea that &lt;span class="Apple-style-span" style="font-style: italic;"&gt;one engineer won't do&lt;/span&gt;. Much as even accountancy firms themselves have to get an accountant in to audit their books, on a big enough job engineering firms get one another in to check they've got their sums right. This the work of Consulting Engineers. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the IT world we bandy the word "consultant" around with a certain amount of levity. In the US a consultant doesn't really seem much different from what in the UK we call a contractor: in everything but name a temporary employee. In the UK there is a slight difference, which a contractor once expressed to me (a consultant) in this way: contractors don't have to write reports.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More generally contractors build the system they way they are told to, consultants have an opinion about how the system should be built. This distinction is not lost on the tax authorities.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, what with all this talk of "&lt;a href="http://parlezuml.com/softwarecraftsmanship/"&gt;craftsmanship&lt;/a&gt;" there's been about the place recently thoughts naturally &lt;a href="http://www.m3p.co.uk/blog/2009/02/15/were-not-craftspeople-yet/"&gt;turns towards the more mature disciplines&lt;/a&gt;. A significant aspect of those, in many cases, is that it's awfully hard to get certified to practice. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's in part so that individuals can bear some liability if the job goes tits-up because the certifying bodies certainly will. This is as imperfect as any human institution, but at least they try. Another aspect of this is genuine &lt;span class="Apple-style-span" style="font-style: italic;"&gt;consultancy&lt;/span&gt;. If you, you personally, are going to bear liability for it all going pear-shaped then maybe you sould spread some of the &lt;strike&gt;blame&lt;/strike&gt; load by getting someone else in. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notice that in the medical field, if you aren't sure of a diagnosis then you can ask for a second opinion. If your doctor isn't sure, they'll go and get one by themselves.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This seems not to happen much in the IT field. Perhaps another symptom of our immaturity? When was the last time you worked on a project where the prime contractor brought in a competitor to check that they'd "got their sums right"?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have we had our Tay Bridge yet? Maybe. In some domains, avionics, for instance, you do hear of multiple independent implementations. That's not quite what I mean, though. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why don't IT companies running projects (of a certain size or complexity) routinely get the competition in to express an opinion? Why don't clients demand this as part of their risk mitigation strategy? What is it going to take for folks to bring a genuinely professional standard of conduct to IT?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Update:&lt;/span&gt; it's two days later and no-one has thrown down the gauntlet. I was expecting some bright individual to come back at me with a "you work for a consultancy, so &lt;span class="Apple-style-span" style="font-style: italic;"&gt;you&lt;/span&gt; tell &lt;span class="Apple-style-span" style="font-style: italic;"&gt;us&lt;/span&gt; why this doesn't happen" But no-one seems to be biting....&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6114041970792224686?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6114041970792224686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6114041970792224686&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6114041970792224686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6114041970792224686'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/02/consulting-engineers.html' title='Consulting Engineers'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6017835272036274395</id><published>2009-02-14T19:01:00.009Z</published><updated>2009-02-15T09:19:09.538Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><title type='text'>The Rush to Lean Makes Me Nervous</title><content type='html'>And I'm &lt;a href="http://www.infoq.com/articles/backlog-not-waste"&gt;not the only one&lt;/a&gt;.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, I am not an expert on manufacturing, but I have seen some. Software development is not manufacturing. I don't think that it's even very much &lt;span class="Apple-style-span" style="font-style: italic;"&gt;like&lt;/span&gt; manufacturing. Manufacturing is about achieving uniformity across huge numbers of multiples and making some trade-off between the highest and the most economic rate of production of those multiples. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Software development is about making &lt;span class="Apple-style-span" style="font-style: italic;"&gt;one&lt;/span&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe that software development is more like product development than manufacturing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not an expert in product development either, but I work for a company that, amongst other things, does develop products. Product development is very different from manufacturing (which we don't do), although the two are very closely related. A big part of product development is to arrive at a design that can be effectively manufactured. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately a lot of our clients don't want you to know that we designed their products, so I can't brag too much. Which is a shame as a lot of them are &lt;span class="Apple-style-span" style="font-style: italic;"&gt;waaaay&lt;/span&gt; cool. However, &lt;a href="http://www.zuehlke.com/uploads/tx_zepublications/pn_384_e_milkshaker_web.pdf"&gt;this flier[pdf]&lt;/a&gt; is public and describes one episode of product development. The flier mentions PEP, our process for developing products. As a deliberate policy we try to keep the processes that we use to develop products and the processes we use to execute software development projects as closely aligned as possible. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both are iterative. Both involve exploration. Both are adapted to circumstances while maintaining certain principles (such as actively managing risk). Both have delivered a very high success rate over many, many engagements. So I feel on fairly firm ground in claiming this similarity between software development and product development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As &lt;a href="http://www.m3p.co.uk/blog/2009/02/14/lean-and-agile-should-cousins-marry/"&gt;Steve Freeman points ou&lt;/a&gt;t, by a strict Lean interpretation of the manufacturing school product development looks wasteful. And it is. And that's OK because it &lt;span class="Apple-style-span" style="font-style: italic;"&gt;isn't&lt;/span&gt; manufacturing. The economics and the goals are different.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Its worth noting that the highly-publicised Lean successes seem to be concerned largely with &lt;span class="Apple-style-span" style="font-style: italic;"&gt;operational&lt;/span&gt; activities: never-ending, on-going care and feeding of an existing system. To the extent that your activities are like that, a more Lean approach is likely to work well for you, I think. I've yet to hear of a success story of strict Lean (no iterations, no retrospectives, all the rest of it) run in a project setting to produce a new product. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't say it can't be done, but I've not heard of it. If you have, I'd love to.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6017835272036274395?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6017835272036274395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6017835272036274395&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6017835272036274395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6017835272036274395'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/02/rush-to-lean-makes-me-nervous.html' title='The Rush to Lean Makes Me Nervous'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7796519329074688993</id><published>2009-02-01T21:10:00.005Z</published><updated>2010-06-20T08:11:13.790+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='book review'/><title type='text'>Let over Lambda</title><content type='html'>&lt;a href="http://letoverlambda.com/"&gt;Let over Lambda&lt;/a&gt; is a new self–published book on lisp by &lt;a href="http://www.hcsw.org/"&gt;Doug Hoyte&lt;/a&gt;. I'm not quite sure what to make of it, overall.&lt;br /&gt;&lt;br /&gt;It's great to see a book full of straight-ahead programming these days rather than mere system composition. It's especially great to see an extended work dealing with programming in the small. It's great fun to see someone who really likes programming as an activity in its own right exhibit their enjoyment. It's a great pleasure to see assembly language appear in a programming book of the 21st century. I find the curious combination of lisp being at once both a very high level language suited to symbolic programming and being very close to the metal most stimulating. That's a pair of properties that the programming language design mainstream seems to have abandoned. Java, for instance, doesn't feel particularly close even to the JVM.&lt;br /&gt;&lt;br /&gt;It's especially great to see a lisp afficionado standing up for vi.&lt;br /&gt;&lt;br /&gt;Assembler arises in a couple of spots where the impact of macros, the parsimony of lisp's internal representations and the intelligence of the lisp compiler combine to collapse quite sophisticated source code down to startlingly few opcodes. Which is all very fascinating. So much so that I was inspired to resurrect the &lt;a href="http://www.sbcl.org/"&gt;SBCL&lt;/a&gt; installation on my Mac and go refresh my memory of how cute the disassemble function is. However, it feels to me as if an opportunity has been lost to take that just a bit further and come up with some &lt;a href="http://bookshelved.org/cgi-bin/wiki.pl?ProgrammingPearls"&gt;&lt;span style="font-style: italic;"&gt;Programming Perls&lt;/span&gt;&lt;/a&gt;–like startling observations about performance.&lt;br /&gt;&lt;br /&gt;The book builds up to a very interesting exercise in implementing Forth. It's very nicely done and a great illustration of how easy it is to implement one interesting language given another. Lisp/Prolog used to be the canonical pair, I think. This illustration makes a good case for lisp/forth being roughly as illuminating.&lt;br /&gt;&lt;br /&gt;Along the way there are several not–quite–consistant claims about what the book is for and the big build up to the alleged principle of “duality of syntax” is a very long run for a very short slide. Again, it feels as if an opportunity to do somehting really startling has been lost. There's a sort of plonking “here it is” presentation of this and other material. It's often good and interesting material, but needs a little bit more development in places.&lt;br /&gt;&lt;br /&gt;It's perhaps not so great to have the, what shall I call it? &lt;span style="font-style: italic;"&gt;unfettered enthusiasm&lt;/span&gt; of the author for lisp, macros and all that they imply coming at you un–moderated. I don't think that a commercial editor would have allowed quite so much polemic to make it onto the page. There's a bit too much direct quotation of Paul Graham material (“Blub”, “secret weapon”, you know the sort of &lt;a href="http://www.paulgraham.com/avg.html"&gt;stuff&lt;/a&gt;) that makes it quite clear that there are on the one hand people who get it, and on the other dullards. This is made very explicit on the back cover blurb:&lt;blockquote&gt;Only the top percentile of programmers use lisp and if you can understand this book you are in the top percentile of lisp programmers.&lt;/blockquote&gt;Hmm. I have a strong feeling that I understand most of what's in the book and also that I'm not in the top of the top. Whatever that means. I'm not even a “lisp programmer” in any very serious sense of the term. Faced with a little light programming to do then in the absence of any other constraints I'm likely to reach for Scheme—and that brings me to another item that a commercial editor probably wouldn't have let through.&lt;br /&gt;&lt;br /&gt;You might imagine that the &lt;a href="http://www.dreamsongs.com/Separation.html"&gt;differing trade–offs made in Scheme and Common Lisp&lt;/a&gt; are something that reasonable people could agree to disagree about. Hoyte wants his reader to understand very clearly that this is not so: the choices made in Scheme are &lt;span style="font-style: italic;"&gt;wrong&lt;/span&gt; (emphasis in the original) and those made in CL are &lt;span style="font-style: italic;"&gt;right&lt;/span&gt; (emphasis also in the original). The first one of these assertions was amusing enough. The second, not so much. And they just keep on coming. Hoyte is far too young to be settling scores from some &lt;a href="http://www.nhplace.com/kent/CL/x3j13-86-020.html"&gt;X3J13&lt;/a&gt; puch–up, wich would be embarrasing enough, so it all ends up looking a bit adolescent to me.&lt;br /&gt;&lt;br /&gt;One last thing...at least in the print–on–demand form I've got from Lightning Source UK the book looks absolutely ghastly. “Made with lisp” says the front matter. Lisp with a lot of help from TeX and that's really not good enough for 2009, not without a lot more tuning than has gone into this. And Lightning Source (or whomever did the camera-ready copy) have originated the work at too low a resolution. That and the lazy choice of &lt;a href="http://en.wikipedia.org/wiki/Computer_Modern"&gt;CMR&lt;/a&gt; combined with the glossy toner makes the actual print a less than comfortable read. Self–publishig has a long way to go yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7796519329074688993?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7796519329074688993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7796519329074688993&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7796519329074688993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7796519329074688993'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/02/let-over-lambda.html' title='Let over Lambda'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6248700218522084710</id><published>2009-01-31T17:53:00.006Z</published><updated>2009-01-31T22:44:27.365Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><title type='text'>Genius at work</title><content type='html'>Over the years there has been a lot of propaganda claiming that Google both creates the only working environment in which double-super-genius types can function at peak effectiveness and then goes out of its way to hire only double-super-geniuses to work in it. How, then, does &lt;a href="http://googleblog.blogspot.com/2009/01/this-site-may-harm-your-computer-on.html"&gt;this&lt;/a&gt; happen:&lt;blockquote&gt;We periodically receive updates to that list [of malevolent sites] and received one such update to release on the site this morning. Unfortunately (and here's the human error), the URL of '/' was mistakenly checked in as a value to the file and '/' expands to all URLs. &lt;/blockquote&gt;This sort of thing happens because of &lt;span class="Apple-style-span" style="font-style: italic;"&gt;bad processes&lt;/span&gt;. It doesn't matter how smart folks are, if they work in a bad way, poor results will ensue.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, I don't know exactly what occurred, but I'll bet you a pound that one lone double-super-genius is left to make changes to this file by themselves. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Update: Jonathan Wolter &lt;a href="http://jawspeak.com/2009/01/31/one-unit-test-should-have-prevented-google-from-categorizing-the-entire-internet-as-malware/"&gt;raises some questions&lt;/a&gt; about testing such changes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6248700218522084710?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6248700218522084710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6248700218522084710&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6248700218522084710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6248700218522084710'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/genius-at-work.html' title='Genius at work'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5022460785874140051</id><published>2009-01-27T08:54:00.003Z</published><updated>2009-01-27T08:58:41.029Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='self'/><title type='text'>Self: the movie</title><content type='html'>My recent posting on Self provoked some interest on reddit and one keen redditor found the old &lt;a href="http://www.smalltalk.org.br/movies/"&gt;Self movie&lt;/a&gt;. I first learned about Self when one of the giant pulsing brains from Manchester university came down to a BCS meeting in London (When did the BCS stop doing things that interesting? Why?) and showed us this movie. Great days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5022460785874140051?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5022460785874140051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5022460785874140051&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5022460785874140051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5022460785874140051'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/self-movie.html' title='Self: the movie'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3856637763656658097</id><published>2009-01-26T12:38:00.003Z</published><updated>2009-01-26T13:44:11.315Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='correctness'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='type systems'/><title type='text'>Dynamic vs static: once more with feeling</title><content type='html'>In what feels to me like a voyage through a time-warp to the beginnings of my programming career in the mid–90's, Jason Gorman has &lt;a href="http://parlezuml.com/blog/?postid=766"&gt;revived&lt;/a&gt; the old static vs dynamic typing debate. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, how it all comes flooding back: "strong[sic] typing is for &lt;a href="http://weblog.raganwald.com/2006/03/ill-take-static-typing-for-800-alex.html"&gt;weak minds&lt;/a&gt;", "static type systems catch the kind of bug that managers understand" &lt;span class="Apple-style-span" style="font-style: italic;"&gt;etc. etc. etc.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jason's concerns seem to have been raised by someting to do with &lt;a href="http://blogs.msdn.com/wesdyer/archive/2006/12/20/types-of-confusion.aspx"&gt;this&lt;/a&gt; sort of thing (see the part on the &lt;code&gt;var&lt;/code&gt; keyword) although he seems to muddle up a language&lt;span class="Apple-style-span" style="font-style: italic;"&gt; having a dynamic type system&lt;/span&gt; with it &lt;span class="Apple-style-span" style="font-style: italic;"&gt;being dynamic.&lt;/span&gt; These aspects are closely related, but are not quite the same (as that post explains reasonably well). It's picking nits of this variety that keeps us all in work. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, I very much agree with Jason that this resurgence of interest in dynamicish, scripty lanaguages is driven largely by fashion, and that claims made about it should be closely examined. I'm not so sure about the rest of his argument. Not least because I'm not sure that what he complains about: &lt;blockquote&gt;Proponents of such languages cite the relative flexibility of dynamic typing compared to statically-typed languages like Java and C++. Type safety, they argue, can be achieved through unit testing.&lt;/blockquote&gt;is actually being said by anyone. Type safety through unit testing? Really? Maybe someone is, and I haven't seen it. I'd be interested to if anyone has a link.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Personally, I do tend towards dynamic languages and away form manifest static type systems. My preference away from manifest static typing is that (in the words of, IIRC Kent Back) they make me say things that I don't know are true. On the other hand I've been dabbling a bit with Haskell, which has a very strong, &lt;a href="http://perl.plover.com/yak/typing/samples/slide027.html"&gt;very expressive&lt;/a&gt; static type system and offers the promise (through type inferencing) to not require all those pesky declarations. That has been both educational and fun. Unfortunately, &lt;a href="http://peripateticaxiom.blogspot.com/2008/04/why-you-arent-donald-knuth.html?showComment=1210069800000#c2349472645385867945"&gt;as Nat pointed out in another context&lt;/a&gt;, that lovely promise might not be delivered upon:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;[in Haskell] If you don't write explicit type constraints you can end up with a type inference error somewhere in your code. Where? The only way to find out is to incrementally add explicit type constraints (using binary chop, for example) to narrow down where the error is. It's not much different, and no easier, than using printf for debugging C code. &lt;br /&gt;&lt;/blockquote&gt;If this is the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;best case&lt;/span&gt; of static typing, then we have a problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meanwhile, let's consider the distinction between systems programming and application programming. Try googling around the various attempts to nail down that distinction. I don't find any of them terribly satisfactory. For me, the crucial distinction is that the system programmer must allow for any possibly use of their code, whereas an application programmer does not.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This means that in systems land a function declared like &lt;code&gt;f :: int -&gt; int&lt;/code&gt; must, unles very carefully specified otherwise, be known to do the right thing at every element of the whole of the cartesian product of the &lt;code&gt;int&lt;/code&gt; type with itself. But in application land we might, for example, know that those ints are really the numbers of the days in the week, so we only really need the function to do the right thing over {0,1,2,3,4,5,6}² Demonstrating those two different kinds of correctness require different techniques, I think.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, using &lt;code&gt;int&lt;/code&gt; when you mean {0,1,2,3,4,5,6} is a smell. And &lt;a href="http://ivan.truemesh.com/archives/000733.html"&gt;here&lt;/a&gt; is the deodorant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I want to join these two things up. I want to make a connection between the kind of correctness that systems code needs to have and the way that static typing is might help us with that versus the kind of correctness that application code needs to have and the way that unit testing might help us with that. But I'm not there yet. Watch this space.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3856637763656658097?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3856637763656658097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3856637763656658097&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3856637763656658097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3856637763656658097'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/dynamic-vs-static-once-more-with.html' title='Dynamic vs static: once more with feeling'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5820078060078351769</id><published>2009-01-26T08:56:00.008Z</published><updated>2009-02-03T07:19:07.770Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='self'/><category scheme='http://www.blogger.com/atom/ns#' term='Smalltalk'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Self</title><content type='html'>So, Self continues to be developed and has a very nice new site, &lt;a href="http://selflanguage.org/"&gt;here&lt;/a&gt;. Self is like &lt;a href="http://www.smalltalk.org/main/"&gt;Smalltalk&lt;/a&gt; "only more so". &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These days Self runs like a dream (and blindingly &lt;a href="http://lambda-the-ultimate.org/node/1185#comment-12833"&gt;fast&lt;/a&gt;) on the Mac. Back in the day Self would only run on Sparc hardware, so I bought a Sun workstation for the express purpose of being able to play with Self. A wise investment. If &lt;a href="http://billkerr2.blogspot.com/2006/12/point-of-view-is-worth-80-iq-points.html"&gt;a point of view is worth 80 IQ points&lt;/a&gt; then learning Self is a much better bet than all that brain training and smart drinks. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I you want to understand to powerful (and fun and (partly, therefore) enticing) a system can be if you &lt;a href="http://www.nakedobjects.org/home/no_for_java_intro.shtml"&gt;trust your users to manipulate objects directly&lt;/a&gt;, take a look at Self. If you want to understand just how far the notion of Integrating and Development Environment can be pushed (and how much fun &lt;span class="Apple-style-span" style="font-style: italic;"&gt;that&lt;/span&gt; turns out to be) take a look at Self. If you want to understand why some folks consider Javascript to be such &lt;a href="http://peter.michaux.ca/articles/transitioning-from-java-classes-to-javascript-prototypes"&gt;a huge missed opportunity&lt;/a&gt;, take a look at Self.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5820078060078351769?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5820078060078351769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5820078060078351769&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5820078060078351769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5820078060078351769'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/self.html' title='Self'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3273525918944535484</id><published>2009-01-14T21:27:00.002Z</published><updated>2009-01-14T22:07:58.905Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtc'/><category scheme='http://www.blogger.com/atom/ns#' term='solutions focus'/><title type='text'>If you aren't part of the solution...</title><content type='html'>At XtC the other night &lt;a href="http://www.sfwork.com/jsp/index.jsp"&gt;Mark McKergow&lt;/a&gt; presented the Solutions Focus approach to...stuff. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Solution" here seems to mean those actions observed to take you in the direction of a more pleasing state of the world and is contrasted with the more traditional "problem" which would be the reasons for the mis–match between what you have now and what you want. The suggestion is to focus on the former and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;overlook&lt;/span&gt; the latter. While we could identify some pretty nasty failure modes for this approach it also has a lot going for it. In particular, this line of thinking reenforces the too–little practised technique of recording &lt;span class="Apple-style-span" style="font-style: italic;"&gt;what went well&lt;/span&gt; during your retrospectives and taking an action to &lt;span class="Apple-style-span" style="font-style: italic;"&gt;do more of that&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meanwhile two items from the discussion caught my attention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://entertainment.howstuffworks.com/gary-player-golfer.htm"&gt;Gary Player&lt;/a&gt; said (as reported by &lt;a href="http://www.agilemanagement.net/Articles/Weblog/blog.html"&gt;David Anderson&lt;/a&gt;) that when a good player makes a great stroke he swings again to fix the memory of what the good stroke felt like, whereas a poor player swings again after a bad stroke to try to identify what went wrong. Given what the &lt;a href="http://entertainment.howstuffworks.com/gary-player-golfer.htm"&gt;learning curve&lt;/a&gt; tells us about repetition and consistency this suddenly made Solutions Focus make a lot more sense to me. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was observed that a lot of the examples given of the effectiveness of Solutions Focus were concerned with its application to psychotherapy. Asked why this should be Mark opined that therapy is easier than management consulting. Nice.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3273525918944535484?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3273525918944535484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3273525918944535484&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3273525918944535484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3273525918944535484'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/if-you-arent-part-of-solution.html' title='If you aren&apos;t part of the solution...'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6410964169715667473</id><published>2009-01-14T21:11:00.004Z</published><updated>2009-01-14T21:25:04.633Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='examples'/><title type='text'>Examples, Exemplars, Gauges, Tests</title><content type='html'>At &lt;a href="http://www.xpday.org/"&gt;XpDay&lt;/a&gt; London 2008 I gave a lightening talk that turned into an open space session about examples an why they work so well. Some folks asked for some more information and some is available in &lt;a href="http://www.keithbraithwaite.demon.co.uk/professional/presentations/2008/Agile/backing_the_truth_into_a_corner.pdf"&gt;this presentation&lt;/a&gt; [pdf] from &lt;a href="http://www.agile2008.org/"&gt;Agile 2008, &lt;/a&gt;and also &lt;a href="http://peripateticaxiom.blogspot.com/2007/10/exemplary-thoughts.html"&gt;this&lt;/a&gt; old post.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are some gaps in the presentation where we did exercises. The first is to ask &lt;span class="Apple-style-span" style="font-style: italic;"&gt;why&lt;/span&gt; Jaffa Cakes are cakes and not biscuits. The others encouraged attendees to explore firstly some of the limitations of definitions and then some of the power of examples.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(And sorry it took me so long to get around to posting this)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6410964169715667473?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6410964169715667473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6410964169715667473&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6410964169715667473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6410964169715667473'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/examples-exemplars-gauges-tests.html' title='Examples, Exemplars, Gauges, Tests'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7387893160951205896</id><published>2009-01-10T09:25:00.007Z</published><updated>2009-01-12T08:45:15.037Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>An unreasonably high bar?</title><content type='html'>Some time ago &lt;a href="http://adam.goucher.ca/"&gt;Adam Goucher&lt;/a&gt; posted &lt;a href="http://adam.goucher.ca/?p=478"&gt;this response&lt;/a&gt; to my &lt;a href="http://www.ddj.com/blog/debugblog/archives/2008/09/five_questions_65.html"&gt;5 questions interview&lt;/a&gt; with &lt;a href="http://www.thebraidytester.com/"&gt;Michael Hunter&lt;/a&gt;. There's a few points in there that I want to come back to, but right now the one that's at the front of my mind is this:&lt;blockquote&gt;Count tests to get a useless number; I can write a million tests that provide useless information but still shows 7 figures in the count.&lt;/blockquote&gt;Well yes, you &lt;span class="Apple-style-span" style="font-style: italic;"&gt;could&lt;/span&gt;. But why would you? We seem to have a hankering in the industry for techniques that would give good results even when badly applied by malicious idiots. That seems unreasonable. And also pointless: I don't believe that the industry is populated by malicious idiots. On the other hand, the kind of answer one gets depends a lot on how a question is asked. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is (I read somewhere recently) a principle in economics that one cannot use one number as both a measure of and a target for the same thing and expect anything sensible to happen. [Allan tells me that this is &lt;a href="http://en.wikipedia.org/wiki/Goodharts_law"&gt;Goodhart's Law&lt;/a&gt; --kb] In our world this is the route to the gaming of metrics. I also don't believe that gaming works by folks consciously sitting down and conspiring to fabricate results. I do believe that if we measure, say, test coverage at every check-in &lt;span class="Apple-style-span" style="font-style: italic; "&gt;and&lt;/span&gt; publish it on our whizzy CI server dashboard thingy &lt;span class="Apple-style-span" style="font-style: italic; "&gt;and&lt;/span&gt; have a trend line of coverage over time &lt;span class="Apple-style-span" style="font-style: italic; "&gt;and&lt;/span&gt; we talk a lot about higher coverage being better, or even that test coverage has something to do with "quality" [that would be the "surrogate measure" part of Goodhart's Law --kb] then it is in fact the response of a &lt;span class="Apple-style-span" style="font-style: italic;"&gt;smart and well intentioned&lt;/span&gt; team member to write more tests to get the number up. Even if those tests turn out not to be much use for anything else.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think (certainly I hope so) that my recommendation to measure scope by counting tests doesn't fall into that trap. Don't write the tests &lt;span class="Apple-style-span" style="font-style: italic;"&gt;so that&lt;/span&gt; you can measure scope. But observe that you &lt;span class="Apple-style-span" style="font-style: italic;"&gt;can&lt;/span&gt; if you write the tests the right way. Of which I shall have a bit more to say later.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7387893160951205896?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7387893160951205896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7387893160951205896&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7387893160951205896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7387893160951205896'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/unreasonably-high-bar.html' title='An unreasonably high bar?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7921471937499333383</id><published>2009-01-08T08:22:00.003Z</published><updated>2009-01-08T08:28:56.828Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Soft-Craft</title><content type='html'>So, on Tuesday night the programme for &lt;a href="http://parlezuml.com/softwarecraftsmanship/"&gt;Software Craftsmanship&lt;/a&gt; was worked out. Looks pretty good, I think: there's plenty of the doing sessions that Jason wanted with a reasonable counterbalance of more reflective activities.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was quite amused by the metaphor collision that's taking place, though. It seems that some people find that the best way to move forward the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;craft&lt;/span&gt; of software development is to head down the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;dojo&lt;/span&gt; for some &lt;span class="Apple-style-span" style="font-style: italic;"&gt;sparring&lt;/span&gt;. I'm far form convinced that either of those metaphors is much help by itself. To see them embedded in one another makes my head spin.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I look forward to the day when we feel secure enough as an industry to have a &lt;span class="Apple-style-span" style="font-style: italic;"&gt;programming&lt;/span&gt; conference where people's &lt;span class="Apple-style-span" style="font-style: italic;"&gt;ability to do programming&lt;/span&gt; is improved. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7921471937499333383?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7921471937499333383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7921471937499333383&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7921471937499333383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7921471937499333383'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2009/01/soft-craft.html' title='Soft-Craft'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-304304546398295507</id><published>2008-12-31T09:42:00.002Z</published><updated>2008-12-31T09:51:56.743Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='shameless self-promotion dept'/><title type='text'>Interview form Agile 2008</title><content type='html'>At &lt;a href="http://agile2008.org/"&gt;Agile 2008&lt;/a&gt; I was interviewed by &lt;a href="http://www.elssamadisy.com/"&gt;Amr Elssamadisy&lt;/a&gt; for &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt;, and the &lt;a href="http://www.infoq.com/interviews/Agile-Skeptic-Keith-Braithwaite"&gt;video&lt;/a&gt; is now up. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-304304546398295507?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/304304546398295507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=304304546398295507&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/304304546398295507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/304304546398295507'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/12/interview-form-agile-2008.html' title='Interview form Agile 2008'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-365146629322500367</id><published>2008-12-23T19:35:00.003Z</published><updated>2008-12-23T21:28:17.231Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mastery'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsmanship'/><title type='text'>Skill vs Mastery</title><content type='html'>Since it's the holidays I get to tourist around London at bit in a way that I tend not to much through the rest of the year. Today I took in the &lt;a href="http://www.tate.org.uk/modern/exhibitions/markrothko/default.shtm"&gt;Rothko show at Tate Modern&lt;/a&gt;. It's the first time in a long time (maybe ever, or at least since Rothko gave them away) that so many of the colour field paintings have been in the same place at the same time. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although these paintings are (at first sight) relatively featureless the viewer is intended to get right up close to them, to feel as if they are &lt;span class="Apple-style-span" style="font-style: italic;"&gt;in&lt;/span&gt; the painting, to be overwhelmed. Although they are not figurative or representational they do carry a lot of content, a lot of emotional impact. There were people sitting in the room where the Seagram murals are, completely transfixed by the paintings. People have been known to burst into tears at the sight of these works.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sort of modern art is perhaps one of the easiest for the "my four-year-old could do better" school of art critic to avoid thinking about. Of course, their four-year-old couldn't. One room of the exhibition goes some way towards explaining why not. These paintings are on (very) close examination revealed to be extremely complicated objects. Rothko put a lot of technique into these paintings: a lot of careful choice of materials, a lot of careful surface treatments, a lot of careful brush work.  In the language of the curators most of them aren't a "painting" at all. They are mixed media on canvas, so complicated is the structure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But none of this shows up when one stands before the works, only the emotional effect comes through. That's mastery. As with painting, &lt;a href="http://www.m3p.co.uk/blog/2008/12/17/expressiveness-makes-the-difference"&gt;as Steve says over here&lt;/a&gt; with reference to music (and code), it's all about the expressiveness.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-365146629322500367?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/365146629322500367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=365146629322500367&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/365146629322500367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/365146629322500367'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/12/skill-vs-mastery.html' title='Skill vs Mastery'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2180834902484415481</id><published>2008-12-14T21:24:00.003Z</published><updated>2008-12-14T21:28:24.189Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Craftsmanship</title><content type='html'>If you read this blog you might be the kind of person who will be interested in the &lt;a href="http://parlezuml.com/softwarecraftsmanship/"&gt;Software Craftsmanship&lt;/a&gt; conference being planned for next year in London. More proposals are needed to round out the programme, so get your thinking caps on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2180834902484415481?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2180834902484415481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2180834902484415481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2180834902484415481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2180834902484415481'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/12/craftsmanship.html' title='Craftsmanship'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3978911156613326037</id><published>2008-12-14T21:19:00.002Z</published><updated>2008-12-14T21:21:48.533Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='xpday'/><title type='text'>XP Day London 08</title><content type='html'>Xp Day is done for another year.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that the incorporation of a large Open Space aspect worked, with some notes taken for doing it better in future. The programmed sessions seemed to be well received too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notes from many session are going up on the &lt;a href="http://xpday-london.editme.com/_Recent"&gt;wiki&lt;/a&gt;, you might like to look, comment or contribute.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3978911156613326037?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3978911156613326037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3978911156613326037&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3978911156613326037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3978911156613326037'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/12/xp-day-london-08.html' title='XP Day London 08'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-696757526923095494</id><published>2008-11-11T15:23:00.003Z</published><updated>2008-11-11T15:38:42.142Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Deployment?</title><content type='html'>I'm sitting here in Zurich with some colleagues working on some guidelines for teams who are starting to use Agile in an evironment formely exclusively RUP-based. We have a stack of Agile books, all by big-name authors, from which we are farming references for them to use. Not one of these books has anything (so far as we can find) to say about &lt;em&gt;deployment&lt;/em&gt;, actually getting the software into the hands of the user. The very word is not in the index of any of them. Oops.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-696757526923095494?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/696757526923095494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=696757526923095494&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/696757526923095494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/696757526923095494'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/11/deployment.html' title='Deployment?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3214488543612115525</id><published>2008-10-25T10:53:00.009+01:00</published><updated>2008-11-01T09:51:15.568Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>"just work"</title><content type='html'>There's an idea in  the management world that some work is "just work". I once had a holiday job in a factory that involved a good deal of one kind of "just work"—unpack a box of bottles of nose spray originally destined for one market and re–label them for another, put them into a different box. Well defined tasks, repeated many, many times. At the limit "just work" comes close to the physicist's idea of work: it's what happens when a force displaces its point of application.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Over the last century or so "just work" has been the topic of intensive study. Techniques for organising the execution of "just work" with the goal of maximum output are very well developed. But what is "just work" for programmers? The question arose in the comments attached to &lt;a href="http://www.taylor.se/blog/2008/10/22/distributed-development-doesnt-work/"&gt;this&lt;/a&gt; discussion of distributed development. It also relates to some thoughts I've been having recently about the rush to adopt Lean practices in some quarters.&lt;br /&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;Andres says that &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;In knowledge work, “just work” &lt;span class="Apple-style-span" style="font-style: italic;"&gt;is&lt;/span&gt; learning. [his emphasis]&lt;/blockquote&gt; If that's true then I think we have to say that a lot of contemporary development activity isn't knowledge work. Wiring up GUI controls? Transducing between HTTP requests and SQL queries? Mashing up web services? You have to learn how to do these things at all, it's true. But what do you learn while doing it once you know how? What learning takes place that &lt;span class="Apple-style-span" style="font-style: italic;"&gt;is&lt;/span&gt; the work? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm reluctant to accept "finding out how to hack your way around the deficiencies of the current framework" as a form of knowledge work. Meanwhile, this maybe does give me a way to think about &lt;a href="http://leansoftwareengineering.com/ksse/feature-brigade/"&gt;a curious claim&lt;/a&gt; (see comments #3 and #4 on that posting) from the Lean camp:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;A pair team has to produce twice as much output at a given level of quality as two solo programmers in order to be worthwhile. &lt;/blockquote&gt;What would we have to believe, in order to think that this claim were true? I think that we would have to believe that the paired programmers are engaged in quite a strong sense of "just work". What is it that a pair of programmers &lt;span class="Apple-style-span" style="font-style: italic;"&gt;necessarily&lt;/span&gt; do half as much of because they are pairing? I can't think of anything but typing. Are &lt;a href="http://www.folklore.org/StoryView.py?project=Macintosh&amp;amp;story=Negative_2000_Lines_Of_Code.txt"&gt;keystrokes&lt;/a&gt; really what it is that programmers do that adds value? At a slightly higher level of sophistication we might say (as Corey in fact does) that the measure of value added is function points. That's a much better measure than typing (which implies code)&lt;blockquote&gt;Measuring programming progress by lines of code is like measuring aircraft building progress by weight.—Bill Gates&lt;/blockquote&gt;but still gives me slight pause. Function points are still a measure from the technical solution space, not the business problem space. One of the things that makes me a bit nervous about the rush to Lean is the de–emphasis on conversations with the user/customer (which Leaners have a habit of dismissing as wasteful "planning") in favour of &lt;span class="Apple-style-span" style="font-style: italic;"&gt;getting tons of code written as fast as possible&lt;/span&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I really want to see is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;getting users empowered to make money&lt;/span&gt; (or whatever it is they value) as fast as possible. That's knowledge work. And &lt;span class="Apple-style-span" style="font-style: italic;"&gt;that&lt;/span&gt; requries learning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3214488543612115525?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3214488543612115525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3214488543612115525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3214488543612115525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3214488543612115525'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/10/just-work.html' title='&quot;just work&quot;'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6339475281252391988</id><published>2008-10-24T11:35:00.006+01:00</published><updated>2008-10-25T10:52:40.179+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming-qua-programming'/><title type='text'>Can you tell your POJO's from your NOJO's?</title><content type='html'>Ivan &lt;a href="http://puttingtheteaintoteam.blogspot.com/2008/10/is-that-pojo-or-nojo.html"&gt;describes&lt;/a&gt; a nice distinction between Plain Old Java Objects in general and Non Object-oriented Java Objects in particular.&lt;br /&gt;&lt;br /&gt;Certain (web, in particular) frameworks lead on in the direction of NOJO's. It begins with the DTO (just one kind of NOJO) and spreads from there. Is that good or bad? Can't say in the completely abstract, but if your current framework does lead you that way have you given thought to what design choices and architectural stances your are being lead to? Do you like them?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6339475281252391988?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6339475281252391988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6339475281252391988&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6339475281252391988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6339475281252391988'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/10/can-you-tell-your-pojos-from-your-nojos.html' title='Can you tell your POJO&apos;s from your NOJO&apos;s?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1068831178334600651</id><published>2008-10-13T21:41:00.011+01:00</published><updated>2008-11-01T09:47:56.243Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hiring'/><title type='text'>Another take on interviewing</title><content type='html'>Very nice posting &lt;a href="http://www.ckwop.me.uk/Interviews-considered-harmful.html"&gt;here&lt;/a&gt; from Simon Johnson regarding the selection of candidates for programming jobs.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;His blog doesn't allow comments, so I'll follow up here: The only real criticism I'd have of Simon's approach is that the list of desirable qualities in a  candidate is backwards. That is, it should read &lt;ol&gt;&lt;li&gt;The person in front of you will complement your pre-existing team&lt;/li&gt;&lt;li&gt;The person in front of you can actually write a program&lt;/li&gt;&lt;li&gt;The person in front of you is smart&lt;/li&gt;&lt;/ol&gt;If the candidate won't complement your team it is&lt;span class="Apple-style-span" style="font-style: italic;"&gt; of no interest&lt;/span&gt; whether or not they can program. Even if they are the semi–mythical 100x productive programmer (hint: those folks are not applying for your position). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If they can't write a program (of the kind that your company finds valuable) it is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;of no interest&lt;/span&gt; how smart they are. Folk wisdom in many parts of the industry suggests that enough smart can outweigh any other shortfall in a programmer. This is only true in very, very limited and highly specific circumstances (hint: you are not in the business of writing hard real–time life–critical massively–parallel seven–nines embedded control software for the black hole at the centre of the galaxy).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;If&lt;/span&gt; you can get along with them, and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;if&lt;/span&gt; they can code, smarter &lt;span class="Apple-style-span" style="font-style: italic;"&gt;is&lt;/span&gt; preferable to dumber. Your only problem now is to find some way to recognise "smarter", which turns out to be very, very hard indeed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1068831178334600651?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1068831178334600651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1068831178334600651&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1068831178334600651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1068831178334600651'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/10/another-take-on-interviewing.html' title='Another take on interviewing'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2787537485995980734</id><published>2008-10-13T21:05:00.002+01:00</published><updated>2008-10-13T21:11:22.252+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='xpday'/><title type='text'>Registration open for XP Day London 'O8</title><content type='html'>&lt;p&gt;&lt;a href="http://booking.xpday.org/registration.php"&gt;Registration for XPDay is now open&lt;/a&gt;. XPDay sells out each year, so please book now. We operate a waiting list once the conference is full but only a handful of places subsequently become available.&lt;/p&gt;  &lt;p&gt;The full cost of the conference is £350 but the first 50 people to book get a special “Early Bird” price of £275.&lt;/p&gt;&lt;p&gt;The few programmed sessions are set, and we encourage registered attendees to think about the topics they'd like to see discussed in the Open Space sessions. Attendees have the option to prepare a 5 minute "lightening talk" to promote their preferred topics, and these will go into the Open Space topic selection..&lt;/p&gt;&lt;p&gt;I look forward to seeing you there.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2787537485995980734?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2787537485995980734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2787537485995980734&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2787537485995980734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2787537485995980734'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/10/registration-open-for-xp-day-london-o8.html' title='Registration open for XP Day London &apos;O8'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1390903962129477254</id><published>2008-09-27T18:21:00.012+01:00</published><updated>2009-12-02T08:58:30.328Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hiring'/><title type='text'>Programming Interview Questions</title><content type='html'>There's a cottage industry devoted to devising questions to ask folks applying for "programming" jobs, to collating such questions and then posting answers to them on the internet. I was reminded of this recently when an announcement of a new Google tool, moderator, came along. The &lt;a href="http://moderator.appspot.com/#e%253Dagltb2RlcmF0b3JyDQsSBlNlcmllcxj4dQw%252Bt%253Dagltb2RlcmF0b3JyDAsSBVRvcGljGPl1DA"&gt;example issue&lt;/a&gt; being moderated was "Interview Questions for Software Engineers". At the time of writing the winner (with 4 upvotes and 0 down votes) is my own proposal:&lt;blockquote&gt;Would you please sit down here at this workstation and write some code with me?&lt;/blockquote&gt;If you are reading this then you have almost certainly been through many an interview for a job that will require some programming to be done. Think back and ask yourself how many times you were offered such a job without ever having been in the same room as a computer and an interviewer. &lt;div&gt;&lt;br /&gt;In my own experience (I've had 9 jobs involving programming, and many more interviews) it's been quite rare. One has to wonder why that is. I suspect that having a candidate do some programming is considered very expensive—and yet hiring the wrong candidate is unbelievably expensive. Hence the questions, which seem to be aimed at finding out if someone will be able able to program without watching them do any.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second most popular question on the moderator site right as I write is&lt;blockquote&gt;Given a singly linked list, determine whether it contains a loop or not&lt;/blockquote&gt;I can see what's being aimed at here, and yet it feels as if, in the stress of an interview setting, all the answer given will tell you is whether or not the candidate has &lt;span class="Apple-style-span" style="font-style: italic;"&gt;seen&lt;/span&gt; the textbook answer before. How does knowing that help?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, this is a systems programming question. The vast majority of working programmers don't come anywhere near any such class of problem. They do applications programming. There seems to be a sort of folk wisdom in a large part of the industry that having the skills (and, see above, mere knowledge) of a systems programmer will suite them well to being an application programmer. It's far from clear to me that this is true: the two areas of programming are quite distinct and require different (albeit overlapping) skill sets. I wonder how many interviewers use questions like this to create the impression (maybe even to themselves) that their organisation is involved in sexy, impressive systems work, whether or not that's true?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A while ago we did an informal survey of folks who work for Zuhlke in the UK, asking what had made them apply to us and what had made them subsequently accept an offer. We (the managers) were surprised by how many said that the very recruitment process itself had encouraged them to accept an offer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is what we do: Line mangers (such as myself) read CVs. There is an HR department, they don't come anywhere near recruitment. CVs that seem to describe a credible technical career go to the Chairman of the company. The candidates he likes the sound of are invited in for a first interview (of around an hour) to see if they are firstly, someone we'd be prepared to put in front of a client under our brand and secondly, someone we would enjoy working alongside. There's also a short written test of programming knowledge. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Those who make it through that are invited back for an interview with a small panel of our consultants who explore their technical knowledge in depth. First the candidate is asked to give a technical presentation on an interesting piece of work they did recently: stand at a white-board, explain the architecture, the technology choices, how it worked, how the project worked, what they did etc. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then we set to finding out what they know. We have a checklist of technologies that we've used in projects and the questions take the form "what do you know about $technology?" No tricks, no puzzles. We do a breadth first pass to eliminate the things that the candidate doesn't know (and the process rewards optimistic answers at this point with a lot of embarrassment later on) and then we drill down into each area until at least one of the candidate's or the interviewers' knowledge is exhausted. This goes on for several hours.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Those who make it through that, and people have been known to walk out, get invited back to do some pair programming. That's the point (and not before) at which we decide if we'd like to make an offer.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;And yes, this &lt;em&gt;is&lt;/em&gt; all unbelievably expensive (I mean, the Chairman does &lt;em&gt;first&lt;/em&gt; interviews?) And very, very effective. Our false positive rate is essentially zero and best of all, clients love our engineers and ask for them back again and again. Which makes it all worth while. I can't think of a cheaper way that would actually work.&lt;br /&gt;&lt;br /&gt;PS: yes we are hiring. If you'd like a go a this, drop me a line.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1390903962129477254?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1390903962129477254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1390903962129477254&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1390903962129477254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1390903962129477254'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/09/programming-interview-questions.html' title='Programming Interview Questions'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3399662694421944500</id><published>2008-09-13T12:12:00.003+01:00</published><updated>2008-09-13T12:19:59.561+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>97 Things Every Software Architect Should Know</title><content type='html'>The &lt;a href="http://97-things.near-time.net/wiki"&gt;97 things&lt;/a&gt; project is approaching a milestone: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;having 97 things&lt;/span&gt; which, in the opinion of one self–selecting group (which includes myself), every software architect should know. The intention is that the "best" 97 things go into a book to be published by &lt;a href="http://oreilly.com/"&gt;O'Reilly&lt;/a&gt;, but that the forum will continue to be active, to gather new so–called "axioms" and discussion of same. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What do you think every software architect should know?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3399662694421944500?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3399662694421944500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3399662694421944500&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3399662694421944500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3399662694421944500'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/09/97-things-every-software-architect.html' title='97 Things Every Software Architect Should Know'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2308454873662134202</id><published>2008-09-10T11:39:00.002+01:00</published><updated>2008-09-10T11:49:10.792+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><title type='text'>What do Android  (and the rest) really mean?</title><content type='html'>If the FOSS rumblings from the mobile OS world are leaving you puzzled, you might benefit from a visit to &lt;a href="http://timjoyce.wordpress.com/2008/09/08/open-source-and-the-mobile-device-value-chain/"&gt;Tim Joyce's blog&lt;/a&gt;. Tim's job is to understand what these things mean, and he's kindly embarking on a blog to share that understanding with the world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2308454873662134202?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2308454873662134202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2308454873662134202&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2308454873662134202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2308454873662134202'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/09/what-do-android-and-rest-really-mean.html' title='What do Android  (and the rest) really mean?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-353614196757196954</id><published>2008-09-02T23:32:00.003+01:00</published><updated>2009-01-02T08:57:51.178Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='shameless self-promotion dept'/><title type='text'>Shameless self promotion dept.</title><content type='html'>I've been &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;amp;show=Five-Questions-With-Keith-Braithwaite.html&amp;amp;Itemid=29"&gt;interviewed&lt;/a&gt; by &lt;a href="http://blogs.msdn.com/micahel/"&gt;Michael Hunter&lt;/a&gt; in his "five questions" column for Dr. Dobbs&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-353614196757196954?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/353614196757196954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=353614196757196954&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/353614196757196954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/353614196757196954'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/09/shameless-self-promotion-dept.html' title='Shameless self promotion dept.'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7196048708706542899</id><published>2008-07-15T06:53:00.003+01:00</published><updated>2008-07-15T09:53:05.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='xtc'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Optimism</title><content type='html'>At the &lt;a href="http://www.xpdeveloper.net/xpdwiki/Wiki.jsp?page=ExtremeTuesdayClub"&gt;Tuesday Club&lt;/a&gt; the other week there was a bit of chat about what seems to be a foundational assumption of Agile: that in fact we &lt;span class="Apple-style-span" style="font-style: italic;"&gt;can&lt;/span&gt; successfully execute software development projects, so we should run them in a way that brings about the greatest benefit.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This in contrast to what appears to be the (undeclared) foundational assumption of many other approaches: development project are so hard that we are most likely to fail, so we'd better find a way to do that as cheaply as possible.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This carried across into a panel discussion at the recent &lt;a href="http://www.unicom.co.uk/product_filter.asp?cid=10018"&gt;Unicom&lt;/a&gt; conference, where one of the attendees came up with this summary description of Agile:&lt;blockquote&gt;Collaborative optimism to solve the right problems (and only the right problems) in an incremental way&lt;/blockquote&gt;I quite like that "collaborative optimism" bit.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7196048708706542899?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7196048708706542899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7196048708706542899&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7196048708706542899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7196048708706542899'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/07/optimism.html' title='Optimism'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3523121545073167004</id><published>2008-07-14T21:26:00.006+01:00</published><updated>2008-07-19T12:38:21.588+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='book review'/><title type='text'>Agile Adoption Patterns</title><content type='html'>I've just done a first pass through &lt;a href="http://www.elssamadisy.com/"&gt;Amr Elssamadisy&lt;/a&gt;'s cracking new book &lt;a href="http://www.amazon.co.uk/Agile-Adoption-Patterns-Roadmap-Organizational/dp/0321514521"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Agile Adoption Patterns&lt;/span&gt;&lt;/a&gt;. It's a timely work—enough teams have adopted enough Agile practices enough times that there should be patterns by now. And here they are.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a lot to like about the book. I especially appreciate the consistent message throughout that we do these practices because of their tie to business value. Not for truth and beauty, not for right &lt;span class="Apple-style-span" style="font-style: italic;"&gt;versus&lt;/span&gt; wrong, but because they make our customers happy through the means of more money sooner, more often. There is an explicit mapping from various enhancements to business value onto clusters of the patterns. There is also mappings by business or process smell (of which there is a good, short catalogue presented). For each kind of business benefit the patterns within each cluster are logically related and given a partial order with respect to how well they help with that goal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Separately, the clusters of patterns are described themselves &lt;span class="Apple-style-span" style="font-style: italic;"&gt;as patterns&lt;/span&gt;, which is a nice organising principle. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Agile Adoption Patterns&lt;/span&gt; is quite explicitly a handbook for finding out &lt;span class="Apple-style-span" style="font-style: italic;"&gt;why&lt;/span&gt; your organisation might want to adopt Agile and then building a strategy to make that happen. A damn handy thing to have.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Scattered through the pattern catalogue there are little diagrams relating the patterns. I might wish for more of these. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The patterns themselves contain a "Sketch" section, in which a surprisingly large cast of characters play out little vignettes. Dave Developer comes to realise the value of stand–up meetings because he sees Scott ScrumMaster [sic] removing his blockers, and so forth. I know that this style of thing is very fashionable these days, but it makes me cringe. Not only that, but I have a terrible memory for names, so keeping these fourteen characters lined up in my head is a strain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The patterns have the usual "Therefore" section with the things–to–do in it, followed by and "Adoption" section telling you how to get there. They are all quite meaty, concrete and honest.  And best of all is the "But" section telling you common mis–steps, gotchas, misunderstandings and how to recognise same. This is outstanding! A common shorthand description of what a pattern is (in fact, it's in this book too) is words to the effect of a "solution to a problem in a context" Which is sort–of true a far as it goes but has its problems, mostly around the term ''solution". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, how we love "solutions" in the IT industry. A more accurate but less compelling description what patterns are is that they are mappings form one context to another, in which certain conflicting forces are more agreeably disposed (or resolved) in the latter than in the former. These "But" sections describe common scenarios (I've seen a lot of them, and so have you, I'll bet: Continuous Integration &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;but&lt;/span&gt; continuously broken build, anyone?) that you could have and still make some sort of Jesuitical argument to be in agreement with the "Therefore", but actually are very wide of the mark. The next time I write any patterns, they will have a "But" section.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The highest level organisation of the patterns is into those concerned primarily with Feedback, technical practices, supporting practices and the cluster patterns. I was most interested to note that "Coach" is a supporting practice, but the role of ScrumMaster is assumed throughout.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am one of the latter, but I'd rather be one of the former. Not so much of an option these days. Well, that's the power of marketing for you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Meanwhile, one of the nicest things about having patterns is having a shared vocabulary. I think that &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Agile Adoption Patterns&lt;/span&gt; will become the standard reference for talking about Agile adoption, which will make my professional life easier and that of may others. A service to the community.&lt;/div&gt;&lt;div&gt;&lt;h3&gt;"Opportunities for Improvement"&lt;/h3&gt;The pattern form used is has nine sections and I'm not sure it helps to have each section shown in the table of contents. I feel the lack of a ready–to–hand one or two page list of all the patterns by name. Twelve pages of TOC for 320 pages of content seems a bit excessive. The same syndrome shows up in the index. If all the parts of a pattern are within a four page range do they really all need their own individual index entry? This is really a shame as the book otherwise benefits from the several other complementary ways to navigate it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a stunningly egregious formatting botch on page 207. I'm sure this volume will go into multiple printings and I hope that someone at A–W gets that fixed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3523121545073167004?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3523121545073167004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3523121545073167004&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3523121545073167004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3523121545073167004'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/07/agile-adoption-patterns.html' title='Agile Adoption Patterns'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1412345413636383987</id><published>2008-07-11T07:57:00.003+01:00</published><updated>2008-07-12T10:07:27.947+01:00</updated><title type='text'>The Non–functional in a Functional world?</title><content type='html'>This post shows an implementation of map/reduce in Haskell. It's a one–liner (if you ignore all the other lines) and begins with this claim:&lt;blockquote&gt;the type says it all&lt;p&gt;&lt;code&gt;p_map_reduce :: ([a] -&gt; b) -&gt; (b -&gt; b -&gt; b) -&gt; [a] -&gt; b&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;The type says a lot, that's for sure. I says that map/reduce results in a value of type b when given a list of values of type a, a function that gives one b given two b's and a function that gives one b given a list of a's. That is a lot of information and it's impressive that it (at least) can be stated on one line. Is it "all", though?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even allowing for some inter–tubes posting hyperbole "all" is a very strong claim. A Haskell programmer should know that. If one already knows what map/reduce does then the type tells you a lot about how to use this implementation of it. And if you don't, maybe not so much.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But that's not what caught my attention. The point of map/reduce is to recruit large pools of computational resource to operate on very large data sets efficiently. The (14 line, in fact—which is still quite impressive) implementation uses Haskell's Control.Parallel features to chop the list of a's into 16 chunks. That's not in the type. The intention is to have enough lumps of work to &lt;blockquote&gt;bump all your cores to 100% usage, and linearly increase overall performance&lt;/blockquote&gt;which it may well do on a large enough data set, if I have fewer than seventeen cores. Currently, I do. There are nine cores in my flat right now. If my other laptop were here, it'd be eleven. But if I'm planning to use map/reduce in the first place, maybe I'm going to recruit all the machines in the office, which would currently be worth over twenty cores. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;This&lt;/span&gt; map/reduce isn't going to pin all of them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Would Haskell's type system support giving &lt;code&gt;p-map-reduce&lt;/code&gt; a dependent type with the number of worker processes in it? I don't know enough about it to tell. And why would we care? Well, that number 16 is a very significant part of the implementation of that function. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only reason we'd bother to use map/reduce is because of its non–functional characteristics (as the properties of software that make it actually useful are called) and these are no–where to be seen in its type as a function. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1412345413636383987?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1412345413636383987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1412345413636383987&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1412345413636383987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1412345413636383987'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/07/nonfunctional-in-functional-world.html' title='The Non–functional in a Functional world?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5453558289843262834</id><published>2008-07-01T11:59:00.005+01:00</published><updated>2008-07-01T12:08:02.186+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>Computer Weekly IT Blog Awards</title><content type='html'>The &lt;a href="http://www.computerweekly.com/Articles/2008/06/30/230439/programming-and-development-blogs-computerweekly.com-it-blog-awards.htm"&gt;shortlist &lt;/a&gt;for the Computer Weekly IT Blog Awards 2008 is just out.&lt;br /&gt;&lt;br /&gt;This blog was nominated (most kind, thanks), as were those of my colleagues &lt;a href="http://21ccw.blogspot.com/"&gt;Ben &lt;/a&gt;and &lt;a href="http://darynholmes.wordpress.com/"&gt;Daryn&lt;/a&gt;, but Daryn's has made it onto the shortlist. This is fitting recognition for the fine work he has put into his blog, particularly his series of Ruby/Rails tutorials which are gathering some recongnition in that world. Feel free to &lt;a href="http://www.computerweekly.com/blogawards.htm"&gt;go and vote &lt;/a&gt;for him!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5453558289843262834?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5453558289843262834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5453558289843262834&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5453558289843262834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5453558289843262834'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/07/computer-weekly-it-blog-awards.html' title='Computer Weekly IT Blog Awards'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5386182433632606643</id><published>2008-06-24T22:46:00.005+01:00</published><updated>2008-06-24T23:28:49.694+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xpday'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>XPDay London Session Submission Process</title><content type='html'>If you want to propose a session for &lt;a href="http://xpday.org/"&gt;XP Day&lt;/a&gt; London '08 (and I hope that you do), then here's what you need to do.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We want the conference to be largely self–organizing this year, so the submission process is suitably light weight.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Experience Reports&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Please send a very brief outline of your report to submissions2008@xpday.org You will receive a URL to a google document. Make sure that you include an email address corresponding to a google account (or let us know if the address you send from is the one to use). The document will be writeable by you and the committee and all other submitters. Develop your report there. As in past years we invite the community to collaborate together to help maximize the quality of all submissions. After the close of submissions the committee will make a selection of experience reports to be presented at the conference. The selected reports will be shepherded between acceptance and the conference.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Conference Sessions&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Most of the duration of the conference (other than experience reports) will be &lt;a href="http://www.openspaceworld.org/cgi/wiki.cgi?AboutOpenSpace"&gt;OpenSpace&lt;/a&gt;. There will be &lt;a href="http://perl.plover.com/lt/osc2003/lightning-talks.html"&gt;Lightning Talks&lt;/a&gt; early in the day where people can publicize topics that they would like to discuss. We encourage people to engage in this way. There will be optional rehearsals at XtC in the weeks running up to the conference. You do not need to attend these to make a lightening talk at the conference. If you would like to have such a rehearsal, send a title and a google account email address to submissions2008@xpday.org You will be allocated to a rehearsal slot. We invite groups outside London to schedule rehearsals too, and are happy to help with scheduling those. There will be a google calendar with the slots shown.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some kinds of session can benefit from some preparation of materials and some logistics on the day. For example, a workshop involving some sort of server, or extensive materials. There will be a limited number of time slots during the conference for such sessions. Please submit a brief outline to submissions2008@xpday.org indicting an email address associated with a google account. You will be sent the URL of a google document within which to develop your proposal in collaboration with other submitters. After the close of submissions these proposals will be assessed by the committee and suitable sessions will be selected for the program.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have decided to extend the submission period, so submissions for experience reports, rehearsals and programmed sessions now closes on &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Friday August 8th 2008&lt;/span&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This year we want to de–emphasize sessions introducing Agile or Scrum or XP or TDD or... and promote topics of current interest to practitioners. We want the conference to be a forum in which the state of the art is advanced. That doesn't mean that only experts are welcome, or welcome to present. Experts have their &lt;a href="http://www.m3p.co.uk/blog/2008/06/15/test-driven-development-a-cognitive-justification/"&gt;failure modes&lt;/a&gt;, simple questions from journeymen often reveal the essence. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All are welcome, so get your thinking caps on!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5386182433632606643?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5386182433632606643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5386182433632606643&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5386182433632606643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5386182433632606643'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/06/xpday-london-session-submission-process.html' title='XPDay London Session Submission Process'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-991418519017976634</id><published>2008-06-13T18:30:00.011+01:00</published><updated>2009-07-25T11:38:24.267+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='programming-qua-programming'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>TDD, Mocks and Design</title><content type='html'>Mike Feathers has &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2008/06/the-flawed-theo.html"&gt;posted&lt;/a&gt; an exploration of some ideas about and misconceptions of TDD.  I wish that more people were familiar this story that he mentions:&lt;blockquote&gt;John Nolan, the CTO of a startup named Connextra [...] gave his developers a challenge: write OO code with no getters.  Whenever possible, tell another object to do something rather than ask.  In the process of doing this, they noticed that their code became supple and easy to change. &lt;/blockquote&gt; That's right: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;no getters&lt;/span&gt;. Well, &lt;a href="http://www.m3p.co.uk/blog"&gt;Steve Freeman&lt;/a&gt; was amongst those developers and &lt;a href="http://jmock.codehaus.org/"&gt;the rest&lt;/a&gt; is history. Tim Mackinnon &lt;a href="http://www.macta.f2s.com/Thoughts/smock.html"&gt;tells&lt;/a&gt; another part of the story. I think that there's actually a little bit missing from Michael's decription. I'll get to it at the end.&lt;div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;A World Without Getters&lt;/h3&gt;Suppose that we want to print a value that some object can provide. Rather than writing something like &lt;code&gt;statement.append(account.getTransactions()) &lt;/code&gt;instead we would write something more like &lt;code&gt;account.appendTransactionsTo(statement)&lt;/code&gt; We can test this easily by passing in a mocked &lt;code&gt;statement&lt;/code&gt; that expects to have a call like &lt;code&gt;append(transaction)&lt;/code&gt; made. Code written this way does turn out to be more flexible, easier to maintain and also, I submit, easier to read and understand. (Partly because) This style lends itself well to the use of &lt;a href="http://c2.com/cgi/wiki?IntentionRevealingNames"&gt;Intention Revealing Names&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the real essence of TDD with Mocks. It happens to be true that we can use mocks to stub out databases or web services or what all else, &lt;a href="http://www.redhillconsulting.com.au/blogs/simon/archives/000113.html"&gt;but we shouldn't&lt;/a&gt;. Not doing that leads us to write code for each sub-domain within our application in terms of very narrow, very specific interfaces with other sub-domains and to write transducers that sit at the boundaries of those domains. This is a good thing. At the largest scale, with functional tests, it leads to &lt;a href="http://alistair.cockburn.us/index.php/Hexagonal_architecture#Alternative_name:_Hexagonal_Architecture"&gt;hexagonal architecture.&lt;/a&gt; And that can apply equally well recursively down to the level of individual objects. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next time someone tries to tell you that an application has a top and a bottom and a one-dimensional stack of layers in between like pancakes, try exploring with them the idea that  what systems really have is an inside and a outside and a nest of layers like an onion. It works remarkable wonders.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If we've decided that we don't mock infrastructure, and we have these transducers at domain boundaries, then we write the tests in terms of the problem domain and get a good OO design. Nice.&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;The World We Actually Live In&lt;/h3&gt;Let's suppose that we work in a mainstream IT shop, doing in-house development. Chances are that someone will have decided (&lt;a href="http://peripateticaxiom.blogspot.com/2006/04/just-what-do-you-need-rdbms-for-anyway.html"&gt;without thinking&lt;/a&gt; too hard about it) that the &lt;a href="http://www.kfs.org/~jonathan/witt/t11en.html"&gt;world of facts&lt;/a&gt; that our system works with will live in a relational database. It also means that someone (else) will have decided that there will be a object-relational mapping layer, based on the inference that since we are working in Java(C#) which is deemed by Sun(Microsoft) to be an object-oriented language then we are doing object-oriented programming. As we shall see, this inference is a little shaky.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, a popular approach to this is to introduce a &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html"&gt;Data Access Object&lt;/a&gt; as a facade onto wherever the data actually lives. The full-blown DAO pattern is a hefty old thing, but note the "transfer object" which the data source (inside the DAO) uses to pass values to and receive values from the business object that's using the DAO. These things are basically structs, their job is to carry a set of named values. And if the data source is hooked up to an RDBMS then they more-or-less represent a row in a table. And note that the business object is different from the transfer object. The write-up that I've linked to is pretty generic, but the inference seems to be invited that the business object is a big old thing with lots of logic inside it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A lot of the mechanics of this are rolled up into nice frameworks and tools such as Hibernate. Now, don't get me wrong in what follows: Hibernate is great stuff. I do struggle a bit with how it tends to be used, though. Hibernate shunts data in and out of your system using transfer objects, which are (lets say) Java Beans festooned with getters and setters. That's fine. The trouble begins with the business objects. &lt;/div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Irresponsible and Out of Control&lt;/h3&gt;&lt;div&gt;In this world another popular approach is, whether it's named as such or not, whether it's explicitly recognized or not, &lt;a href="http://www.agilemodeling.com/artifacts/robustnessDiagram.htm"&gt;robustness analysis&lt;/a&gt;. A design found by robustness analysis (as I've seen it in the wild, which may well not be be what's intended, see comments on ICONIX) is built out of  "controllers", big old lumps of logic, and "entities", bags of named values. (And a few other bits and  bobs) Can you see where this is going? There are rules for robustness analysis and one of them is that entities are not allowed to interact directly, but a controller may have many entities that it uses together. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Can you imagine what the code inside the &lt;code&gt;update&lt;/code&gt; method on the &lt;code&gt;GenerateStatementController&lt;/code&gt; (along with its &lt;code&gt;Statement&lt;/code&gt; and &lt;code&gt;Account&lt;/code&gt; entities) might look like?&lt;/div&gt;&lt;div&gt;Hmmm.&lt;/div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Classy Behaviour&lt;/h3&gt;&lt;div&gt;Whenever I've taught robustness analysis I've always contrasted it with &lt;a href="http://c2.com/doc/oopsla89/paper.html#cards"&gt;Class Responsibility Collaboration&lt;/a&gt;, a superficially similar technique that produces radically different results. The lesson has been that RA-style controllers always, but &lt;span class="Apple-style-span" style="font-style: italic;"&gt;always&lt;/span&gt;, hide valuable domain concepts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's seductively easy to bash in a controller for a use case and then bolt on a few passive entities that it can use without really considering the essence of the domain. What you end up with is the moral equivalent of stored procedures and tables. That's not necessarily wrong, and it's not even necessarily bad depending on the circumstances. But it is completely missing the point of the last thirty-odd years worth of advances in development technique. One almost might as well be building the system in PRO*C&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, with CRC all of the objects we find are assumed to have the capability of knowing things &lt;span class="Apple-style-span" style="font-style: italic;"&gt;and&lt;/span&gt; doing stuff. In RA we assume that objects &lt;span class="Apple-style-span" style="font-style: italic;"&gt;either&lt;/span&gt; know stuff &lt;span class="Apple-style-span" style="font-style: italic;"&gt;or&lt;/span&gt; do stuff. And how's a know-nothing stuff-doer get the information to carry out its work? Why, it uses a passive knower, an entity which (ta-daaah!) pops ready made out of a DAO in the form of a transfer object.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And actually that &lt;span class="Apple-style-span" style="font-style: italic;"&gt;is&lt;/span&gt; bad.&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Old Skool&lt;/h3&gt;Back in the day the masters of &lt;a href="http://www.research.ibm.com/journal/sj/132/ibmsj1302C.pdf"&gt;structured programming[pdf]&lt;/a&gt; worried a lot about various coupling modes that can occur between two components in a system. One of these is "Stamp Coupling". We are invited to think of the "stamp" or template from which instances of a struct are created. Stamp coupling is considered (in the structured design world) one of the least bad kinds of coupling. Some coupling is inevitable, or else your system won't work, so one would like to choose the least bad ones, and (&lt;a href="http://pages.cpsc.ucalgary.ca/~eberly/Courses/CPSC333/Lectures/Design/coupling.html"&gt;as of 1997&lt;/a&gt;) stamp coupling was a recommended choice.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OK, so the thing about stamp coupling is that it implicitly couples together &lt;span class="Apple-style-span" style="font-style: italic;"&gt;all&lt;/span&gt; the client modules of a struct. If one of them changes in a way that requires the shape of the struct to change then all the clients are impacted, even if they don't use the changed or new or deleted field. That actually doesn't sound so great, but if you're bashing out PL/1 it's probably about the best you can do. Stamp coupling is second best, with only "data"  coupling as preferable: the direct passing of atomic values as arguments. Atomic data, eh? We'll come back to that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, the second &lt;span class="Apple-style-span" style="font-style: italic;"&gt;worst&lt;/span&gt; kind of coupling that the gurus identified was "common coupling" What that originally meant was something like a COMMON block in Fortran, or global variables  in C, or pretty much everything in a COBOL program: just a pile of values that all modules/processes/what have you can go an monkey with. Oops! Isn't that what  a transfer object that comes straight out of a (single, system-wide) database ends up being? This is not looking so good now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What about those atomic data values? What was meant back in the day was what we would now call native types: &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;char&lt;/code&gt;, that sort of thing. The point being that these are safe because it's profoundly unlikely that some other application programmer is going to kybosh your programming effort by changing the layout of &lt;code&gt;int&lt;/code&gt;. &lt;div&gt;And the trouble with structs is that they can. And the trouble with transfer objects covered in getters and setters is that they can, too. But what if there were none...&lt;/div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Putting Your Head in a Bag Doesn't Make you Hidden&lt;/h3&gt;David Parnas helped us all out a lot when in 1972 &lt;a href="http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf"&gt;he made some comments[pdf]&lt;/a&gt; on the criteria to be used in decomposing systems into modules&lt;blockquote&gt;Every module [...] is characterized by its knowledge of a design decision which it hides from all others. Its interface or definition was chosen to reveal as little as possible about its inner workings.&lt;/blockquote&gt;Unfortunately, this design principle of information hiding has become &lt;a href="http://www.javaworld.com/javaworld/jw-05-2001/jw-0518-encapsulation.html"&gt;fatally confused&lt;/a&gt; with the implementation technique of encapsulation. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the design of a class involves a member &lt;code&gt;private int count&lt;/code&gt; then encapsulating that behind a getter &lt;code&gt;public int getCount()&lt;/code&gt; hides &lt;em&gt;nothing&lt;/em&gt;. When (not if) count gets renamed, changed to a big integer class, or whatever, all the client classes need to know about it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope you can see that if we didn't have any getters on our objects then this whole story unwinds and a nasty set of design problems evaporate before our eyes. &lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;What was the point of all that, again?&lt;/h3&gt;&lt;div&gt;John's simple sounding request: write code with no getters (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;and&lt;/span&gt; thoroughly test it, quite important that bit) is a miraculously clever one. He is a clever guy, but even so that's good. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eliminating getters leads developers down a route that we have known is beneficial for thirty years, without really paying much attention. And the idea has become embedded in the first really new development technique to come along for a long time: TDD. What we need to do now is make sure that mocking doesn't get blurred in the same was as a lot of these other ideas have been. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First step: stop talking about mocking out infrastructure, start talking about mocks as a design tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-991418519017976634?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/991418519017976634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=991418519017976634&amp;isPopup=true' title='53 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/991418519017976634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/991418519017976634'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/06/tdd-mocks-and-design.html' title='TDD, Mocks and Design'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>53</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3608627178577252301</id><published>2008-06-08T16:46:00.002+01:00</published><updated>2008-06-08T16:52:35.627+01:00</updated><title type='text'>Image</title><content type='html'>Rick Minerich &lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/06/why-are-our-programs-still-represented-by-flat-files.aspx?CommentPosted=true#commentmessage"&gt;asks the question&lt;/a&gt; "Why are our programs still represented by flat files?" To which my answer is "not all of them are." &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Judging by the tag cloud on his blog, Rick works mainly in the Microsoft end of the enterprisey world. If VisualStudio is the main front end to your system then I can see why the question would arise. Of course, in other parts of the IT world programs stopped being in flat files a long time ago. Or even never were. But you have to go looking for that world. As luck would have it, Gilad Bracha has just recently &lt;a href="http://gbracha.blogspot.com/2008/06/incremental-development-environments.html"&gt;explained&lt;/a&gt; some of the very pleasant aspects of that world. But so many programmers either don't know it exists, or once shown it refuse to enter.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3608627178577252301?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3608627178577252301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3608627178577252301&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3608627178577252301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3608627178577252301'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/06/image.html' title='Image'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6417099631248321001</id><published>2008-05-15T19:14:00.003+01:00</published><updated>2008-05-15T19:18:25.487+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming-qua-programming'/><title type='text'>A Painful Learning Experience Revisited</title><content type='html'>Painful but valuable. This &lt;a href="http://www.postmodernprogramming.org/stories/fixed_point_madness"&gt;old thing&lt;/a&gt; has popped up onto folks' radars again, with some interesting discussion &lt;a href="http://reddit.com/r/programming/info/6jg1k/comments/"&gt;here&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm sad that the PoMoPro experiment kind-of fizzled out. I occasionally try to talk Ivan into doing a second &lt;a href="http://www.bcs-spa.org/pomopro.html"&gt;conference&lt;/a&gt;, but without success.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6417099631248321001?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6417099631248321001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6417099631248321001&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6417099631248321001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6417099631248321001'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/05/painful-learning-experience-revisited.html' title='A Painful Learning Experience Revisited'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-5315511252159331856</id><published>2008-05-13T16:18:00.001+01:00</published><updated>2008-05-13T16:19:51.236+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>XP Day London Call</title><content type='html'>I'm pleased to announce that the &lt;a href="http://xpday.org/call"&gt;call for submissions&lt;/a&gt; to XpDay London 2008 is now open. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Get your thinking caps on, and in due course an electronic submission system will be announced.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-5315511252159331856?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/5315511252159331856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=5315511252159331856&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5315511252159331856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/5315511252159331856'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/05/xp-day-london-call.html' title='XP Day London Call'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7078724237031824198</id><published>2008-05-05T13:27:00.007+01:00</published><updated>2008-05-05T19:57:11.027+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><title type='text'>The Process for Programming (and why it might not help)</title><content type='html'>Paul Johnson writes about the infamous 1:10 productivity ratios in programing, and suggests that &lt;a href="http://paulspontifications.blogspot.com/2008/05/under-appreciated-fact-we-dont-know-how.html"&gt;we don't know how to program&lt;/a&gt;, that is, &lt;i&gt;there is no process for programming.&lt;/i&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I take the view that on the contrary, we do know how to program, and there pretty much is a process for programming, but it isn't much recognized because it doesn't do what so many people so desperately want a process for programming to do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The process for programming that I have in mind is very much like the process for doing maths—I suspect that this is why (reputedly) everyone who goes to work as a programmer at Microsoft is given a copy of &lt;a href="http://www.amazon.co.uk/gp/product/0140124993?ie=UTF8&amp;amp;tag=peripaxiom-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0140124993"&gt;How to Solve It&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=peripaxiom-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=0140124993" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;. What both activities have in common is a need to do imaginative, creative problem solving within strict constraints.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Paul lists a bunch of activities, of which he suggests that "the core activity is well understood: it is written down, taught and learned". One of these is "curing a disease".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I find that questionable. Have you ever watched &lt;span class="Apple-style-span" style="font-style: italic;"&gt;House&lt;/span&gt;? Apart from being a very entertaining update of &lt;a href="http://bookshelved.org/cgi-bin/wiki.pl?AStudyInScarlet"&gt;Sherlock Holmes&lt;/a&gt;, what goes on in the early seasons of &lt;span class="Apple-style-span" style="font-style: italic;"&gt;House&lt;/span&gt; is (within the limits of television drama, to the eyes of this layman) pretty close to the actual investigations and diagnoses I have read in &lt;a href="http://www.amazon.co.uk/gp/product/0452265886?ie=UTF8&amp;amp;tag=peripaxiom-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0452265886"&gt;The Medical Detectives&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=peripaxiom-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=0452265886" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;,  &lt;a href="http://www.amazon.co.uk/gp/product/0330294911?ie=UTF8&amp;amp;tag=peripaxiom-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0330294911"&gt;The Man Who Mistook His Wife for a Hat&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=peripaxiom-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=0330294911" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; and a few other of the bits of source material. To a surprising extent, they aren't making that stuff up. See how the diagnostic team blunder about? See how they follow false leads? See how some apparently unrelated fact combines in the prepared mind with a huge mass of prior experience to prompt new ideas? See how they must take a chance on something that they don't know will work?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are definite tools that are used again and again, primarily &lt;a href="http://en.wikipedia.org/wiki/Differential_diagnosis"&gt;differential diagnosis&lt;/a&gt; (which, BTW, makes the average episode of &lt;span style="font-style: italic;"&gt;House&lt;/span&gt; into a good short course on debugging), and the various physiological tests and so forth, but mostly it's a synthesis of knowledge and experience. If you ever get the chance to hear &lt;a href="http://www.exampler.com/"&gt;Brian Marick&lt;/a&gt; tell his story about &lt;a href="http://www.testing.com/writings/tacit-knowledge.html"&gt;how vets learn&lt;/a&gt; to recognize "bright" vs "dull" cows you'll get a good idea of just how the teaching of medicine works. And it works to a large extent by the inculcation of tacit knowledge.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tacit knowledge is terribly hard stuff to deal with, it's in the "unknown knowns" quadrant. One of the things that makes teaching a skill difficult is the manifestation of tacit knowledge&lt;a id="patterns"&gt;&lt;/a&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=23912478&amp;amp;postID=7078724237031824198#note_on_patterns"&gt;*&lt;/a&gt;.  A bit part of what a lot of people want a "process" for programming to do is to make explicit exactly that tacit knowledge. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But there is only one way to do that really well, which is exactly why things like teaching hospitals exist. The way to do it is to try repeatedly with feedback from an expert. The external feedback is crucial. You may have heard somewhere that practice makes perfect. In fact, all practice does by itself is make consistent. It's the expert feedback that leads to improvement. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This one reason why folks are unhappy with what we do know about how to program: it &lt;a href="http://norvig.com/21-days.html"&gt;cannot&lt;/a&gt; be learned quickly from a book, from a one-week course. There is another reason, perhaps worse: what we know about programming does not (and if parallel with other disciplines based on skill and judgment, it never will) equip programmers to produce a given outcome on demand, on time, every time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The idea has got around (originating perhaps with "One Best Way" &lt;a href="http://en.wikipedia.org/wiki/Scientific_management"&gt;Taylor&lt;/a&gt;) that a process for any given job should be like a recipe—follow it exactly and get the same result every time. In some spheres of work such things are possible. Programming does not seem to be one of them, no matter how much we might wish it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;em&gt;&lt;a id="note_on_patterns"&gt;&lt;/a&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=23912478&amp;amp;postID=7078724237031824198#patterns"&gt;*&lt;/a&gt; Design (and other kinds) of patterns are in part about capturing this stuff, which they do variously well. I suspect that this is part of the reason why more experienced folks who haven't seen them before say things like "that's obvious" or "anyone who doesn't know/couldn't work that out shouldn't be a programmer". &lt;br /&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7078724237031824198?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7078724237031824198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7078724237031824198&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7078724237031824198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7078724237031824198'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/05/process-for-programming-and-why-it.html' title='The Process for Programming (and why it might not help)'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6181589697084834658</id><published>2008-04-26T20:24:00.005+01:00</published><updated>2008-04-26T20:38:02.686+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>XpDay 2008</title><content type='html'>&lt;a href="http://xpday.org/"&gt;XpDay London&lt;/a&gt; will be on 11 and 12 of December, at &lt;a href="http://www.churchhouseconf.co.uk/about/history.shtml"&gt;Church House&lt;/a&gt; in the City of Westminster. The call for submissions will come soon. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're aiming for something a little different this year. The conference committee (in as far as it has one) has decided that if we belong to a &lt;a href="http://agilemanifesto.org/"&gt;community&lt;/a&gt; that really does value individuals and their interactions more than processes and tools, and responding of change more than following a plan, then our conference should work in a way consonant with that. I'm Programme Co-chair, so a lot of the mechanics of how that will work in practice fall to me to figure out–and this is almost done. I'll keep you posted.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6181589697084834658?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6181589697084834658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6181589697084834658&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6181589697084834658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6181589697084834658'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/xpday-2008.html' title='XpDay 2008'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6340331890681379888</id><published>2008-04-26T08:19:00.005+01:00</published><updated>2008-04-28T09:17:06.717+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming-qua-programming'/><title type='text'>Why You Aren't Donald Knuth</title><content type='html'>Nice &lt;a href="http://www.informit.com/articles/article.aspx?p=1193856"&gt;interview&lt;/a&gt; over at InformIT (it's that Binstock guy again, why had I not heard of him a couple of weeks ago?) with Prof Knuth.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He makes this observation:&lt;blockquote&gt;[...]]the idea of immediate compilation and "unit tests" appeals to me only rarely, when I’m feeling my way in a totally unknown environment and need feedback about what works and what doesn’t. Otherwise, lots of time is wasted on activities that I simply never need to perform or even think about. Nothing needs to be "mocked up."&lt;/blockquote&gt;I believe him. I also draw a few inferences. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One is that Knuth probably doesn't spend much time working on systems that do their work by intimately coördinating (with) six or eight other systems with very different usage patterns, metaphors, implementation stacks, space and time complexities, latencies, interface styles/languages/protocols etc. etc. etc. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another is that he probably doesn't spend much time working on problems that are incompletely and ambiguously described (and that can't be fixed in a meaningful time and/or budget), part of an ad–hoc domain, intrinsically fuzzy, aiming or a moving target from a moving platform, subject to capricious and arbitrary constraints, etc. etc. etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And thus is the working life of the research computer scientist different from the working life of the commercial software engineer. I'm tempted to say (and so I will) that the jobbing industrial programmer spends more time in an unknown environment and needs more feedback (and, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;right now!&lt;/span&gt;) about what works and what doesn’t more often than a researcher does.&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Postscript&lt;/h3&gt;By the way, anyone&lt;a href="http://www.blogger.com/post-create.g?blogID=23912478#note"&gt;*&lt;/a&gt; who reads that interview and thinks to themselves "ha! See! Knuth doesn't unit test, so I don't need to either" needs to consider a couple of things:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a id="c1"&gt;&lt;/a&gt;you aren't Don Knuth &lt;br /&gt;&lt;/li&gt;&lt;li&gt;are you really prepared to do all the other stuff that Knuth does &lt;span class="Apple-style-span" style="font-style: italic;"&gt;so that&lt;/span&gt; his programs still work without unit testing?&lt;/li&gt;&lt;li&gt;if so, whom do you imagine is going to pay for you to?&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;em&gt;&lt;a id="note"&gt;* &lt;/a&gt;The "I'm too clever to test" crowd does exist. I'd be amazed if any of them read this blog, but those of you who do will likely meet them from time to time. An electron-microscopically tiny proportion of them are right (see consideration &lt;a href="http://www.blogger.com/post-create.g?blogID=23912478#c1"&gt;1&lt;/a&gt;).&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6340331890681379888?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6340331890681379888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6340331890681379888&amp;isPopup=true' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6340331890681379888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6340331890681379888'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/why-you-arent-donald-knuth.html' title='Why You Aren&apos;t Donald Knuth'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6014427293546016580</id><published>2008-04-24T19:46:00.004+01:00</published><updated>2008-04-24T20:22:42.010+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming-qua-programming'/><title type='text'>Creation Under Constraints</title><content type='html'>It's a symptom of the bourgeoisie's self-hatred that creation (or worse yet, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;creativity&lt;/span&gt;) is seen as a wild, undisciplined, anarchic thing. And yet every person who'd be called an artist that I've ever met has been passionately interested in form and structure and rules and schemata and in doing work under constraints that force them to try new things. That's right, introducing constraints can increase creativity, can bring to light new and exiting possibilities that were, so to speak, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;hidden by the freedom&lt;/span&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Haiku. Silverpoint drawing. Strict counterpoint. You wouldn't want to not have any other way to express yourself, but what a learning exercise!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Andrew Binstock &lt;a href="http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html"&gt;relates&lt;/a&gt; a certain set of constraints within which to practice OO programming. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of them I like a huge amount:&lt;/div&gt;&lt;blockquote&gt;Wrap all primitives and strings. [...]  So zip codes are an object not an integer, for example. This makes for far clearer and more testable code.&lt;/blockquote&gt;It certainly does, which was the topic of the &lt;a href="http://ivan.truemesh.com/archives/000733.html"&gt;session&lt;/a&gt; which Ivan and I ran at Spa this year.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another is this:&lt;/div&gt;&lt;blockquote&gt;Don’t use setters, getters, or properties. [...] “tell, don’t ask.”&lt;/blockquote&gt;Indeed. What we now know as &lt;a href="http://jmock.org/"&gt;jMock&lt;/a&gt; was invented to support this style of programming. It works a treat.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This one, though, I'm a bit equivocal about:&lt;/div&gt;&lt;blockquote&gt;Don’t use the ‘else’ keyword. Test for a condition with an if-statement and exit the routine if it’s not met.&lt;/blockquote&gt;See, depends on what's meant. It could be that a trick is being missed. On the one hand, I'm a huge fan of code that returns early (&lt;code&gt;if(roundHole.depthOf(squarePeg).sufficient()) return;&lt;/code&gt;), and also of very aggressive guard clauses (&lt;code&gt;if(i.cantLetYouDoThat(dave)) throw new DeadAstronaut();&lt;/code&gt;) On the other, I believe that the constraint that does most to force you to "get" OO is this:&lt;blockquote&gt;Don't use any explicit conditionals. Never mind &lt;code&gt;else&lt;/code&gt;, use no &lt;code&gt;if.&lt;/code&gt;&lt;/blockquote&gt; Can you see how that would work? I learned this so long ago that I can't remember where from (by some route from "Big" Dave Thomas, perhaps?) &lt;div&gt;&lt;br /&gt;&lt;div&gt;Oh yes, and for bonus points, Andrew mentions this: "Don’t use any classes with more than two instance variables". I suggest that you try not using any classes that have &lt;span class="Apple-style-span" style="font-style: italic;"&gt;any&lt;/span&gt; instance variables, and see how far you get. You might find that to make progress you need a better language.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6014427293546016580?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6014427293546016580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6014427293546016580&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6014427293546016580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6014427293546016580'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/creation-under-constraints.html' title='Creation Under Constraints'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-4107090231340523676</id><published>2008-04-19T16:55:00.002+01:00</published><updated>2008-04-19T17:20:39.866+01:00</updated><title type='text'>Pedanto-linguistics</title><content type='html'>So, there's a couple of systems that I've been using fairly intensively in the last couple of months, both concerned with the programme for Agile 2008 (which is looking pretty good, BTW). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of them complains if one tries to browse certain URLs without having first logged in. In that case it tells me "You are not authorized to access this page". Which irks me every time I see it, because of course I &lt;span class="Apple-style-span" style="font-style: italic;"&gt;am&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt; &lt;/span&gt;authorized to access that page, I just haven't yet presented the credentials that tell the system so. Which is what the system should invite me to do, rather than telling me to get hence.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other system allows collaborative editing of documents and shows who last edited each file. When I am the person who last edited the file it says that the editor was "me". Which should, of course, be "you".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sort of thing is a small, but I think under-appreciated, source of the discomfort that many people feel when using IT systems. We (I write as an implementor of systems) should be more careful in this regard.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-4107090231340523676?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/4107090231340523676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=4107090231340523676&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4107090231340523676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4107090231340523676'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/pedanto-linguistics.html' title='Pedanto-linguistics'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1532184177228335103</id><published>2008-04-07T13:15:00.003+01:00</published><updated>2008-04-07T17:43:31.188+01:00</updated><title type='text'>Why bzr?</title><content type='html'>I've long been a (very contented) &lt;a href="http://www.perforce.com/"&gt;P4&lt;/a&gt; user, both at work and at home. It's less than great to be emailing patches around, though. As I've been doing more work on &lt;a href="http://www.keithbraithwaite.demon.co.uk/professional/software/index.html"&gt;measure&lt;/a&gt; I've found that I want more and more to do version controlled work on the same code here, there and everywhere. So, the new burst of interest in DVCS's has come along at just the right time.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've chosen &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt; as my first DVCS. &lt;a href="http://egarson.blogspot.com/"&gt;Ed&lt;/a&gt; asked me why, and the answer turned out to be quite interesting (to me).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Firstly, why not &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt;? Well, I am in general not a member of the linux world mainly because computers are for me (these days, anyway) a means not an end. I no longer enjoy installing this and (re)configuring that and (re)compiling the other just for the sheer joy of using up cycles and feeling as if I know something that others don't. Nor for squeezing out the last scintilla of performance, nor whatever it is that the 1337 do these days. I want a computer to do &lt;span class="Apple-style-span" style="font-style: italic;"&gt;pretty much&lt;/span&gt; what I need out-of-the-box. That's why I'm a Mac user. So the idea that git provides the "plumbing" and then the "porcelain" (&lt;span class="Apple-style-span" style="font-style: italic;"&gt;nice&lt;/span&gt; metaphor...) is built on top, well I'm bored already.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What does that leave? I head that &lt;a href="http://darcs.net/"&gt;darcs&lt;/a&gt; has these nasty performance cliffs that it falls off of, so no dice there. I have heard good things about Bazaar (specifically, that &lt;a href="http://nat.truemesh.com/"&gt;Nat&lt;/a&gt; likes it) so I'll go with that for now. So far, I really like it. Setting up exactly the distributed topology I need with the protections I want is proving to be a bit of a challenge, and the documentation seems to assume that I'm very familiar with...something...that I seem not to be (and I can't quite figure out what it is to go learn it, either), but so far so good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I find myself a bit disappointed, though, that the FOSS crew have run quite so hard and fast with this. It's kind of a shame that people like Ed and myself can semi-legitimately get involved in a conversation about which DVCS and why. Summed over all the people like Ed and myself that's &lt;a href="http://www.ada-france.org/debian/distributed-version-control-systems.html"&gt;a lot&lt;/a&gt; of &lt;a href="http://www.russellbeattie.com/blog/distributed-revision-control-systems-git-vs-mercurial-vs-svn"&gt;mental energy&lt;/a&gt; being poured down a black hole, across the industry as a whole. Especially since it seems as if there is &lt;a href="http://changelog.complete.org/posts/528-Whose-Distributed-VCS-Is-The-Most-Distributed.html"&gt;almost&lt;/a&gt; nothing to choose between these tools. If only a strong industry player could have set the scene against which others could vary, but &lt;a href="http://www.bitkeeper.com/"&gt;BitKeeper&lt;/a&gt; didn't (thinks: how much of this mess is really about sticking it to &lt;del&gt;Larry McVoy&lt;/del&gt; "the man"?), and git hasn't, and now we have a soup of peers and all these nugatory factors to consider. What a waste.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: especially irksome is that I once had the pleasure of working with VisualAge for Java Micro Edition, which got all this &lt;a href="http://ciclamino.dibe.unige.it/XP2000/summaries/GammaSummary.htm"&gt;pretty much exactly righ&lt;/a&gt;t a good long time ago.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1532184177228335103?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1532184177228335103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1532184177228335103&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1532184177228335103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1532184177228335103'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/why-bzr.html' title='Why bzr?'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-4831622825719138185</id><published>2008-04-05T12:27:00.002+01:00</published><updated>2008-04-05T12:29:39.245+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='examples'/><title type='text'>Pols' Perfect Purchaser</title><content type='html'>Andy Pols &lt;a href="http://pols.co.uk/archives/172"&gt;tells a great story&lt;/a&gt; about just how great it can be to have your customer 1) believe in testing and 2) completely engage in your development activities. Nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-4831622825719138185?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/4831622825719138185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=4831622825719138185&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4831622825719138185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/4831622825719138185'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/pols-perfect-purchaser.html' title='Pols&apos; Perfect Purchaser'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6162410610955953810</id><published>2008-04-05T12:13:00.003+01:00</published><updated>2008-04-05T12:19:23.914+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='liveness'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='examples'/><category scheme='http://www.blogger.com/atom/ns#' term='direct manipulation'/><title type='text'>Subtext continues to amaze</title><content type='html'>I just watched the &lt;a href="http://subtextual.org/subtext2.html"&gt;video&lt;/a&gt; describing the latest incarnation of Subtext. The video shows how the liveness, direct manipulation and example–based nature of this new table–based Subtext makes the writing and testing of complex conditionals easy.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you develop software in a way that makes heavy use of &lt;a href="http://exampler.com/"&gt;examples&lt;/a&gt; and &lt;a href="http://fit.c2.com/wiki.cgi?IntroductionToFit"&gt;tables&lt;/a&gt;, you owe it to yourself to know about Subtext.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6162410610955953810?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6162410610955953810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6162410610955953810&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6162410610955953810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6162410610955953810'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/subtext-continues-to-amaze.html' title='Subtext continues to amaze'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-1618434816219615822</id><published>2008-04-05T11:14:00.003+01:00</published><updated>2008-04-05T11:46:44.994+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><title type='text'>A Catalogue of Weaknesses in Python</title><content type='html'>You may have read &lt;a href="http://blog.plover.com/2006/09/11/"&gt;somewhere&lt;/a&gt; that "Patterns are signs of weakness in programming languages", and perhaps even &lt;a href="http://norvig.com/design-patterns/ppframe.htm"&gt;that&lt;/a&gt; "16 of 23 [GoF] patterns are either invisible or simpler [in Lisp]", from which  some conclude that dynamic languages don't have/need patterns, or some such.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interesting, then, that a recent Google dev day presentation (&lt;a href="http://www.aleax.it/gdd_pydp.pdf"&gt;pdf&lt;/a&gt;, &lt;a href="http://youtube.com/watch?v=0vJJlVBVTFg"&gt;video&lt;/a&gt;) provides us with a list of &lt;del&gt;terrible weaknesses&lt;/del&gt; great patterns in Python.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-1618434816219615822?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/1618434816219615822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=1618434816219615822&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1618434816219615822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/1618434816219615822'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/catalogue-of-weaknesses-in-python.html' title='A Catalogue of Weaknesses in Python'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6873591104903853638</id><published>2008-04-04T16:10:00.002+01:00</published><updated>2008-04-04T16:14:23.275+01:00</updated><title type='text'>Language</title><content type='html'>Steve Freeman &lt;a href="http://www.m3p.co.uk/blog/2008/03/14/its-really-about-language/"&gt;ponders&lt;/a&gt; if maybe the reason that I find &lt;a href="http://peripateticaxiom.blogspot.com/search/label/test-first%20complexity"&gt;statistical properties&lt;/a&gt; that seem to resemble &lt;a href="http://en.wikipedia.org/wiki/Zipf's_law"&gt;those of natural languages&lt;/a&gt; in the code of &lt;a href="http://jmock.org/"&gt;jMock&lt;/a&gt; is because jMock was written to be like a language...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6873591104903853638?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6873591104903853638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6873591104903853638&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6873591104903853638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6873591104903853638'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/language.html' title='Language'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3184826329276029406</id><published>2008-04-04T15:47:00.005+01:00</published><updated>2008-04-04T16:07:01.754+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spa 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='conferences'/><title type='text'>Some Spa 2008 Stuff</title><content type='html'>Chris Clarke has made a post &lt;a href="http://squadlimber.com/chris/2008/04/04/ignoring-common-coding-practice-why-you-should-be-too/"&gt;here&lt;/a&gt; exploring the ideas that Ivan Moore and I presented at our &lt;a href="http://www.spaconference.org/cgi-bin/wiki.pl/?SpaTwoThousandAndEightOutput"&gt;Spa 2008&lt;/a&gt; workshop &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Programming as if the Domain Mattered&lt;/span&gt;. Ivan has written up some of his learnings from the session &lt;a href="http://ivan.truemesh.com/archives/000733.html"&gt;here&lt;/a&gt;. I'll be doing the same myself soon. &lt;div&gt;Chris makes this most excellent point:&lt;blockquote&gt;I wish people would be a bit braver and use the code to express what they are trying to do and not worry about whether the way they are doing it is against Common Practice. Remember, the majority of software projects are still failures, so why follow Common Practice - it isn’t working!&lt;/blockquote&gt;Quite.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In other news, my experience report on the effects of introducing checked examples (aka automated acceptance/functional/user/whatever "tests")  gets &lt;a href="http://iamasoftie.blogspot.com/2008/04/automated-testing-experience.html"&gt;this&lt;/a&gt; thorough write up from "Me" (who are you, Me?) and also a mention in &lt;a href="http://blog.nayima.be/2008/03/24/spa-2008-2/"&gt;this one&lt;/a&gt; from Pascal Van Cauwenberghe.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks, folks.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3184826329276029406?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3184826329276029406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3184826329276029406&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3184826329276029406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3184826329276029406'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/some-spa-2008-stuff.html' title='Some Spa 2008 Stuff'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-314022802356741358</id><published>2008-04-04T12:12:00.003+01:00</published><updated>2008-04-04T17:00:58.385+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><title type='text'>Design Patterns of 1994</title><content type='html'>So, Mark Dominus' &lt;a href="http://blog.plover.com/2006/09/11/"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Design Patterns of 1972&lt;/span&gt;&lt;/a&gt; has made it back to the front page of proggit.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He offers a pattern-styled write up of the idea of a "subroutine" and opines that:&lt;blockquote&gt;Had the "Design Patterns" movement been popular in 1960, its goal would have been to train programmers to recognize situations in which the "subroutine" pattern was applicable, and to implement it habitually when necessary&lt;/blockquote&gt;which would have been disastrous. Also:&lt;blockquote&gt;If the Design Patterns movement had been popular in the 1980's, we wouldn't even have C++ or Java; we would still be implementing Object-Oriented Classes in C with structs&lt;/blockquote&gt;Actually, I think not. Because we &lt;span class="Apple-style-span" style="font-style: italic;"&gt;did&lt;/span&gt; have patterns in the 1990's and, guess what, programming language development &lt;span class="Apple-style-span" style="font-style: italic;"&gt;did not cease&lt;/span&gt;. Not even in C++.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-314022802356741358?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/314022802356741358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=314022802356741358&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/314022802356741358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/314022802356741358'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/04/design-patterns-of-1994.html' title='Design Patterns of 1994'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-680051728439511281</id><published>2008-03-23T19:15:00.004Z</published><updated>2008-03-23T19:41:29.131Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='test-first complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Debunking Debunking Cyclomatic Complexity</title><content type='html'>Over at SDTimes, &lt;a href="http://www.sdtimes.com/content/article.aspx?ArticleID=31820"&gt;this article&lt;/a&gt; by &lt;a href="http://binstock.blogspot.com/"&gt;Andrew Binstock&lt;/a&gt; contains a claim that &lt;a href="http://www.enerjy.com/blog/?p=241"&gt;this&lt;/a&gt; result by Enerjy somehow "debunks" &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;cyclomatic complexity&lt;/a&gt; as an indicator of problems in code. He suggests that what's shown is that for low complexity &lt;span class="Apple-style-span" style="font-style: italic;"&gt;of methods&lt;/span&gt; (which is &lt;a href="http://peripateticaxiom.blogspot.com/2006/05/complexity-and-test-first-0.html"&gt;overwhelmingly&lt;/a&gt; the most common kind of complexity of methods) increasing complexity of methods is not (positively) correlated with the likelihood of defects. Binstock suggests that:&lt;blockquote&gt;What Enerjy found was that routines with CCNs of 1 through 25 did not follow the expected result that greater CCN correlates to greater probability of defects.&lt;/blockquote&gt;Not so. What Enerjy say their result concerns is:&lt;blockquote&gt;the correlation of Cyclomatic Complexity (CC) values at the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;file&lt;/span&gt; level [...] against the probability of faults being found &lt;span class="Apple-style-span" style="font-style: italic;"&gt;in those files&lt;/span&gt; [...]). [my emphasis]&lt;/blockquote&gt;It's interesting all by itself that there's a sweet spot for the total complexity of the code in a file, which for Java pretty much means all the methods in a class. However, Binstock suggests that&lt;blockquote&gt;[...] for most code you write, CCN does not tell you anything useful about the likelihood of your code’s quality.&lt;/blockquote&gt;Which it might not if you only think about it as a number attached to a single method, and that there are no methods of high complexity. But there are methods of high complexity—and they are likely to put your class/file into the regime where complexity &lt;span style="font-style:italic;"&gt;is&lt;/span&gt; shown to correlate with the likelyhood of defects. Watch out for them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-680051728439511281?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/680051728439511281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=680051728439511281&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/680051728439511281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/680051728439511281'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/03/debunking-ebunking-cyclomatic.html' title='Debunking Debunking Cyclomatic Complexity'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-2347750309358558772</id><published>2008-03-21T16:02:00.005Z</published><updated>2008-03-21T16:31:26.887Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Red and Green</title><content type='html'>Brian Di Croce sets out &lt;a href="http://blog.briandicroce.com/2008/03/14/three-index-cards-to-easily-remember-the-essence-of-test-driven-development/"&gt;here&lt;/a&gt; to explain TDD in three index cards. It's a nice job, except that I'm not convinced by the faces on his last card.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Brian shows a sad face for the &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar, a happy face for the &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt;, and a frankly delirious face for the refactoring step. There's something subtly wrong with this. We are told that &lt;span class="Apple-style-span" style="font-style: italic;"&gt;when the bar is &lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;green&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt; the code is clean&lt;/span&gt;, which is great. But the rule is that we only add code to make a failing test pass, which implies a &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar. So, the &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar is our friend!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I teach TDD I teach that &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt; bar time is something to get away form as soon as possible. Almost all the time a &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt; bar occurs when a development episode is incomplete: not enough tests have been written for the functionality in hand, more functionality is expected to go into the next release, or some other completeness condition is not met. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's hard to learn form a &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt; bar,  but a &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar almost always teaches you something. Experienced TDDer's are very (and rightly) suspicious of a &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt;-to-&lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt; transition. The &lt;span class="Apple-style-span" style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt; bar gives a false sense of security.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Generally speaking, in order to get paid we need to move an implementation forward, and that can only be done on a &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar. Wanting to get to the next &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar is a driver for exploring the functionality and the examples that will capture it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tell people to welcome, to embrace, to seek out the &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt; bar. And that&lt;a href="http://c2.com/cgi/wiki?RedBarTime"&gt; &lt;/a&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://c2.com/cgi/wiki?RedBarTime"&gt;when the bar is &lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://c2.com/cgi/wiki?RedBarTime"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://c2.com/cgi/wiki?RedBarTime"&gt;, we're forging ahead&lt;/a&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-2347750309358558772?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/2347750309358558772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=2347750309358558772&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2347750309358558772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/2347750309358558772'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/03/red-and-green.html' title='Red and Green'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-6136680820626134938</id><published>2008-03-13T16:43:00.004Z</published><updated>2008-03-14T22:37:04.432Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='test-first complexity'/><title type='text'>TDD at QCon</title><content type='html'>Just finished a presentation of the current state of my &lt;a href="http://peripateticaxiom.blogspot.com/search/label/test-first%20complexity"&gt;TDD metrics thinking&lt;/a&gt; at &lt;a href="http://jaoo.dk/london-2008/conference/"&gt;QCon&lt;/a&gt;. The &lt;a href="http://jaoo.dk/london-2008/file?path=/qcon-london-2008/slides//KeithBraithwaite_MeasureForMeasure.pdf"&gt;slides&lt;/a&gt; [pdf] are up on the conference site, video should be there soon, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-6136680820626134938?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/6136680820626134938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=6136680820626134938&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6136680820626134938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/6136680820626134938'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/03/tdd-at-qcon.html' title='TDD at QCon'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3394948600289422662</id><published>2008-03-08T12:29:00.004Z</published><updated>2008-03-11T20:23:32.106Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gauges'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Tests and Gauges</title><content type='html'>At the recent Unicom conference re Agility and business value I &lt;a href="http://www.keithbraithwaite.demon.co.uk/professional/presentations/#testing"&gt;presented&lt;/a&gt; on a couple of cases where I'd seen teams get real, tangible, valuable...value from adopting user/acceptance/checked-example type testing. &lt;a href="http://blog.davidpeterson.co.uk/"&gt;David Peterson&lt;/a&gt; was also presenting. He's the creator of &lt;a href="http://www.concordion.org/"&gt;Concordion&lt;/a&gt;, an alternative to Fit/Library/nesse. Now, David had a look at some of my examples and didn't like them very much. In fact, they seemed to be the sort of thing that he found that Fit/etc encouraged, of which he disapproved and to avoid which he created Concordion in the first place. Fair enough. We tossed this back and forth for a while, and I came to an interesting realization. I would in fact absolutely agree with David's critique of the Fit tests that I was exhibiting, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;if&lt;/span&gt; I though that they were for the purpose that David thinks his Concordion tests are for. Which probably means that any given project should probably have both. But I don't think that, so I don't.&lt;br /&gt;&lt;h2&gt;Turning the Tables&lt;/h2&gt;David contends that Fit's table–oriented approach affords large tests, with lots of information in each test. He's right.  I like the tables because most of the automated testing gigs that I've done have involved financial trading systems and the users of those eat, drink, and breath spreadsheets. I love that I can write a fixture that will directly parse rows off a spreadsheet built by a real trader to show the sort of thing that they mean when they say that the proposed system should &lt;span class="Apple-style-span" style="font-style: italic;"&gt;blah blah blah&lt;/span&gt;. The issue that David sees is that these rows probably contain information that is, variously: redundant, duplicated, irrelevant, obfuscatory and various other epithets. He's right, often they do. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What David seems to want is a larger number of smaller, simpler tests. I don't immediately agree that more, simpler things to deal with all together is easier than fewer, more complex things, but that's another story. And these smaller, simpler tests would have the principle virtue that they more nearly capture a single functional dependency. That's a good thing to have. These tests would capture all and only the information required to exercise the function being tested for. This would indeed be an excellent starting point for implementation. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's only one problem: such tests are further away from the users' world and close to the programmers' . All that stuff about duplication and redundancy is programmer's talk. And that's fair enough. And its not enough. I see David's style of test as somewhat intermediate between unit tests and what I want, which is executable examples in the users' language. When constructing these small, focussed tests we're already doing abstraction, and I don't want to make my users do that. Not just yet, anyway.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So then I realised where the real disagreement was. The big, cumbersome, Fit style tests are very  likely too complicated and involved to be a good starting point for development. And I don't want them to be that. If they are, as I've suggested, &lt;a href="http://peripateticaxiom.blogspot.com/2007/09/gauges.html"&gt;gauges&lt;/a&gt;, then they serve only to tell the developers whether or not their users' goals have been met. The understanding of the domain required to write the code will, can (should?) come from elsewhere. &lt;/div&gt;&lt;h2&gt;Suck it and See&lt;/h2&gt;And this is how gauges are used in fabrication. You don't work anything out from a gauges. What you do is apply it to see if the workpiece is within tolerance or not. And then you trim a bit off, or build a bit up, or bend it a bit more, or whatever, a re–apply the gauge. And repeat. And it doesn't really matter how complicated an object the gauge itself is (or how hard it was to make—and it's really hard to make good gauges), because it is used as if it were both atomic and a given. It's also &lt;span class="Apple-style-span" style="font-style: italic;"&gt;made&lt;/span&gt; once, and used again and again and again and again...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Until this very illuminating conversation with David I hadn't really fully realised myself quite the full implications of the gauge metaphor. It actually implies something potentially quite deep about how these artifacts are built, used and managed. Something I need to think about some more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, and when (as we should) we start to produce  exactly those finer–grained, simpler, more focussed tests that David rightly promotes, and we find out that the users' understanding of their world is all denormalised and stuff, what interesting conversations we can have with them then about how their world really works, it turns out. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Might even uncover the odd &lt;a href="http://www.joeydevilla.com/2001/12/03/4419/"&gt;onion in the varnish&lt;/a&gt;. But let's not forget that having the varnish (with onion) is more valuable to them than getting rid of the onion.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3394948600289422662?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3394948600289422662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3394948600289422662&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3394948600289422662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3394948600289422662'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/03/tests-and-gauges.html' title='Tests and Gauges'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-3829350219577927414</id><published>2008-02-21T23:09:00.002Z</published><updated>2008-02-21T23:17:32.429Z</updated><title type='text'>Curiously Apt</title><content type='html'>A friend is embarking upon a conversion MSc into the wonderful world of software development. He's become interested in the currently &lt;span class="Apple-style-span" style="font-style: italic;"&gt;en vogue &lt;/span&gt;paradigms of programming, their relationships and future. It seems to him (he says) that OO is very much about standing around a whiteboard with your friends, sipping a tall skinny latte while your pizza goes cold. And by contrast  functional programming is like sitting alone, crying into your gin with your head held in your hands over some very, very, hard maths. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Perceptive. He'll go far. And not just because he's already had this other successful career dealing with actual customers (which should be a stronger prerequisite for becoming a commercial developer than any of that comp sci stuff).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-3829350219577927414?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/3829350219577927414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=3829350219577927414&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3829350219577927414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/3829350219577927414'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/02/curiously-apt.html' title='Curiously Apt'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-23912478.post-7408364444355379219</id><published>2008-02-18T18:08:00.003Z</published><updated>2008-02-18T22:03:41.899Z</updated><title type='text'>Compiler Warnings</title><content type='html'>This Daily &lt;a href="http://thedailywtf.com/Articles/Fixing-Compiler-Warnings.aspx"&gt;WTF&lt;/a&gt; reminded me of a less than glorious episode from my programming past. At a company that shall remain namless (and doesn't exist anymore) I was working on a C++ library to form part of a much larger application.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One fine day a colleague came stomping (that's the only verb that suits) over to my desk and boldly announced that "your code has crashed my compiler".  Somewhat alarmed at this I scurried (yes, scurried) back to his desk. "Look" he said, and did a little cvs/make dance. Lo and behold, when the compiler got to my code indeed it fell to silently chugging away. "See," he resumed, "it's crashed." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"No," I said, "it's just compiling." &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"So where," he asked, "are the messages?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"What messages?" I replied. He scrolled the xterm up a bit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"These. All the warnings and stuff"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Doesn't generate any," I said.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He boggled. "What, have you found some way of turning them off?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"No," I said, "I just wrote the code so that it doesn't generate any warnings."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He boggled some more. "Why," he eventually managed to gasp, "would you bother doing that?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I didn't last long there. It was best for all concerend, really.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/23912478-7408364444355379219?l=peripateticaxiom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://peripateticaxiom.blogspot.com/feeds/7408364444355379219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=23912478&amp;postID=7408364444355379219&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7408364444355379219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/23912478/posts/default/7408364444355379219'/><link rel='alternate' type='text/html' href='http://peripateticaxiom.blogspot.com/2008/02/compiler-warnings.html' title='Compiler Warnings'/><author><name>keithb</name><uri>http://www.blogger.com/profile/14314542307822401015</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
