<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Dan North &#38; Associates</title>
	<atom:link href="http://dannorth.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://dannorth.net</link>
	<description>faster organizations, faster software</description>
	<lastBuildDate>Sat, 16 Mar 2013 08:59:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='dannorth.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/ad45a8cc49d496b40ec481454b492108?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Dan North &#38; Associates</title>
		<link>http://dannorth.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dannorth.net/osd.xml" title="Dan North &#38; Associates" />
	<atom:link rel='hub' href='http://dannorth.net/?pushpress=hub'/>
		<item>
		<title>Accelerating Agile</title>
		<link>http://dannorth.net/2013/01/15/accelerating-agile/</link>
		<comments>http://dannorth.net/2013/01/15/accelerating-agile/#comments</comments>
		<pubDate>Tue, 15 Jan 2013 13:09:35 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[effectiveness-patterns]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=1018</guid>
		<description><![CDATA[A curious phenomenon At the end of 2009 I left the world of agile delivery and consulting to join a small team in a trading firm. I was member number three. The team grew to five in the next few weeks. This team was the most insanely effective delivery machine I&#8217;ve ever been a part [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=1018&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h3>A curious phenomenon</h3>
<p>At the end of 2009 I left the world of agile delivery and consulting to join a small team in a trading firm. I was member number three. The team grew to five in the next few weeks. This team was the most insanely effective delivery machine I&#8217;ve ever been a part of. A handful of programmers sitting in amongst a handful of traders, producing state-of-the-art trading systems &#8211; with all the integration pain (back office, risk management, connecting to electronic exchanges) that involves &#8211; in <em>weeks</em>. Not months, weeks. This is, of course, impossible.</p>
<p>They were doing it without following any of the agile practices that enable teams to perform, or &#8220;hyper-perform&#8221; if you believe the, um, hype. They weren&#8217;t doing TDD religiously. Some, but not religiously. They didn&#8217;t use continuous integration (!). They pretty much worked in silos &#8211; each person was responsible for one part of the stack, although the team had stand-ups so they all knew what was going on. They didn&#8217;t have a backlog. They certainly didn&#8217;t estimate stories or do release or even iteration planning. In fact they didn&#8217;t use iterations. And yet they were still delivering very high quality software, and their crazy pace was sustainable! This is, of course, impossible.</p>
<p>Coupled with all this, they had a management team &#8211; right up to the director of development &#8211; who got it. Which meant none of my super-powers worked. My ability to scale huge political hurdles with a single coffee was useless. I would push on heavy-looking organizational doors and they would simply fly open. There was a culture of trust and integrity that I hadn&#8217;t seen before. They even had an explicitly-stated policy of &#8220;no assholes.&#8221; And this was in a company of over 400 people operating in several timezones. This is, of course, impossible.</p>
<h3>Getting my bearings</h3>
<p>I went into what I can only describe as culture shock. I needed to either figure out what was going on here or just click my heels and head back to Kansas, where I at least understood the rules. So I decided to start observing and trying to articulate what was going on. That decision was three years ago. Since then I&#8217;ve been talking about this phenomenon using various names to describe it. Naming things is hard. To start with I called it Patterns of Effective Delivery, which required me to define the words <em>delivery</em>, <em>effective</em> and <em>patterns</em>. Surprisingly tricky, especially <em>delivery</em>.</p>
<p>Then I simplified it, calling it &#8220;Faster Software Delivery.&#8221; That didn&#8217;t last long, especially since I realized that one thing these guys weren&#8217;t delivering was software. They would solve complex business problems using tiny little apps and services &#8211; way smaller than the usual behemoths I was used to working with. No, software wasn&#8217;t the thing they were delivering &#8211; business capability was what they were delivering, using the smallest amount of software they could. &#8220;Faster Business Capability Delivery&#8221; doesn&#8217;t even sound right, so that wasn&#8217;t it.</p>
<p>Then I stepped back to look at what they were really doing. They were reducing the cycle time of delivering business capability from months to days. They were using agile <em>values</em> without being slaves to any of the big-A Agile <em>practices</em>. They really did value collaboration over contract negotiation. Their customers &#8211; the traders &#8211; were on the same side as them rather than across the table negotiating scope or delivery dates. They really did value working software over comprehensive documentation &#8211; although they would comprehensively document where it was necessary because they didn&#8217;t <em>not</em> value documentation. They really did value responding to change over following a plan. And they really did listen to one another and value each other&#8217;s opinions over any process or tool. Maybe this was what the Agile Manifesto was on about all along.</p>
<h3>Sharing the love</h3>
<p>So now I&#8217;m calling it <a title="Accelerated Agile" href="http://dannorth.net/courses/accelerated-agile">Accelerated Agile</a>. When I first started talking about Patterns of Effective Delivery in 2010, I had observed 11 patterns I wanted to share &#8211; by which I mean repeatable strategies that work in a given context and that resolve various forces while introducing others. Not a recipe or a guaranteed outcome &#8211; just a pattern. I now have nearly thirty, so it&#8217;s time to write a book.</p>
<p>In the meantime &#8211; and here&#8217;s the selly bit &#8211; I&#8217;ve gone independent and I&#8217;m running training courses in a number of places over the next few weeks and months. There are one, two and three day versions, going increasingly deeper into the material. More details are available <a title="on my site" href="http://dannorth.net/courses/accelerated-agile">on my site</a>. I&#8217;m also going to be speaking at numerous conferences around the place.</p>
<p>The main reason I&#8217;m doing this is to learn. If you see me at a conference and any of the Accelerated Agile material resonates with you (&#8220;but we&#8217;ve been doing that for ages!&#8221;) then I&#8217;d love to hear from you. Where did it work? Where <em>didn&#8217;t</em> it work? I want the disasters as well as the success stories, otherwise it isn&#8217;t a pattern, it&#8217;s a sales gimmick.</p>
<p>I&#8217;m very excited about this &#8211; I really think it&#8217;s significant. The more I talk to people, the more it seems there&#8217;s a sea change occuring in the agile world. We&#8217;ve hit a local maximum with all the methodologies that came out of the 1990s. The context has changed, and many of us no longer have the huge, heavy organizational constraints of that decade. It&#8217;s time for a different kind of agile. It&#8217;s time to accelerate.</p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/effectiveness-patterns/'>effectiveness-patterns</a>, <a href='http://dannorth.net/category/programming/'>programming</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/1018/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/1018/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/1018/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/1018/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/1018/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/1018/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/1018/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/1018/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=1018&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2013/01/15/accelerating-agile/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>Under new management</title>
		<link>http://dannorth.net/2012/08/14/under-new-management/</link>
		<comments>http://dannorth.net/2012/08/14/under-new-management/#comments</comments>
		<pubDate>Tue, 14 Aug 2012 22:28:25 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[career]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=884</guid>
		<description><![CDATA[I am delighted to announce my new independent consulting company, Dan North &#38; Associates, which has the handy abbreviation of DNA. Take a look around the new website &#8211; I&#8217;d love to hear your feedback and suggestions, especially in terms of the direction I&#8217;m taking. Going independent has been on the cards for a while now, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=884&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I am delighted to announce my new independent consulting company, <a title="Dan North &amp; Associates" href="http://dannorth.net/">Dan North &amp; Associates</a>, which has the handy abbreviation of DNA. Take a look around the new website &#8211; I&#8217;d love to hear your feedback and suggestions, especially in terms of the direction I&#8217;m taking. Going independent has been on the cards for a while now, and the timing feels right after successfully carrying out a Lean transformation programme with my current employer, DRW Trading.</p>
<h3>Moving on</h3>
<p>Eighteen months ago I embarked on a three month experiment with CIO Seth Thomson to see if we could pair on a change programme across DRW IT, with me in London and him and his team in Chicago. In that time we&#8217;ve been applying ideas from Lean operations and Theory of Constraints to improve turnaround and communication across the firm&#8217;s IT group. We started small, with a book club looking at Agile project management via throughput accounting to Eli Goldratt&#8217;s classic <em>The Goal</em>. This led us to implement a programme of coaching, workshops and one-on-one sessions and we embedded specialists in various cross-functional teams. This in turn led to a shift in focus so that ideas and innovations for process change are coming from people on the ground rather than from Seth or myself. So, eighteen months into our three month experiment, we are just where we wanted to be, and it&#8217;s time for me to do something else.</p>
<p>In many ways it&#8217;s been a dream gig. I&#8217;ve seen too many change programmes fail due to management inertia or even active sabotage. DRW Trading is blessed with the kind of enlightened and open-minded management team that doesn&#8217;t exist in the real world. Working with the triumvirate of Seth as CIO, Derek Groothuis as Director of Software Engineering and Lyle Hayhurst as CTO has been a fun, enlightening, invigorating ride and I&#8217;ll be sad to leave them, as well as a lot of insanely talented folks. I expect I&#8217;ll still be visiting from time to time.</p>
<h3>Open for business</h3>
<p>I&#8217;m excited about the possibilities for Dan North &amp; Associates. I will be retaining my independence and contrarian outlook. I promise not to run any course with the word &#8220;Certification&#8221; in it. My first public course is <a title="Register now" href="http://foocafe.org/#event-master-class-faster-software-delivery-from-months-to-minutes-dan-north">Faster Software Delivery</a> at <a title="Foo Café" href="http://foocafe.org/">Foo Café</a> at the end of August, and I&#8217;ll be announcing further courses and conference appearances as they shape up.</p>
<p><a title="Drop me a line" href="http://dannorth.net/contact/">Drop me a line</a> if you want to talk about working together. In the meantime I&#8217;ll be adding case studies and other reference material to the site over the coming weeks.</p>
<br />Filed under: <a href='http://dannorth.net/category/career/'>career</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/884/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/884/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/884/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=884&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2012/08/14/under-new-management/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>Published: The art of misdirection</title>
		<link>http://dannorth.net/2012/06/09/published-the-art-of-misdirection/</link>
		<comments>http://dannorth.net/2012/06/09/published-the-art-of-misdirection/#comments</comments>
		<pubDate>Sat, 09 Jun 2012 14:57:07 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[articles]]></category>
		<category><![CDATA[effectiveness-patterns]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=716</guid>
		<description><![CDATA[I&#8217;ve just come back from the excellent NDC 2012 event in Oslo, where they published my article about opportunity cost in The Developer magazine ahead of the conference. The article is now available on my site. Please let me know what you think about it in the comments below. Filed under: agile, articles, effectiveness-patterns, tdd<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=716&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve just come back from the excellent <a title="NDC 2012" href="http://www.ndcoslo.com/">NDC 2012</a> event in Oslo, where they published my article about opportunity cost in The Developer magazine ahead of the conference.</p>
<p>The article is now <a title="The Art of Misdirection" href="/the-art-of-misdirection">available on my site</a>. Please let me know what you think about it in the comments below.</p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/articles/'>articles</a>, <a href='http://dannorth.net/category/effectiveness-patterns/'>effectiveness-patterns</a>, <a href='http://dannorth.net/category/tdd/'>tdd</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/716/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=716&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2012/06/09/published-the-art-of-misdirection/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>BDD is like TDD if&#8230;</title>
		<link>http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/</link>
		<comments>http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/#comments</comments>
		<pubDate>Thu, 31 May 2012 14:47:05 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=699</guid>
		<description><![CDATA[I&#8217;ve noticed a number of people recently declaring that BDD really is just TDD, such as Robert Martin on Twitter and Ron Jeffries on the XP list. I can understand where this mindset comes from and I&#8217;d like to offer my perspective. Is BDD the same as TDD? Yes. If you&#8217;re a programmer, and your entire team is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=699&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve noticed a number of people recently declaring that BDD really is just TDD, such as <a title="@unclebobmartin on Twitter" href="https://twitter.com/unclebobmartin/status/207281653582802944">Robert Martin on Twitter</a> and <a title="BDD and TDD thread" href="http://tech.groups.yahoo.com/group/extremeprogramming/message/157759">Ron Jeffries on the XP list</a>. I can understand where this mindset comes from and I&#8217;d like to offer my perspective.</p>
<p>Is BDD the same as TDD? Yes. If you&#8217;re a programmer, and your entire team is programmers, and all your stakeholders are programmers and you have a single Subject Matter Expert embedded in the team. Which was true of the Chrysler C3 team and other early XP teams. (Take a look at the original C3 team: 10 world-class programmers and an SME.)</p>
<p>BDD is the same thing but for a broader audience: testers, analysts, project and program managers, multiple SMEs covering multiple interrelated domains. It&#8217;s interesting that the BDD == TDD crowd are entirely programmers and necessarily see the world through programmers&#8217; eyes: Bob Martin, Ron Jeffries and others saying &#8220;BDD is just TDD&#8221; is true in the first approximation of &#8220;all delivery people are programmers.&#8221; As soon as that precondition fails, BDD becomes a different, bigger thing: it becomes the communication across all of those stakeholders to create a single coherent vision and deliver to that. This is the value of <a title="Specification by Example" href="http://specificationbyexample.com/">living documentation</a> &#8211; and shows why you don&#8217;t need it until you do: if you&#8217;re in that small team of only-programmers you&#8217;ll be fine with only-TDD.</p>
<p>It can be argued that the team shouldn&#8217;t be anything other than programmers &#8211; in the polyglot roles of tester, analyst, etc. &#8211; in which case BDD and TDD again collapse into the same space. But in the kind of organisations and teams that gave rise to and shaped BDD we have to solve the more complex communication problems that are (by definition) beyond the scope of TDD.</p>
<p>I&#8217;ve been entirely embedded in small teams of programmers for the last couple of years which is why I&#8217;ve taken much more of a back seat in the BDD community. The likes of Liz Keogh, Gojko Adzic and Chris Matts have been where the action is with things like real options and <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Specification_by_example">specification-by-example</a>, and folks like Aslak Hellesøy and Matt Wynne figuring out how to manage large numbers of long-lived tests at scale. Liz recently wrote about <a title="Liz Keogh on BDD language" href="http://lizkeogh.com/2012/05/30/showcasing-the-language-of-bdd/">how shifting the language helps to clarify intent</a>.</p>
<p>Kent Beck describes XP as trying to get business people and technical people on the same page, and I have the same goal for BDD. Don&#8217;t forget TDD is one small part of XP. BDD has grown to be broader than s/test/should/, because it&#8217;s trying to solve a broader problem.</p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/bdd/'>bdd</a>, <a href='http://dannorth.net/category/programming/'>programming</a>, <a href='http://dannorth.net/category/tdd/'>tdd</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/699/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/699/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/699/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=699&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>The rise and rise of JavaScript</title>
		<link>http://dannorth.net/2011/12/19/the-rise-and-rise-of-javascript/</link>
		<comments>http://dannorth.net/2011/12/19/the-rise-and-rise-of-javascript/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 10:30:05 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[history]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=650</guid>
		<description><![CDATA[I&#8217;ve been using JavaScript for a while now, but only really programming in anger with it during the last year. I&#8217;ve found it in turns frustrating and enlightening, ridiculous and brilliant. I have never felt so empowered by a language and its ecosystem, so I thought I&#8217;d take some time to write about why that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=650&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been using JavaScript for a while now, but only really programming in anger with it during the last year. I&#8217;ve found it in turns frustrating and enlightening, ridiculous and brilliant. I have never felt so empowered by a language and its ecosystem, so I thought I&#8217;d take some time to write about why that is. I&#8217;m starting with a ramble through the history of JavaScript, or rather my undoubtedly inaccurate understanding of it, to provide some context for where and how I&#8217;ve been using it.</p>
<p><span id="more-650"></span></p>
<h3>JavaScript the Survivor</h3>
<p>JavaScript has been around for a long time, and it has the scars and stories to prove it. As languages go it has more than its fair share of corner cases, incompatibility issues, frustrations and quirks. It&#8217;s an easy language to knock: it was hit with the same ugly stick as the other curly bracket languages, it&#8217;s more verbose than other dynamic languages like ruby or python, and if you can look at a piece of code and tell me what the value of the implicit <code>this</code> variable will be, well, you should be getting out more. (Ok, I&#8217;m being mean here. Nowadays I usually know what the value of <code>this</code> will be, but let&#8217;s just say it isn&#8217;t exactly obvious to a novice.)</p>
<p>JavaScript had a difficult childhood. It grew up in lawless neighbourhoods surrounded by gangs. It spent a lot of time listening to its parents fighting with one another about what they wanted it to be when it grew up. As any young language would, it tried hard to please its parents (and that barmy committee of uncles, and all the other random people trying to shape its future). As a result it suffers from what can only be described as behavioural quirks. Depending on which gang it&#8217;s hanging out with it will sometimes happily talk to you through its console.log, at other times refuse to say anything, and yet other times it will blow up in your face (but not tell you why).</p>
<p>It has collections, just like the other languages, but no sensible way of traversing them. Instead you are left with the delightful:</p>
<pre class="brush: jscript; light: true; title: ; notranslate">
for (var key in map) {
  if (map.hasOwnProperty(key)) {
    var value = map[key];
    // right, now we can get some work done
  }
}
</pre>
<p>Now you see that <code>var key</code> at the top of the for loop? That&#8217;s not declaring a variable, oh no. It&#8217;s saying that <em>somewhere else</em> there&#8217;s a variable called <code>key</code> (right at the top of the nearest containing function, it turns out). Oh, and that <code>key</code> variable is visible all through that function, and any functions it contains, not just tucked away in the for loop. Brilliant!</p>
<p>So you see, it&#8217;s easy to knock dear old JavaScript. Google has even gone to the trouble of coming up with an <a title="Dart language" href="http://www.dartlang.org/">entire new language</a> for the browser to try to appeal to the Java- and C#-loving, class-conscious (<em>ahem</em>) programmer. But I think they are wrong to do that. All JavaScript needs is some love, and to be treated with a little respect. Sure every now and then it will crap on the bed, but it will also reward you with a wonderful development ecosystem if you make the effort to learn its little ways.</p>
<h3>JavaScript grows up</h3>
<p>During the browser gang wars, several things happened that started bringing peace and unity to browser-based development. JavaScript started to gain a reputation as someone who could smarten up your neighbourhood: it could provide all sorts of excitement and turn your boring old browser into a cool, asynchronous playground. However it still had its behavioural oddities, and the different gangs had virtually their own language for saying the same thing (as gangs do). Doing something in more than one neighbourhood often involved pretty much starting over.</p>
<p>However, a number of the other kids decided JavaScript wasn&#8217;t so damaged that it was beyond help. They realised the gangs were more similar than different and started studying their various quirks. Mediators began to emerge between JavaScript and the various gangs, so you could talk to a mediator and they would figure out what you meant. This was great, except it led to the forming of a new set of gangs. You could join the GWTs or the extjs, the prototypers or the YUIs. But once you&#8217;d chosen your path it proved difficult if not impossible to work with the other mediators. They all had a different idea about how to speak both with the gangs and with JavaScript itself. Some of them wanted to &#8220;protect&#8221; you from JavaScript&#8217;s perceived ugliness, and some even tried to pretend it was a whole other thing (say, class-based OO). Others were content just to talk to the gangs on your behalf and leave you to talk to JavaScript directly.</p>
<p>Then one day a new mediator called <a title="jQuery" href="http://jquery.org/">jQuery</a> appeared on the scene. jQuery wasn&#8217;t like the others. Its designers figured that in the browser you mostly cared about exactly three things: handling events, manipulating the DOM, and talking back to your server, and that if they made those things really easy you could probably figure out the rest, including JavaScript itself. jQuery was game-changing in its elegance. (Don&#8217;t get me wrong, apparently inside the jQuery house is some pretty shocking JavaScript, but luckily no-one ever visits there.) It made use of familiar constructs, like using CSS selectors to identify elements in the DOM, just like you do. It allowed you to treat the DOM as the great big cuddly hierarchical data structure that it is, offering you the functional constructs of internal iterators, filters, chaining and so on. Suddenly the browser felt like it had been tamed.</p>
<p>In the meantime JavaScript had gone into therapy and emerged as ECMAScript, which meant that if you wanted JavaScript in your neighbourhood at least you had a good idea of how it wanted to behave, even if you weren&#8217;t going to let it. This would have been great except it was that barmy committee of uncles that were acting as the therapists, so things moved like treacle. (One of the uncles, Uncle Doug, has some interesting tales about just how slowly things can move). Meanwhile other events were unfolding.</p>
<h3>The browser grows up</h3>
<p>Google, the mighty <span style="text-decoration:line-through;">advertising</span> search company, had been slowly and successfully making inroads into browser-based apps with GMail, Google Docs, Maps and other cool technologies. They even have their own Marauders&#8217; Map. Then a few years ago Google moved into the browser space. I&#8217;m not an industry pundit so I won&#8217;t try to predict what their business strategy was or is, suffice to say it looked like they saw the browser as the platform of the future, and decided they may as well be the dog as the tail.</p>
<p>They were already stretching the browser to the limits of credibility with GMail &#8211; a fully-fledged mail, calendar and contacts app <em>in your browser</em>. They had to invent technologies like Google Gears to provide client-side storage, and then persuade you to install them in your browser (which was a pretty easy sell since it gave you offline mail and document editing <em>in your browser</em>). So they created their own browser, called it Chrome, and then decided to do three very smart things in order to make a consistent, high-performance browsing platform as ubiquitous as they needed it.</p>
<p>Firstly they open sourced their browser so people could see what they were up to. This meant other open source efforts, in particular Firefox, could borrow from their technical innovation, which upped the bar for everyone. (Firefox wasn&#8217;t waiting around either. With each new release of the browser and its Gecko engine came improvements in rendering times and JavaScript processing speed, as well as better support for emerging standards in the various browser technologies.) Secondly they started to push very strongly for clearer standards across browsers, giving rise to the nebulous HTML 5. Certainly there are other major players involved in HTML 5, not least the venerable Yahoo where Uncle Doug lives, but Google&#8217;s involvement created a sense of urgency that was never there before.</p>
<p>Thirdly they realised the browser is more than just a place to render HTML and execute JavaScript. Google Chrome contains a full suite of development tools: a REPL to interact with the JavaScript <em>in the current page</em>, a DOM inspector to traverse the DOM and inspect CSS styles and how they got there (not the DOM that was loaded, but its current state after all your JavaScript manipulations), a network analyser to tell you which page elements are loading (and failing) and how long they took, basically everything the jobbing web developer needs to iterate quickly. Other browsers, notably Firefox, have these available as plugins like Firebug and Web Development tools, but Chrome gives you them out of the box.</p>
<p>Even Microsoft decided they needed to get on board with the new wave of HTML 5. First they started referring to the emerging HTML 5 standards as &#8220;tier 1 supported technologies&#8221; which was heresy to the Microsoft Old Guard. Then they quietly dropped Silverlight, which was their competing not-invented-here browser technology (and which of course only works on Windows). After about 100 years of IE6, they released IE7, IE8 and IE9 in rapid succession, each one faster and more standards compliant than its predecessor (although it&#8217;s fair to say that IE is still the red-headed stepchild of web conformance, but at least they&#8217;re playing the game).</p>
<p>Now HTML 5 is a <em>huge</em> slew of initiatives covering not only CSS, HTML and JavaScript standards but 2d and 3d graphics, full-duplex I/O with WebSockets (and half-duplex with EventSource), sounds, video&#8230; In fact if you stand back and squint you could be forgiven for mistaking the HTML 5 ecosystem for an entire operating system. Whose system language is JavaScript.</p>
<h3>JavaScript on the server</h3>
<p>The next piece of the JavaScript puzzle starts a couple of years ago with a young hacker named Ryan Dahl. He figured we were doing I/O all wrong on the server, and that in today&#8217;s multi-core, highly-concurrent world this was never going to scale.</p>
<p>Mostly we do something like this:</p>
<pre class="brush: java; highlight: [2]; light: true; title: ; notranslate">
context = &quot;today&quot;;      // a local variable
data = file.read();     // synchronously read data
process(data, context); // and process it
</pre>
<p>where the thread doing the read blocks until data has been read from the filesystem and loaded into a buffer. To give some idea of scale, memory is tens or hundreds of times slower than CPU cache (measured in orders of ηs), socket I/O is <em>thousands</em> of times slower than memory I/O (orders of μs), and file and network I/O is <em>thousands</em> of times slower than socket I/O (orders of ms). That means your thread could be doing literally <em>millions</em> of things instead of clogging up the place waiting for some data to come back.</p>
<p>An asynchronous version might look more like this:</p>
<pre class="brush: jscript; highlight: [3,4,5]; light: true; title: ; notranslate">
context = &quot;today&quot;;  // a local variable
file.read(          // ask for some data
  function(data) {           // callback is invoked some time later,
    process(data, context);  // still bound to context
  }
);
</pre>
<p>where the read function immediately returns and allows execution to continue, and at some arbitrary point in the future — when the data is available — that anonymous function is called with a <em>reference to</em> the <code>context</code> variable still available, even if it&#8217;s gone out of scope or changed its value since the call to <code>file.read</code>.</p>
<p>Now this is completely foreign to most server-side programmers. For a start the major languages of C#, Java and C++ are various kinds of useless at bindings and closures — and even Python and Ruby aren&#8217;t big on callbacks — so most server-side programmers aren&#8217;t used to thinking in these terms. Instead they&#8217;re quite happy to spin up a few more threads or fork and join the slow stuff. And this is just the first turtle: What if the <code>process</code> function itself is asynchronous and takes a callback?</p>
<p>However this model is bread and butter to your JavaScript programmer. The entire browser is predicated on a Single Event Loop: There is only one conch shell so if you (or more accurately your function) has it, you can be sure no-one else has. Your concurrent modification woes evaporate. Mutable state can be shared, because it will never be concurrently accessed, even for reading (which is why the whole DOM-in-the-browser thing works so well with event handlers). They are also aware that the price of this is to <em>give back the conch as quickly as you can</em>. Otherwise you bring the whole browser grinding to a halt, and no-one wants that.</p>
<p>So if you&#8217;re going to try to pull off this kind of evented I/O shenanigans on the server, well what better language to use than one where this is the core paradigm? Ryan looked at Google Chrome&#8217;s shiny new V8 JavaScript engine and asked: what would it take to get this running on a server, outside of the browser? To be useful it would need access to the filesystem, to sockets and the network, to DNS, to processes, &#8230; and that&#8217;s probably about it. So he set to work building a server-side environment for V8, and <a title="node.js" href="http://nodejs.org/">node.js</a> was born.</p>
<p>Fast-forward a couple of years and node.js has grown into a credible server-side container. As well as the core container, the node.js ecosystem contains a saner-than-most package manager called npm, and libraries for everything from Sinatra-like web servers, database connectivity, handlers for protocols like IMAP, SMTP and LDAP. In fact I find most of my time is spent coding in the problem domain rather than trying to wire together all the surrounding infrastructure cruft. (Sometimes I find myself deep in a rat hole trying to figure out why a library isn&#8217;t working, but such is the way of open source. At least I can look at the source and add some console debugging.)</p>
<p>It uses native evented I/O on Linux and until recently would only run with an emulated I/O layer on Windows. Until Microsoft got involved. Yes, the mighty Microsoft is actively aiding and sponsoring development of tiny little node.js to try to produce equivalent performance on Windows using its (completely different) native evented I/O libraries.</p>
<p>The current stable branch of node.js is showing bonkers fast performance on both Linux and Windows, and only seems to be getting faster. (The fact that Google&#8217;s V8 team are big fans and are actively considering node.js on the V8 roadmap isn&#8217;t doing any harm either: they suddenly received a slew of bug reports and feature requests as the uptake of node.js pushed the V8 engine in new and unexpected ways.)</p>
<h3>JavaScript everywhere</h3>
<p>And it doesn&#8217;t stop there. JavaScript&#8217;s serialization form, JSON, is becoming ubiquitous as a lighter-weight alternative to XML for streaming structured data, and NoSQL databases like mongo are happily using JSON and JavaScript <em>in the database</em> as a query language. This means, for the first time, you can have the same JavaScript function in the browser, on the server and in the database. Just think for a moment how many times you&#8217;ve written the same input validation or data checking logic in three different technologies? I&#8217;ve not been using any database-side JavaScript in the work I&#8217;ve been doing, but it is an interesting proposition.</p>
<p>Tablets such as the sadly-but-hopefully-not-forever-demised HP TouchPad and the nascent Google ChromeOS tablets are using JavaScript (and node.js!) as a core technology. Instead of targeting a closed platform like iOS you can simply write a web app — possibly taking advantage of other tablet-specific APIs or event sources such as a GPS or accelerometer — and it will Just Work on your tablet device. Now that&#8217;s pretty sweet! Sadly the most open technology is available on the smallest proportion of devices, and vice versa, but you can still reach a lot of people just by writing a slick web application.</p>
<p>One interesting tangent is that a number of folks are considering JavaScript as a <em>compilation target</em> for other languages! (The implication being that JavaScript is so broken that you wouldn&#8217;t want to actually write it, but it&#8217;s ok as a kind of verbose assembler language for the browser.) The Clojure language has recently spawned ClojureScript, which is a compiler that emits JavaScript so you can run Clojure in your browser, and a new language called CoffeeScript has emerged, which is a sort of &#8220;JavaScript, the good parts with a Pythonesque syntax and a nod to Ruby.&#8221; It aligns very closely with JavaScript — you can see exactly how your CoffeeScript expressions turn into the equivalent JavaScript — but lets you get away with less syntax. I used CoffeeScript for a short while, and found that the best thing it gave me was an appreciation of how to stick to the good bits of JavaScript. I expect I&#8217;ll talk more about why I leapt into CoffeScript — and why I then decided to decaffeinate — in my next article.</p>
<h3>And finally&#8230;</h3>
<p>One thing I keep noticing is that by being this late to the JavaScript party, a lot of the lumpier language-level problems have been solved, and solved well. One example is a library called <a title="underscore.js on GitHub" href="http://documentcloud.github.com/underscore/">underscore.js</a> that describes itself as &#8220;the tie to go along with jQuery&#8217;s tux.&#8221; It elegantly provides missing functional idioms like function chaining and the usual suspects of <code>filter</code>, <code>map</code>, <code>reduce</code>, <code>zip</code> and <code>flatten</code>, in a cross-browser and node-compatible way, as well as some useful methods on object hashes like <code>keys</code>, <code>values</code>, <code>forEach</code> and <code>extend</code> (to merge objects) etc. Similarly a library called <a title="async on GitHub" href="https://github.com/caolan/async">async</a> provides clean ways of chaining multiply-nested callbacks, managing multiple fork-joins, firing a function only after so many calls, etc.</p>
<p>As I said at the beginning of this article, I don&#8217;t remember feeling so empowered by a technology, in terms of being able to deliver full-stack applications, as I am by the combination of HTML 5 and server-side JavaScript. It&#8217;s an exciting time to be developing for the browser — and the web — and it&#8217;s never been easier.</p>
<br />Filed under: <a href='http://dannorth.net/category/history/'>history</a>, <a href='http://dannorth.net/category/html5/'>html5</a>, <a href='http://dannorth.net/category/javascript/'>javascript</a>, <a href='http://dannorth.net/category/nodejs/'>nodejs</a>, <a href='http://dannorth.net/category/programming/'>programming</a>, <a href='http://dannorth.net/category/web/'>web</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/650/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/650/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/650/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/650/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/650/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/650/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/650/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/650/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=650&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2011/12/19/the-rise-and-rise-of-javascript/feed/</wfw:commentRss>
		<slash:comments>101</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>Looking back on 2011</title>
		<link>http://dannorth.net/2011/11/20/looking-back-on-2011/</link>
		<comments>http://dannorth.net/2011/11/20/looking-back-on-2011/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 21:05:37 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[effectiveness-patterns]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[people]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[talks]]></category>
		<category><![CDATA[thanks]]></category>
		<category><![CDATA[uncertainty]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=624</guid>
		<description><![CDATA[It&#8217;s November, and it seems I haven&#8217;t posted anything here since January. Partly that&#8217;s because I have a Proper Job™ these days, which means I spend a lot less time writing and blogging. Partly I&#8217;ve rediscovered the joy of actually programming, which means I get to spend most of my time hacking on code. This is something of a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=624&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s November, and it seems I haven&#8217;t posted anything here since January. Partly that&#8217;s because I have a Proper Job™ these days, which means I spend a lot less time writing and blogging. Partly I&#8217;ve rediscovered the joy of actually programming, which means I get to spend most of my time hacking on code.</p>
<p>This is something of a catch-up post, bringing you up-to-date with some of the things I&#8221;ve been up to and some of the topics I intend to be blogging and writing about.<br />
<span id="more-624"></span></p>
<h3>Patterns of Effective Delivery</h3>
<p>Probably the things I&#8217;ve been talking most about are <em>Patterns of Effective Delivery</em>, a topic I&#8217;ll be expanding on over the coming weeks and months, and how the principle of <em>embracing uncertainty</em> seems to underpin most of them. I&#8217;ve done <a href="http://bit.ly/vxnQai">a few talks</a> this year about the patterns, culminating in a <a href="http://bit.ly/vkuRhR">keynote at Øredev 2011</a> which was graphic recorded by the fantastic Nora and Heather at <a href="http://bit.ly/sYodtC">ImageThink</a>:</p>
<h4>Heather&#8217;s version</h4>
<p><a href="http://bit.ly/uU63WE"><img title="Øredev Keynote recorded by Heather" src="http://bit.ly/u97z5q" alt="Øredev Keynote recorded by Heather" width="500" height="354" /></a></p>
<h4>Nora&#8217;s version</h4>
<p><a href="http://bit.ly/t99XJu"><img title="Øredev Keynote recorded by Nora" src="http://bit.ly/tFUMzj" alt="Øredev Keynote recorded by Nora" width="500" height="354" /></a></p>
<h3>Programming</h3>
<p>One of the reasons I left consulting was that I realised I was moving further away from technical delivery and deeper into &#8220;pure&#8221; organisational change, and I really missed actual programming. I was still speaking at conferences and I noticed the stories and examples I was using were becoming less recent. Since joining DRW I&#8217;ve managed to strike a healthy balance between delivery and organisational change. Nowadays I get to code at work. With other people. It&#8217;s great! I&#8217;ve spent this year getting very excited about mixing up OO and functional programming, primarily with Python (I know, talk about late to the party!) and JavaScript (ditto).</p>
<h4>JavaScript</h4>
<p>It&#8217;s been an interesting mind shift going from a statically-typed, class-based, multi-threaded OO environment to a single event loop, dynamic, event-based language that treats functions as first class citizens alongside objects. I&#8217;m intending to write up some of the idioms and techniques I&#8217;ve been learning, discovering and struggling with, and why I think JavaScript is a wonderful and misunderstood technology. With libraries like <a href="http://jquery.org">jQuery</a> providing DOM manipulations in the browser and <a href="http://bit.ly/vAZPuH">underscore.js</a> providing proper functional programming affordances on both client and server, JavaScript really is great fun to work with.</p>
<p>In particular I&#8217;ve been deploying server-side apps into <a href="http://nodejs.org">node.js</a>, the potentially game-changing server-side runtime based on Google Chrome&#8217;s V8 engine. Its inventor <a href="http://bit.ly/tDzszc">Ryan Dahl</a> started with the premise that blocking I/O is wrong, on the basis that most I/O is usually thousands or millions of times slower than the other things your program could be doing. So by taking concerns like threading and I/O off your hands &#8211; in return for you writing callbacks or event handlers - the world becomes a happier place.</p>
<h4>Python</h4>
<p>I also intend to try sharing some of the joy I&#8217;ve found in programming in Python. Quite apart from the freedom of movement that thinking in functions can produce, I want to introduce you to list comprehensions, tuple-unpacking (a.k.a. destructuring), context managers, generators and coroutines &#8211; things that other, cooler languages are boasting about and that Python has quietly been getting on with for years.</p>
<p>I&#8217;ve started describing Python as runnable pseudocode: it&#8217;s become the language I carry around in my back pocket when I want to introduce non-programmers to the power of automation (displacing Ruby, which had been living there for the best part of a decade). It has the ability to quell fear and induce smiles in a way I&#8217;ve rarely seen in other languages. (I vaguely recall feeling the same about the magic <code>it</code> variable in <a href="http://bit.ly/szOeeT">HyperTalk</a> many years ago.)</p>
<h3>Organisational Change</h3>
<p>My current gig involves working with all the non-programmer IT folks in a medium-sized trading firm, introducing ideas from Lean Operations and Theory of Constraints. We&#8217;re doing things like moving the people to the work, identifying and mapping value streams, measuring throughput and effectiveness rather than effort and activity &#8211; ironically all the things I was trying to introduce to my clients when I was a consultant!</p>
<p>So far we&#8217;ve had some encouraging successes. We&#8217;ve taken something like two thirds off the time it used to take to purchase and commission a new server, simply by focusing on reducing the &gt;90% waiting time rather than trying to optimise the &lt;10% of activity that was already pretty slick! (In my experience those numbers are fairly typical: when you first apply value stream mapping to a traditional process you often find well over 90% f the cycle time is lost in hand-offs and waiting.) The manager who owns the server commissioning process managed to chop one third off the time just by making two simple changes to the process. Talk about quick wins!</p>
<p>But the best part of this gig is that everyone is open to trying these ideas. Not just the people on the ground or their line managers, but right up to the CIO and CTO, people are not only receptive but are actively exploring ways to enable their organisation and challenge existing thinking. Most of my time and energy in Big Enterprise consulting involved trying to influence senior managers to think differently and embrace some of these ideas. It was exhausting. These days I find I can just get on with it: When I push on a closed door it usually flies open at the slightest touch. I&#8217;m still adjusting to that after nearly two years!</p>
<p>One of my plans is to write up some of my experiences introducing organisational change in this environment. I remember reading Esther Derby and Johanna Rothman&#8217;s excellent <a href="http://bit.ly/v1TSCL">Behind Closed Doors</a>, a management book that uses an experienced manager as a vehicle to illustrate how good leadership and team management <em>can</em> work. Many management books spend a lot of time advising on how to tolerate, subvert or otherwise handle toxic organisations. Esther and Johanna&#8217;s approach on the other hand was to invent a great manager in a grown-up organisation and use him to describe the art of the possible. I&#8217;d like to try something similar with organisational change: I haven&#8217;t seen much literature about how to operate when <em>everyone wants you to succeed</em>. I promise you, it&#8217;s a very different experience!</p>
<h3>I&#8217;d like to thank&#8230;</h3>
<p>This has been an interesting year for me in terms of meeting or reconnecting with people who have been influencing my thinking. I was lucky enough to encounter <a href="http://bit.ly/tC2PEZ">Benjamin Mitchell</a> at QCon London earlier this year. He&#8217;s an irritatingly thoughtful and insightful guy who doesn&#8217;t let me get away with sloppy thinking. We meet for all-too-infrequent coffees and argue. He&#8217;s probably unaware of this but he&#8217;s been one of my biggest influences over the last year, and I&#8217;m especially grateful for him introducing me to the work of Chris Argyris and his Ladder of Inference.</p>
<p>A number of my work colleaguse at DRW have been a huge influence on my thinking over the last couple of years, not only on a technical level but also organisationally and personally. I&#8217;m not going to single them out because they&#8217;ll just point at me and laugh, but they know who they are.</p>
<p><a href="http://lunivore.com">Liz Keogh</a> and <a href="http://bit.ly/ukz4Uy">Chris Matts</a> continue to amaze me with where they&#8217;ve taken BDD, <a href="http://gojko.net/">Gojko Adzic</a> published <a href="http://bit.ly/tsJfR4">Specification by Example</a>, which gets me nicely off the hook for writing a BDD book, and I&#8217;ve been delighted to see Aslak Hellesøy and Matt Wynne&#8217;s Cucumber book make its way into print. It&#8217;s a marvellous read and you should go and buy it. Speaking of BDD, I owe a big thank you to Wendy Devolder and the other fine folks at <a href="http://www.skillsmatter.com">SkillsMatter</a> for hosting various in-the-brain sessions and organising the <a href="http://bit.ly/uDxQyF">BDD Exchange</a> (including getting all the videos online seemingly within minutes of the talks finishing). There are many others whom I&#8217;ve been learning from and exchanging ideas with during the year, so this is by no means an exhaustive list.</p>
<p>Others have been busy too. <a href="http://bit.ly/vkjZBB">Arialdo Martini</a> has translated my <a href="/introducing-bdd">Introducing BDD</a> article <a href="http://bit.ly/v2twov">into Italian</a>, and is currently working away translating some of my other articles. I&#8217;ll keep you posted on his progress. There is also a new Bulgarian translation of <a href="/whats-in-a-story">What&#8217;s in a Story?</a> that I want to share with you, but I&#8217;m still trying to track down a reliable URL (the one I have keeps falling off the Internets).</p>
<p>Well I think that brings us pretty much up-to-date. If this is still the latest post on my blog in three month&#8217;s time, you&#8217;ll know I&#8217;ve failed to start writing regularly. Hopefully it won&#8217;t be.</p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/bdd/'>bdd</a>, <a href='http://dannorth.net/category/effectiveness-patterns/'>effectiveness-patterns</a>, <a href='http://dannorth.net/category/meta/'>meta</a>, <a href='http://dannorth.net/category/people/'>people</a>, <a href='http://dannorth.net/category/programming/'>programming</a>, <a href='http://dannorth.net/category/talks/'>talks</a>, <a href='http://dannorth.net/category/thanks/'>thanks</a>, <a href='http://dannorth.net/category/uncertainty/'>uncertainty</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/624/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/624/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/624/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=624&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2011/11/20/looking-back-on-2011/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>

		<media:content url="http://bit.ly/u97z5q" medium="image">
			<media:title type="html">Øredev Keynote recorded by Heather</media:title>
		</media:content>

		<media:content url="http://bit.ly/tFUMzj" medium="image">
			<media:title type="html">Øredev Keynote recorded by Nora</media:title>
		</media:content>
	</item>
		<item>
		<title>Whose domain is it anyway?</title>
		<link>http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/</link>
		<comments>http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 09:50:42 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[bdd]]></category>
		<category><![CDATA[brittle]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[modelling]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[vocabulary]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=595</guid>
		<description><![CDATA[The brittleness of tests or specs is a recurring topic in BDD (or acceptance test-driven development, specification-by-example, or whatever you choose to call the thing where you write acceptance criteria, automate them and then make the application match). This is a tricky area, and there are probably as many styles of defining and grouping acceptance [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=595&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The brittleness of tests or specs is a recurring topic in BDD (or acceptance test-driven development, specification-by-example, or whatever you choose to call the thing where you write acceptance criteria, automate them and then make the application match). This is a tricky area, and there are probably as many styles of defining and grouping acceptance criteria as there are teams automating them.</p>
<p>The aspect I want to focus on in this article is domain language, because there&#8217;s a failure mode I encounter surprisingly often, which seems to have a common root cause.</p>
<p><span id="more-595"></span>Here&#8217;s an example:</p>
<p style="padding-left:30px;">Story: User logs in</p>
<div style="padding-left:30px;"><em>[Narrative about why a user should have to log in]</em></div>
<p style="padding-left:30px;">Scenario: User with valid credentials</p>
<div style="padding-left:30px;">Given an unauthenticated user</div>
<div style="padding-left:30px;">When the user tries to navigate to the welcome page</div>
<div style="padding-left:30px;">Then they should be redirected to the login page</div>
<div style="padding-left:30px;">When the user enters a valid name in the Name field</div>
<div style="padding-left:30px;">And the user enters the corresponding password in the Password field</div>
<div style="padding-left:30px;">And the user presses the Login button</div>
<div style="padding-left:30px;">Then they should be directed to the welcome page</div>
<p>It seems innocuous enough. It&#8217;s a scenario about logging in, a common feature on a web app, but let&#8217;s take a look at the vocabulary in use here. We can see language from a number of different domains:</p>
<ul>
<li>Words like <em>unauthenticated</em>, <em>valid</em>, <em>credentials</em> are from the domain of security, more specifically user authentication.</li>
<li>Words like <em>name</em> and <em>password</em> are from the subset of that domain concerning password-based authentication.</li>
<li>Then we have words like <em>enters</em>, <em>field</em> and <em>button</em>. These are from the domain of UI widgets.</li>
<li>Finally we have <em>login page</em> and <em>welcome page</em><a title="." href="//copy-pase-buffer">.</a> These are from the domain of web assets.</li>
</ul>
<p>Imagine we&#8217;ve delivered this feature and the scenario works as described. Now what happens if we go from password-based authentication to OpenID, or a centralized authentication system (CAS) model? This would obviously break the scenario. The requirement for a password becomes redundant so we would naturally expect to have to rethink the scenario. Alternatively what if we change the UI so the name is now selected via a drop-down list or a radio button? The scenario breaks again, because there is no longer a Name field to enter a value. And again, what if we change the site navigation strategy and decide that a successful login should take you to the Dashboard page, bypassing the Welcome page? Once again we would need to reword the scenario.</p>
<p>If you are thinking this is starting to look like a bit brittle, then you are right. We&#8217;ve made the mistake of combining too many domains into a single scenario &#8211; an indicator that we are overspecifying something &#8211; which makes the scenario vulnerable to change along a number of axes. We&#8217;ve created accidental complexity because we lost sight of the <em>intended audience</em> of the scenario.</p>
<h3>Unpacking the domain</h3>
<p>Let&#8217;s think about this for a moment. The intent of the scenario is that <em>a user with valid credentials can gain access</em>. That entire sentence lies in the domain of user authentication, so we could ask someone from that domain whether the premise of the scenario is correct. (Are valid credentials enough? Should we also require a physical token? Can credentials expire?) In general, any domain will map to a single subject matter expert, who we can call the stakeholder or representitive for that domain. In fact it&#8217;s a circular definition: a domain is simply the &#8220;subject&#8221; in the phrase &#8220;subject matter expert,&#8221; so for any given domain we should be able to identify a single stakeholder who represents that domain.</p>
<p>As an aside, this raises some interesting questions. What if you are writing scenarios in a domain that no-one seems to care about? (You can tell by watching their eyes glaze when you talk about it.) A lot of what we traditionally call non-functional requirements can fall into this category. For instance, most non-technical people aren&#8217;t interested in networking terms like latency, throughput or packet loss, but they might perk up when you start talk about sluggish response times or requests going missing. You can use the glaze test as a heuristic to know if you are talking to the wrong person &#8211; or using the wrong language. Similarly, if you can&#8217;t the answer the question &#8220;who cares about this requirement?&#8221; with an actual name, you either have a redundant requirement or a missing stakeholder.</p>
<p>But back to our login story. Every domain we include in a scenario potentially pulls in an additional stakeholder, whose requirements or priorities might change at any time. So to avoid a scenario becoming brittle we want to involve the minimum number of stakeholders we can get away with. The simplest useful scenario should involve exactly two domains &#8211; and therefore only two stakeholders &#8211; namely the domain of the scenario title (the problem domain, or the <em>what</em>) and the domain of the steps (the solution domain, or the <em>how</em>). We can&#8217;t have fewer than two domains. If we exclude the problem domain we aren&#8217;t explaining the value, or the <em>intent</em>, of the scenario. If we exclude the solution domain the scenario can&#8217;t describe the <em>behaviour</em> we want from the application. But any additional domains are likely to provide unnecessary constraints or noise, and make the test brittle. (When I talk about the solution domain, I mean the &#8220;outermost&#8221; solution domain &#8211; the solution&#8217;s interface if you like &#8211; as opposed to the domains of any of its implementation details.)</p>
<p>The <em>what</em> of our example scenario is logging in with valid credentials. The <em>how</em> is using a name/password pair to validate the user. The details of the <em>how</em> with its button clicks and whatnot aren&#8217;t adding any value to describing the capability we want. So maybe we could convey the same intent by rewording the scenario like this:</p>
<p style="padding-left:30px;">Scenario: User with valid credentials</p>
<div style="padding-left:30px;">Given an unauthenticated user</div>
<div style="padding-left:30px;">When the user tries to access a restricted asset</div>
<div style="padding-left:30px;">Then they should be directed to a login page</div>
<div style="padding-left:30px;">When the user submits valid credentials</div>
<div style="padding-left:30px;">Then they should be redirected back to the restricted content</div>
<p>Now we have exactly two domains, namely the &#8220;what&#8221; of user authentication (words like <em>unauthenticated</em>, <em>user</em>, <em>credentials</em>) and the &#8220;how&#8221; of web-based security (words like <em>restricted asset</em>, <em>submits</em>, <em>redirected</em>, <em>content</em>). If either of these domains changes then we would expect the scenario to change too. If we decide valid credentials are no longer enough we&#8217;ll probably need to add some more steps. Or if we decide to turn the app into a thick client then there will no longer be a login &#8220;page&#8221; so we might need to change that step to be a &#8220;modal dialog&#8221; or &#8220;screen&#8221; or something else thick-clienty.</p>
<p>Notice how we don&#8217;t explicitly say what it means to &#8220;submit valid credentials.&#8221; We&#8217;ve pushed this down into the implementation of the step. If we were to change the authentication model, say from name/password to OpenID, then the scenario would break, which we want (the implementation of the <em>how</em> has changed) so we would change the implementation of the step &#8220;the user submits valid credentials&#8221; to provide an OpenID URL rather than name/password pair, say.</p>
<p>But the wording and sequence of the scenario itself wouldn&#8217;t change because the intent is still the same and the behaviour is still the same &#8211; it&#8217;s the <em>implementation</em> of the behaviour &#8211; corresponding to the step&#8217;s implementation &#8211; that has changed, and that shouldn&#8217;t affect the meaning of the scenario.</p>
<h3>Chunking &#8211; or the myth of &#8220;declarative&#8221;</h3>
<p>Neuro-linguistic programming (NLP) describes a technique called <em>chunking</em>, that&#8217;s useful for either solving problems or creating options. For any statement, you can <em>chunk up</em> by asking &#8220;Why..?&#8221; or &#8220;What for..?&#8221; questions and <em>chunk down</em> by asking &#8220;How..?&#8221; questions. The further you chunk up, the broader your perspective becomes, and the further you chunk down, the more detailed. The power of chunking comes when you start to <em>chunk sideways</em>, by asking &#8220;How else..?&#8221; questions.</p>
<p>For instance with our login scenario, we could chunk up with: &#8220;What are you logging in for?&#8221; Perhaps it&#8217;s to restrict access to premium content, or for regulatory reasons. If it&#8217;s the former we could chunk sideways with: &#8220;How else could you restrict access?&#8221; Perhaps we could filter on IP or MAC address, or use cookies, or single sign-on. Then we can chunk down again to consider solutions: &#8220;How could we filter on MAC addresses? What new security issues could this raise?&#8221;</p>
<p>Once you realise you can ask &#8220;What for?&#8221; or &#8220;How?&#8221; at <em>any layer of abstraction</em>, concepts like &#8220;declarative&#8221; or &#8220;imperative&#8221; suddenly become relative. Any layer is the <em>what</em> of the layer below, and the <em>how</em> of the layer above. SQL is often described as a declarative language: you describe what you want to select but you don&#8217;t tell the database how to find it. However, the statement <code>select employee_id, salary from employees where salary &gt; 100000</code> could equally be considered imperative, a command, if the &#8220;declared&#8221; requirement is &#8220;find all employees paying higher rate tax&#8221; (tacit knowledge: higher rate tax kicks in at 100k), which itself is an imperative implementation detail if the original request is &#8220;establish our income tax liabilities by rate type.&#8221;</p>
<h3>Be deliberate in your use of domain language</h3>
<p>So tying this all up, when writing your scenarios keep in mind that you are writing them for two audiences: the person the feature is for and the person implementing it. Check the wording to see if you can spot anything from neither the problem nor the solution domains. If you find you are using language from outside those domains, you might be over-specifying the implementation or specifying unnecessarily broad requirements that mix concerns.</p>
<p>If you really care about how the behaviour is implemented, you should probably be specifying that elsewhere in a more fine-grained story &#8211; in other words chunking down to provide more detail &#8211; that won&#8217;t be interesting to the audience of this one. If not, you might want to push the detail down into the implementation of the steps.</p>
<br />Filed under: <a href='http://dannorth.net/category/bdd/'>bdd</a>, <a href='http://dannorth.net/category/brittle/'>brittle</a>, <a href='http://dannorth.net/category/ddd/'>ddd</a>, <a href='http://dannorth.net/category/domain/'>domain</a>, <a href='http://dannorth.net/category/language/'>language</a>, <a href='http://dannorth.net/category/modelling/'>modelling</a>, <a href='http://dannorth.net/category/tests/'>tests</a>, <a href='http://dannorth.net/category/vocabulary/'>vocabulary</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/595/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/595/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/595/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=595&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>On craftsmanship</title>
		<link>http://dannorth.net/2011/01/15/on-craftsmanship/</link>
		<comments>http://dannorth.net/2011/01/15/on-craftsmanship/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 21:56:34 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[craft]]></category>
		<category><![CDATA[craftsmanship]]></category>
		<category><![CDATA[discovery]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[trade]]></category>
		<category><![CDATA[value]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=572</guid>
		<description><![CDATA[Well, I certainly didn&#8217;t expect that kind of interest in my last post. In the past I&#8217;ve tended to have a few hundred people reading my infrequent mumblings. In the last few days nearly 20,000 people have popped by according to my site statistics, leaving nearly 150 comments. Crikey! The overriding message I got was [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=572&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Well, I certainly didn&#8217;t expect that kind of interest in my last post. In the past I&#8217;ve tended to have a few hundred people reading my infrequent mumblings. In the last few days nearly 20,000 people have popped by according to my site statistics, leaving nearly 150 comments. Crikey!</p>
<p>The overriding message I got was that without providing evidence and concrete examples one way or the other, it was all a lot of noise about terminology. One of my intentions this year is to expand on some of the implications of <a title="Introducing Deliberate Discovery" href="/2010/08/30/introducing-deliberate-discovery/">Deliberate Discovery</a>, which fit the bill nicely in illustrating programming-as-a-trade, so my next article is the start of a series of posts along that vein. I&#8217;ll let the evidence speak for itself and you can draw your own conclusions.</p>
<p>I&#8217;ve been very grateful for the feedback and comments, and the dialogue on Twitter. I didn&#8217;t spend as long as I might have editing and cleaning up the article, largely because I&#8217;d been tinkering with it since before Christmas, rewritten it twice, and decided it was better to publish early and respond iteratively to feedback. Typical &#8211; go out without your best underwear and you get run over by a bus.</p>
<p>The critical feedback generally fell into the following categories:</p>
<ul>
<li>How dare you! You obviously know nothing of which you speak. <em>(Well, you decide)</em></li>
<li>You obviously don&#8217;t / have never / no longer code / care about programming. <em>(Not true)</em></li>
<li>You&#8217;re using a pretty crappy definition of &#8220;craft&#8221; to put forward a bogus argument. Here&#8217;s mine / Wikipedia&#8217;s / my dad&#8217;s / a selective entry from a dictionary&#8217;s. <em>(That&#8217;s not the point)</em></li>
<li>You shouldn&#8217;t/can&#8217;t compare programming to building / plumbing / fine art / martial arts. <em>(See &#8220;On metaphors&#8221; below)</em></li>
<li>I&#8217;m angry and important so I&#8217;m just going to poke you with a stick rather than do any actual thinking. <em>(Meh)</em></li>
<li>Where&#8217;s your evidence? I say &#8220;craft,&#8221; you say &#8220;trade,&#8221; show me evidence it&#8217;s a trade. <em>(My next few posts)</em></li>
</ul>
<p>It seems this is a sensitive subject area so I&#8217;ll be editing more carefully from now on to try to pre-empt some of the more obvious critiques I left myself open to in the previous post.</p>
<p><span id="more-572"></span></p>
<h4>On value</h4>
<p>If I gave the impression that I wanted the cheapest or quickest cobbled-together solution then I certainly didn&#8217;t mean to. I want the <em>best value</em> software, something that&#8217;s fit for purpose in this specific context, to solve this specific need.</p>
<p>I&#8217;m not going to mandate test-driving anything (which is a huge about-face from what I was saying a year ago), unless it will help. Copy-and-paste is fine too. (Before you go all shouty at me again, hold off until I blog about the benefits of copy-and-paste, as it appears in a couple of patterns I&#8217;m calling <em>Spike and Stabilize</em> and <em>Ginger Cake</em>. You might be surprised.)</p>
<p>I expect a programmer to apply <em>the appropriate amount</em> of rigour, discipline and excellence to any situation. They should be as comfortable hacking together a disposable script as test-driving a complex business calculation or mathematical algorithm, and they should have a good idea &#8211; based on experience &#8211; of when to adopt each of these attitudes. This to me is simply good, professional workmanship. <em>(More about this in my next article.)</em></p>
<h4>On metaphors</h4>
<p>I shouldn&#8217;t have to point this out, but based on some of the feedback it seems I need to. Metaphor or analogy highlights a particular aspect of a situation. If I say something is as calm as a millpond, I don&#8217;t also mean to imply that it is wet and has lily leaves floating on it. (Yes I&#8217;m aware this is a simile rather than a metaphor.)</p>
<p>I used the example of jiu jitsu because I studied it long enough to qualify as an instructor so I know a bit about it. I remember the awe I felt when I witnessed the calm, grace, power and control of two black belts performing their <em>nage-ne-kata</em> &#8211; the same thing that I stumbled clumsily through from time to time &#8211; at a national competition one year. They got a standing ovation. It was beautiful. Programming is not a martial art.</p>
<p>I used the metaphor of negative space to illustrate that the <em>point</em> of programming isn&#8217;t the software &#8211; it&#8217;s the information flow or utility that the software enables. Programming is not fine art.</p>
<h4>On certification</h4>
<p>I don&#8217;t agree with, support or condone in any way classroom- or course-based certification. It&#8217;s a ridiculous money-making charade. (Yes, Scrum Master certification, I&#8217;m looking at you.) An inexperienced bully of a manager with a certificate is still an inexperienced bully of a manager.</p>
<p>I was attempting to open up a debate on how we might possibly recognise another&#8217;s skill and experience if we don&#8217;t <em>a priori</em> know them. This isn&#8217;t just a theoretical debate, it&#8217;s central to good hiring &#8211; or engaging outside help.</p>
<p>I have a lot of regard for experience-based and evidence-based qualifications. The way Dr. Patricia Benner applied the Dreyfus model to nursing in the US, for instance, completely reinvigorated the service. The sheer amount of hard graft and knowledge that most MBA-holders I know put into their studies is testament to how hard they worked to get one (and that they didn&#8217;t even bother trying until they had enough experience to attempt it).</p>
<p>I guess I&#8217;m saying any qualification worth its salt should enable me to see a curve of, or at least differentiate between, people-who-can and people-who-can&#8217;t (rather than just showing people-who-paid). A common refrain was that our industry and technologies change so rapidly that there wasn&#8217;t a syllabus or set of course content that could be sensibly assessed. I think I agree with this.</p>
<p>Some of the suggestions that came back were:</p>
<ul>
<li><em>Look them up online!</em> If they&#8217;re any good you should find evidence of that in terms of their own online output or other people&#8217;s testimonials. I really like this, especially nowadays, but the counter doesn&#8217;t hold: I might overlook some great-but-quiet individual if this becomes my core criteria.</li>
<li><em>Have certification.</em> See above</li>
<li><em>Become (literally) a journeyman</em>, where you rove from company to company, working for a roof over your head, building your reputation as you go. I love this idea but it takes some logistics.</li>
</ul>
<p>Basically this debate is going to run and run. And I&#8217;m glad about that. It&#8217;s a really hard problem.</p>
<h4>On open source</h4>
<p>I consider contributing to open source projects an admirable use of time and a good way to practise your programming. However the average quality of most OSS I&#8217;ve seen over the years is bloody shocking. It&#8217;s utility, however, is undeniable.</p>
<p>One of the most widely used pieces of OSS is the venerable JUnit. Ironically this was thrown together by two guys on a plane on their way to a conference, who had some time to kill on a long flight. Partly this was so one could learn Java and the other TDD. The fact that the two guys were Kent Beck and Erich Gamma demonstrates that a) two smart and pragmatic enough programmers can put together pretty much anything under any conditions in a few hours, and b) you can get enormous utility without <em>having</em> to rigorously test-drive everything. <em>(Although in this case I understand they did use TDD - Thanks <a title="Martin Fowler" href="http://http://martinfowler.com/">Martin Fowler</a> for the corrections.)</em></p>
<p>As another example, Joe Walnes, my examplar of the incredibly-talented-and-mildly-amused kind of software craftsman (see <em>On craftsmanship</em>, below), had one of his many open source projects rejected by a code repository&#8217;s review panel because it was &#8220;too simple &#8211; there was no point making it into a library.&#8221; Turns out it proved quite popular.</p>
<p>Open source software is as variable as any other software. The fact that it&#8217;s open source doesn&#8217;t say anything about its quality. It doesn&#8217;t mean it is not written or hosted by muppets (or genuinely talented people, for that matter &#8211; its open source-ness is simply an orthogonal concern). It&#8217;s most certainly not an &#8220;apprenticeship model,&#8221; but it&#8217;s a great way for people to read other people&#8217;s code (something we are really poor at as an industry), share knowledge and share the wealth of the utility of software.</p>
<h4>On productivity</h4>
<p>I don&#8217;t have any scientifically-valid numbers for software productivity. I have a ton of informal, empirical evidence that a small group of talented individuals can be insanely productive, even compared with other teams of talented individuals. I&#8217;ve been fortunate enough to spend the last year living it (and it&#8217;s nearly killed me trying to keep up!).</p>
<p>The people I had in mind when I mentioned hundreds-of-times productivity have done things like standing up an entire soup-to-nuts electronic trading stack, from user-facing visualisations of real-time trading data through to fully-automated trading applications &#8211; <em>in a few weeks</em>. These are not standalone applications. They talk to (really complicated) financial exchanges, internal back office settlement and reporting systems, and all the usual corporate messaging infrastructure you would expect to see in a medium-sized firm. To use the words of Lewis Carroll, this is, of course, impossible. I&#8217;ll see your factor of 10 and raise you 100. It&#8217;s not common. In fact it is extremely unusual. <em>But it does exist.</em></p>
<h4>On programming as a trade</h4>
<p>Maybe I should have said &#8220;programming has far more in common with a trade than it does with a craft.&#8221; As with any analogy, <em>of course</em> there are aspects of craft in programming. There are also aspects of craft in plastering or electrical wiring. I can spot the effects of well-executed, skilful workmanship even if I&#8217;m not qualified to rate the work itself. There is just much more of an affinity with trade-ness. In the first instance software should be practical and fit for purpose. I want effective, I don&#8217;t want fancy.</p>
<p>The guy who fitted my satellite dish ran the cable incredibly carefully around door frames, through walls, hugging the tops of skirting boards &#8211; it was virtually invisible &#8211; because &#8220;I&#8217;ve got a wife too, mate.&#8221; My house is old. Many attempted refactorings haven&#8217;t worked out and have ended in at least partial rewrites. (Uh oh, a metaphor again. <em>I know programming isn&#8217;t DIY.</em>)</p>
<p>People want software because they want to solve a problem, not because they like the notion of software. Some software practitioners risk losing sight of that. That&#8217;s all.</p>
<h4>On craftsmanship</h4>
<p>Some people really care about understanding &#8220;the Thing&#8221; that we do when we try to get computers to help us do stuff. They think about it, write about it and exhibit it in their work and their behaviour. (Thanks, <a title="The Thing of Software Development" href="http://michaelfeathers.typepad.com/michael_feathers_blog/2011/01/the-thing-of-software-development.html">Michael Feathers</a>, for a thoughtful and insightful post.) <a title="Jason Gorman" href="http://parlezuml.com/blog/">These people</a> are sometimes called craftsmen. I admire these people.</p>
<p>Some people self-identify as &#8220;rock stars&#8221; or &#8220;software craftsmen&#8221; in an unfortunate attempt to differentiate themselves from regular jobbing professionals, whom they regard as less talented or valuable than themselves. I don&#8217;t have much time for these people.</p>
<p>Some people are just <a title="Joe Walnes" href="http://joewalnes.com/">really</a> <a title="Neil Dunn" href="http://ngd.github.com/">bloody good</a> at writing software. They rarely blog, they don&#8217;t talk or write about software. They just love coding, solve difficult technical or domain problems in innovative and highly skilful ways in a fraction of the time of us regular mortals, to deliver real benefits. They learn a new tool or technology by using it in real work situations and figuring it out as they go. They think all this navel-gazing, posturing and chatter is a bit silly. I admire these people enormously! Some of them like to tease me. I&#8217;m ok with that.</p>
<p>Some people care so much about their profession (I&#8217;m using the term in a broad sense here to mean what-they-do-for-a-living) that they choose to help other less experienced practitioners in their field grow and develop their skills. They use their <a title="Chef Hackathon" href="http://www.builtinchicago.org/events/devops-chicago-chef-hackathon">own time</a> to write and <a title="Apprenticeship Patterns" href="http://apprenticeship-patterns.labs.oreilly.com/">freely publish</a> material, or provide <a title="Liz Keogh" href="http://skillsmatter.com/expert/agile-testing/elizabeth-keogh">workshops</a> or classes, out of a desire to raise the bar across the industry. They might go travelling, not only to develop their own skills but to <a title="Learn-to-Type Week" href="http://programmingtour.blogspot.com/2010/07/learn-to-type-week.html">share their skills</a> and knowledge as they go. (And it makes a great odyssey story!) Sometimes they do this enough that people recognise it and call them out as software craftsmen. I think I admire these people most of all, because they are inspiring the next generation of programmers to think like that too.</p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/craft/'>craft</a>, <a href='http://dannorth.net/category/craftsmanship/'>craftsmanship</a>, <a href='http://dannorth.net/category/discovery/'>discovery</a>, <a href='http://dannorth.net/category/productivity/'>productivity</a>, <a href='http://dannorth.net/category/programming/'>programming</a>, <a href='http://dannorth.net/category/software/'>software</a>, <a href='http://dannorth.net/category/trade/'>trade</a>, <a href='http://dannorth.net/category/value/'>value</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/572/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/572/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/572/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=572&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2011/01/15/on-craftsmanship/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>Programming is not a craft</title>
		<link>http://dannorth.net/2011/01/11/programming-is-not-a-craft/</link>
		<comments>http://dannorth.net/2011/01/11/programming-is-not-a-craft/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 22:14:54 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[craft]]></category>
		<category><![CDATA[craftsmanship]]></category>
		<category><![CDATA[discovery]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[trade]]></category>
		<category><![CDATA[value]]></category>

		<guid isPermaLink="false">http://dannorth.net/?p=497</guid>
		<description><![CDATA[TL;DR Software Craftsmanship risks putting the software at the centre rather than the benefit the software is supposed to deliver, mostly because we are romantics with big egos. Programming is about automating work like crunching data, processing and presenting information, or controlling and automating machines. Non-programmers don&#8217;t care about the aesthetics of software in the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=497&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h3>TL;DR</h3>
<p>Software Craftsmanship risks putting the software at the centre rather than the benefit the software is supposed to deliver, mostly because we are romantics with big egos. Programming is about automating work like crunching data, processing and presenting information, or controlling and automating machines.</p>
<p>Non-programmers don&#8217;t care about the aesthetics of software in the same way non-plumbers don&#8217;t care about the aesthetics of plumbing &#8211; they just want their information in the right place or their hot water to work. (Although it&#8217;s fair to say they appreciate decent boiler controls.)</p>
<p><span id="more-497"></span></p>
<h3>Motivation for software craftsmanship</h3>
<p>It would be great if programming were a proper profession, but it isn&#8217;t. A profession has a structured model for advancing through levels of skill and ability, be it studying for a law degree and articles (working for a legal practise) or the years of undergraduate and medical training a doctor undertakes before specialising. The latter has clearly-delineated ranks, from junior doctor, via a brutal regime of 80-hour weeks, to consutant.</p>
<p>Conversely there is no minimum entry requirement for programming. Some people naturally have a flair for it (two of the best programmers I know never went to college), some teach themselves out of books, others just tinker until they get something working. A programmer&#8217;s skill and ability is only as good as their personal reputation: there isn&#8217;t an accepted, transferable ranking like there is in a &#8220;proper&#8221; profession.</p>
<p>To illustrate how low the bar can be, the mission statement of Visual Basic (whether explicit or not) was to democratize programming. Anyone who could drag and drop controls around and understand a modicum of technical stuff could throw together a solution to a problem with relatively little effort. Wizards and other utilities enable power users to create sophisticated spreadsheets in Excel with no practical programming knowledge. Language guru Erik Meijer has spent the last few years talking about <a title="Erik Meijer's talk at QCon 2007" href="http://www.infoq.com/presentations/Meijer-linq-cloud">democratizing the cloud</a>, i.e. making it as easy to string together online services and utility computing as VB made it to string together other applications. In other words, there are people actively working to lower the already low barrier to entry for programmers. (These are Microsoft-specific examples, but then Microsoft has done more than most to dumb down programming, or make it accessible to the masses, depending on your point of view.)</p>
<p>The IT industry is relatively young &#8211; only a couple of generations old in fact. (As an experiment, go and find out how many of your coworkers have a parent who worked in IT. See?) It is also something of a gold mine. Compared to a lot of industries it is relatively well paid indoor work with no heavy lifting, and remember the thing about no minimum entry requirement? This means entire economies have grown up looking at IT as a numbers game: if you throw enough bodies at a problem you should be able to make it go away, and if you can get bodies for cheap enough (yet still relatively well paid compared to the alternatives) then you can throw a <em>lot</em> of bodies at a problem.</p>
<p>I spoke to someone once who told me he was currently engaged in a public sector project to provide online tax credits for builders. As a builder you would have an account online where you would log in and buy tax credits that were offset against your end-of-year tax bill. In other words, it was a site that had user accounts and a (third party) card payment facility, and not much else. This project had 400 programmers working for three years. <em>That&#8217;s more than a person-millennium of effort</em>. For a web app! That I&#8217;m paying some consortium for out of my tax money. But that&#8217;s a rant for another day.</p>
<p>So from a purely demographics perspective we can see that the vast majority of people in the IT industry are there because a) it&#8217;s a well paid alternative to other white collar office work or even manual labour, and b) there is no incentive to make it anything other than a commodity numbers game.</p>
<p>Then there are the others. The minority of people who <em>genuinely love programming</em> and choose to excel at it. They understand software development is a skill, in fact a whole portfolio of skills: understanding and modelling a problem domain, understanding programming languages, libraries, paradigms and idioms, choosing which to apply in a given situation, learning and understanding algorithms, mastering the &#8220;path to production&#8221; (build, deployment, release), monitoring and availability, process automation, Lean theories of supply, production and product development, utility and cloud computing, concurrency and parallelism, I could go on. Those guys want a way to differentiate themselves. The oft-quoted figures of tenfold increase in productivity of expert versus novice programmers are wrong by orders of magnitude in my experience. A really great programmer (and I&#8217;ve been lucky enough to work with a handful over the years) can out-perform a doing-it-for-the-money programmer by orders of literally hundreds, delivering in hours or days what would take an average developer weeks or months.</p>
<p>How are those guys supposed to differentiate themselves? And how can they help others in the industry who have a real love and appreciation for the software they write? We need some sort of apprenticeship model, and a way to identify masters, both to apprentices and other masters. That sounds like the sort of model that craftsmen use. And it also appeals to the average alpha geek&#8217;s romantic streak, possibly incorporating a system of secret signs and handshakes.</p>
<p>The thing is, at one level software can be described by the utility it provides. It doesn&#8217;t matter how ugly it is under the hood as long as it delivers the goods. A programmer can show beautiful software to another programmer, but that&#8217;s where the appreciation stops for software <em>per se</em>.</p>
<h3>Seeing the negative space</h3>
<p>My wife is an artist, and one of the things she studies is negative space. This is the space between the obvious shapes or objects in a picture, as opposed to the objects themselves. An understanding of negative space is critical to being able to faithfully render a composition. As the model sits sideways on, notice the curved triangle bounded by the upper and lower arm and the side of the body. See how the space between the front of the face and the window frame in the background is nearly rectangular and quite narrow, and see how the outline of the nose creates a dent in the left-hand side of the rectangle. Look at the chin, actually the space below the chin, to observe the angle between the bottom of the jawline and the front of the neck. And through the window, notice the colour of the sky in the <em>space between</em> the winter tree branches. It&#8217;s different from the grey-white cloud above the trees. All of these shapes and colours &#8211; the space between the obvious stuff, the negative space &#8211; these are the shapes that determine how faithfully you represent the image on a canvas. But mostly you don&#8217;t notice them &#8211; especially in a good painting.</p>
<p>So what does this have to do with software? Well it seems to me the most succesful programmers I&#8217;ve encountered don&#8217;t <em>craft</em> software; they write software in order to move <em>information</em> around, in order to get something done. Information is the real deal &#8211; the software just defines the space that it moves around in. For those programmers, success is about getting information from point A where it&#8217;s currently languishing to point B where it&#8217;s going to actually be useful, as quickly and effectively as they can. Success in a UI is about rendering or capturing exactly the information that will be useful &#8211; no less and certainly no more &#8211; in a succinct, obvious way. The software is incidental, a detail, hidden away in the wings, and it is ultimately entirely disposable.</p>
<h3>Why programming is not a craft</h3>
<p>With a craft, the product has intrinsic beauty in its own right. A cathedral is really a big hut for people to meet in and worship. Make it from stone by all means, so it lasts longer than a wooden hut, but why all the fancy decorative stuff? Of course it is there to engender a sense of majesty and wonder, and cause us to engage the part of ourselves that appreciates beauty and magnificence, so we enter the cathedral reverently and humbled, ready to worship. What makes it a craft is the work above and beyond its basic utility to give it intrinsic, aesthetic beauty.</p>
<p>If I use the same stone to build a traffic bridge over a railway line, I care about its utility and structural effectiveness. If it&#8217;s a good, simple bridge <em>I won&#8217;t even notice it&#8217;s there!</em> We don&#8217;t notice most of the engineering that goes into the roads we travel on or the railways we use until something goes wrong! (There&#8217;s a really cool word for this phenomenon &#8211; when you only become fully aware of something when it fails &#8211; but I can&#8217;t recall it right now.)</p>
<p>There is a difference between the mindset of a master stonemason sculpting the expression on the face of a gargoyle and someone using the commodity blocks that make up a multi-storey car park. In the latter case the last thing I want is someone&#8217;s &#8220;personality&#8221; causing some of the blocks to be different sizes and no longer interchangeable, never mind the added expense of having someone manually hew the stone rather than using machine tools. In the former the stonemason&#8217;s attitude is <em>indulgent</em>. He is putting his signature (and his ego, and his reputation) into this magnificent representation of Hell&#8217;s best. If you just wanted an oil-pouring spout you could get one from a DIY store.</p>
<p>Software practitioners &#8211; especially, ironically, the good ones &#8211; often lose sight of this. They fall in love with the software itself and start thinking of themselves as craftsmen of software.</p>
<h3>The easiest qualification in the world</h3>
<p>So here&#8217;s my concern with the idea of Software Craftsmanship. It&#8217;s at risk of letting programmers&#8217; egos run riot. And when that happens&#8230; well, the last time they went really nuts we got Web Services, before that J2EE. They convinced the British government that they wanted an uber-database to store Everything Ever About Everyone. You see where I&#8217;m going?</p>
<p>When I looked at the Software Craftsmanship Manifesto, something inside me died. (Something else inside me burst out laughing and told the other thing to stop taking itself so seriously, so we&#8217;re all better now.) Apart from being, well, <em>bland</em>, it is just so self-evidently an oxymoron. If its message is that we need to think of ourselves as software craftsmen and that this is somehow special, then what a spectacularly easy bandwagon it is to jump on.</p>
<p>Do I need to demonstrate any kind of skill? No. Any specific credentials? No. Any kind of experience working in the field? Nope (and as the Pragmatic Programmers are happy to remind you, ten years experience is very different from one year repeated ten times). In fact, all I have to do to associate myself with Software Craftsmanship movement is to <em>fill in my name on the website</em>. Woohoo! I&#8217;m now associated with the Manifesto of Software Craftsmanship! Is no-one else seeing the irony here?</p>
<h3>The (original) travelling salesmen problem</h3>
<p>Back in the day &#8211; while the West was busy being Medieval &#8211; Japanese warlords used to hire bands of mercenaries called Samurai to, well basically beat up other bands of Samurai. Your life expectancy as a Samurai warrior was usually pretty low, and dropped dramatically if you came off your horse. In such times the martial art of jiu jitsu was born. The premise with jiu jitsu is that you have come off your horse in battle: you are unarmed, outnumbered and your opponents have both a height and weapons advantage over you. You&#8217;re pretty much stuffed unless you can pull some cool moves out of the bag.</p>
<p>As Samurai moved around, hiring themselves out to different warlords, they would want to join the local martial arts school to continue their training. Now you can imagine, if you learn jiu jitsu in one dojo up to a certain standard (we&#8217;ll call it a black belt) and then turn up at another school, it&#8217;s pretty tricky to get any kind of calibration without involving some life-threatening fighting with the new kid. And without calibrating, you can&#8217;t know whether someone is any good.</p>
<p>Ever resourceful, the jiu jitsu schools developed a sort of dance, called the <em>nage-ne-kata</em>, comprising five groups of three techniques. For each technique you both execute the technique and have it done to you, to demonstrate not only your fighting skills but your falling and rolling abilities. All senior students would learn the nage-ne-kata, and if they went to a new school, the sensei would ask them to demonstrate it for them. It is still taught today in some ju jitsu schools.</p>
<p>You can tell a lot about someone&#8217;s jiu jitsu from their nage-ne-kata: how they stand, how they hold their stance, how they move, how graceful they are, how well they understand balance, how well they respect their uki (the partner), how well they roll and fall (and how quickly they get up!), whether they favour one side over the other, their spatial awareness. Just from one little dance.</p>
<h3>Let&#8217;s be craftsmen then</h3>
<p>So, back to the plot, I&#8217;m reassured by the kinds of people I see involved in the Sofware Craftsmanship movement, the likes of Kevlin Henney, Bob Martin, Corey Haines, Glenn Vanderburg. These are pragmatic, sensible, down-to-earth and above all genuinely humble people. My concern is that the glamour is overtaking the intent, as evidenced by the sheer number of people wishing to align themselves with the Software Craftsmanship movement.</p>
<p>I would love to see someone rewrite the Software Craftsmanship Manifesto in terms of <em>getting results</em> and <em>delighting customers</em>. I don&#8217;t want &#8220;steadily adding value,&#8221; I want &#8220;amazing their customers every day!&#8221; Software craftsmen should be egoless, humble, with a focus on the outcome rather than the code or the process. I&#8217;d like a call to arms to stop navel-gazing and treat programming as the skilled <em>trade</em> that it is.</p>
<p><em>No-one wants your steenking software</em> &#8211; they want the capabilities it gives them, and they want those yesterday. (I&#8217;ll specifically exclude the User Experience folks. Theirs is genuinely a world of aesthetics and human understanding. They, to use a bricklaying term, do the face work &#8211; the fancy stuff people actually see.)</p>
<p>Maybe there should be a Software Craftsmanship Council, that confers membership in a collegiate yet transparent way, in just the kind of elitist model that desperately upsets the folks who have systematically dumbed down the education system in the UK (but that&#8217;s another rant for another day). You only get to join if those already there believe you will be a credit to the notion of Software Craftsmanship, just like Ph.D. viva boards do today.</p>
<p>A truly skilled programming team can deliver amazing business results in insanely short amounts of time. Let&#8217;s go after some of that! I <em>want</em> your experience. I <em>want</em> your knowledge. I <em>want</em> you to show me &#8220;the simplicity the other side of complexity,&#8221; to quote Oliver Wendell Holmes. It takes a real expert &#8211; a real craftsman &#8211; to see the elegant simplicity buried away inside the mess we call enterprise software, for instance, and tease it out.</p>
<p>Calling programming a trade takes nothing away from the desire for professionalism, experience and expertise. In the same way I want an expert electrician wiring up my house rather than a cowboy, I want an expert programmer enabling my business. What I don&#8217;t want, however, is a prima donna plumber who insists on talking about the elegance, beauty or art of plumbing, or who insists that I appreciate the aesthetic beauty of his joinery, or will &#8220;only work with other rock star plumbers, who only practise copper-driven plumbing.&#8221; The best software should be understated and unobtrusive (as, maybe, should be the best programmers). I don&#8217;t want to hear the clanking of information as it rattles from one poorly-implemented system to another, through ill-conceived interfaces.</p>
<h3>So what now?</h3>
<p>While I was formulating this article I made a few comments on Twitter about it and I received some interesting responses. One person suggested a programmer is a craftsman not unlike a silversmith. I would argue that the value of silver or gold jewellery is intrinsic to the jewellery. I don&#8217;t use the item <em>for</em> anything other than for others to admire its beauty (and by association my significant-yet-understated wealth and taste).</p>
<p>If we&#8217;re going to use gold or silverwork as an analogy it would be in something like a speaker cable, where the properties of gold contacts improve the quality of the sound. In this case, however, I want the gold connector to be <em>identical</em> to a cheaper one. If the cable manufacturer wants to demonstrate their aesthetic abilities, I&#8217;ll be a lot happier if they do it by making the cable look fancy than by messing around with the shape of the connector!</p>
<p>If you&#8217;ve read this far, then thank you. Now here&#8217;s what I want you to do. I do think there should be a Software Craftsmanship Manifesto, but not the thing that&#8217;s currently out there. I think it should be a call-to-arms, feisty, opinionated, brash and everything that a good manifesto should be (I&#8217;m channelling Kevlin Henney here). I also think there should be a way for passionate, skilled programmers to differentiate themselves from the mainstream commodity bodies, and also to recognise one another, and demonstrate their value to potential employers. What could that be, and how could we make it work?</p>
<p>As a buyer of software solutions, wouldn&#8217;t you want to know your systems were being built by master craftsmen rather than day jobbers? You&#8217;re paying for this and you deserve some kind of reassurance. Let&#8217;s figure out how to provide it.</p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/craft/'>craft</a>, <a href='http://dannorth.net/category/craftsmanship/'>craftsmanship</a>, <a href='http://dannorth.net/category/discovery/'>discovery</a>, <a href='http://dannorth.net/category/productivity/'>productivity</a>, <a href='http://dannorth.net/category/programming/'>programming</a>, <a href='http://dannorth.net/category/software/'>software</a>, <a href='http://dannorth.net/category/trade/'>trade</a>, <a href='http://dannorth.net/category/value/'>value</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/497/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/497/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/497/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/497/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/497/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/497/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/497/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/497/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=497&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2011/01/11/programming-is-not-a-craft/feed/</wfw:commentRss>
		<slash:comments>247</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing Deliberate Discovery</title>
		<link>http://dannorth.net/2010/08/30/introducing-deliberate-discovery/</link>
		<comments>http://dannorth.net/2010/08/30/introducing-deliberate-discovery/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 18:31:52 +0000</pubDate>
		<dc:creator>Dan North</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[discovery]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.dannorth.net/?p=431</guid>
		<description><![CDATA[Last year I wrote about how we are doing planning all wrong, or rather, how we seem to focus on the wrong things when we do planning. We obsess about stories and story points and estimation, because that&#8217;s what we&#8217;ve been taught to do. It reminds me of the story about a man who comes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=431&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Last year I wrote about <a href="/2009/07/01/the-perils-of-estimation/">how we are doing planning all wrong</a>, or rather, how we seem to focus on the wrong things when we do planning. We obsess about stories and story points and estimation, because that&#8217;s what we&#8217;ve been taught to do. It reminds me of the story about a man who comes across a drunk standing under a street lamp at night time, staring at the floor. The drunk says he&#8217;s looking for his lost keys, and the man says: well they are obviously not here under the lamp or we would see them. No, replies the drunk, I dropped them over there, but it&#8217;s dark over there so I decided to search over here instead.</p>
<p>Our street lamp is the Planning Game, which involves writing Stories and Estimating, using Planning Poker or other Estimation Techniques (everything in caps appears in the Agile Literature, and so has been deemed Official).</p>
<p>I suggested we are failing to use the planning time effectively, and that we should be devoting the time to finding out as much useful stuff as we can while everyone was in the same room, and I called this <em>Deliberate Discovery</em>. <a href="http://www.dancingmango.com/blog">Marc McNeill</a> commented: <em>&#8220;Deliberate discovery. As opposed to accidental discovery? Or any other sort of discovery? Why add the extra word ‘deliberate’?&#8221;</em></p>
<p><span id="more-431"></span></p>
<h3>Accidental discovery</h3>
<p>If you do something a bunch of times, you will learn more and more about it. Probably. Potentially. Maybe. Ok, if you do something a bunch of times and <em>unexpected things happen</em> you will learn. If you just do the same thing over and over again, you will probably get better at performing that sequence, but you won&#8217;t learn anything new. The pragmatic programmers describe this as the difference between ten years&#8217; experience vs. one year&#8217;s experience ten times.</p>
<p>Learning comes from experiencing the unexpected. As the saying goes: &#8220;Good judgement comes from experience. Experience comes from bad judgement.&#8221; When you receive an unfamiliar outcome you have to alter your model of the world to accommodate it (or dismiss the encounter as a fluke and only seek out reinforcing data &#8211; this is known as <em>confirmation bias</em> and is a great way to not learn). In Zen teaching this moment of enlightenment &#8211; of evolving your model of the world &#8211; is known as <em>satori</em>, and Zen students strive to induce these moments of satori by the use of <em>koans</em>. Similarly, the Dreyfus model of skills acquisition describes an Advanced Beginner as someone who is starting to put rote-learned rules into context &#8211; understanding where they do and don&#8217;t apply. This again can only happen when the learner experiences situations outside what they already know (which is why artificially constraining Best Practices can stifle learning).</p>
<p>This implies the student can accelerate their learning by actively seeking out encounters where they are likely to learn. This is the difference between accidental and deliberate discovery.</p>
<h3>&#8220;Learning is the constraint&#8221;</h3>
<p><a href="http://lizkeogh.com">Liz Keogh</a> told me about a thought experiment she came across recently. Think of a recent significant project or piece of work your team completed (ideally over a period of months). How long did it take, end to end, inception to delivery? Now imagine you were to do the same project over again, with the same team, the same organisational constraints, the same everything, except your team would already know everything they learned during the project. How long would it take you the second time, all the way through? Stop now and try it.</p>
<p>It turned out answers in the order of 1/2 to 1/4 the time to repeat the project were not uncommon. This led to the conclusion that &#8220;Learning is the constraint&#8221;.</p>
<p><em>Edit: Liz tells me the thought experiment and quote originated with Ashley Johnson of Gemba Systems, and she heard about it via César Idrovo.</em></p>
<p>If we assume the only difference is that the second time round you have learned about the problem, this would suggest that the biggest impediment to your throughput was <em>what you didn&#8217;t know</em>. That&#8217;s not to say you spent all the extra time busily learning stuff. Heck that&#8217;s <em>fun</em> and what&#8217;s more it&#8217;s even useful! More typically you probably spent it thrashing around trying to find a way forwards, or mired in meetings where you were trying to figure out the other guy&#8217;s agenda so you could get past another roadblock, or going down a path that was always destined to be a dead end had you only known it. Or trying to work out for the umpteenth time how stupid Java NIO sockets work. So it&#8217;s not really learning that&#8217;s the constraint &#8211; it&#8217;s ignorance. More accurately, it&#8217;s ignorance about specific aspects of the problem at hand. In other words:</p>
<p style="text-align:center;"><em> Ignorance is the single greatest impediment to throughput.</em></p>
<h3>Ignorance is multivariate</h3>
<p>Ignorance applies along multiple axes. You can be ignorant of the particular technologies you are using, ignorant of the breadth of technology options available to you, ignorant of the domain, ignorant of the ways in which you could address the problem or opportunity, ignorant of a better way of articulating the problem &#8211; a better model &#8211; that would make the solution obvious, ignorant of the people in the team &#8211; their aspirations or fears, their motivation, their relationships with one another and out into to the wider organisation, ignorant of organisational constraints, ignorant of third party integration risks, ignorant of who are the people you should be building relationships with, ignorant of the delivery methodology, ignorant of the culture of the organisation. I&#8217;m just scratching the surface here &#8211; I&#8217;m sure you can imagine many other factors that could affect our ability to deliver and about which we will be more or less ignorant.</p>
<p>More insidiously, you are usually ignorant of how ignorant you are, and rather than making you more wary, this <em>second-order ignorance</em> actually makes you more likely to rush in like the proverbial fool. This is beautifully summed up in <a href="http://bash.org/?364782">this quote</a> from IRC snippets site, bash.org:</p>
<blockquote><p>&lt;Pahalial&gt; &#8220;ignorance more frequently begets confidence than does knowledge&#8221; &#8211; Charles Darwin<br />
&lt;kionix&gt; wtf? begets isn&#8217;t a word. quit trying to make up words [...expletive...]</p></blockquote>
<h3>Discovery is non-linear and disjoint</h3>
<p>Now, think back to that project you just completed. Did your ignorance decrease consistently and linearly along all these axes? It&#8217;s fairly unlikely. What probably happened was that at various points &#8211; some more memorable than others &#8211; you had sudden insights or realisations, that either came to you or were thrust upon you by circumstance. Chances are that a lot of this unplanned learning happened fairly late in the day, accompanied by much disbelief, anger, and probably all the other <a href="http://en.wikipedia.org/wiki/K%C3%BCbler-Ross_model">stages of grieving</a> too, as you come to terms with the death of your strongly-held model of How Things Ought To Be.</p>
<p>So for any single factor, you start the project with a particular level of ignorance, and it decreases in &#8220;bumps&#8221; &#8211; in a disjoint fashion &#8211; with each learning episode, until at the end of the project it is at another, lower level. Of course many of these factors are interrelated, so in a single episode you will typically learn about several different things &#8211; your ignorance of various factors will decrease by different amounts simultaneously. In reality much of this learning is at the whim of the Project Gods, and largely out of your control. How could you have possibly guessed that the third party API would be <em>that</em> different from the spec? Who knew Dave&#8217;s wife would choose <em>that</em> weekend to have the baby?</p>
<p>Well actually you could have. Ok, you couldn&#8217;t have known that <em>those</em> things would happen, but you would be insane &#8211; or rather &#8220;normal&#8221; &#8211; not to think <em>something</em> would happen, and this is the crux of Deliberate Discovery.</p>
<h3>What if you assume something bad <em>will</em> happen?</h3>
<p>We have a built-in mechanism for mindless optimism. It&#8217;s called <em>attribution bias</em>, and we use it to protect our fragile egos from the big bad reality out there. You can read more in Cordelia Fine&#8217;s fascinating book <em><a href="http://www.cordeliafine.com/a_mind_of_its_own.html">A Mind of Its Own</a></em>, but in short, it means we assume when bad things happen to other people, they probably deserve it. They screwed up, or they didn&#8217;t plan ahead, or, well, any number of reasons. But when bad things happen to <em>us</em>, well that&#8217;s different. We couldn&#8217;t possibly have seen <em>that</em> coming! That could have happened to <em>anyone</em>. Poor us.</p>
<p>We are susceptible to attribution bias when we estimate (as <a href="http://lindarising.org">Linda Rising</a> has pointed out), and when we assess risk, and we are therefore constantly amazed &#8211; and let&#8217;s face it, a little disappointed &#8211; when bad things happen on our projects. Here&#8217;s another thought experiment: What if instead of hoping nothing bad will happen this time, you assumed the following as fact:</p>
<ul>
<li>Several (pick a number) Unpredictable Bad Things will happen during your project.</li>
<li>You <em>cannot</em> know in advance what those Bad Things will be. That&#8217;s what Unpredictable means.</li>
<li>The Bad Things will materially impact delivery. That&#8217;s what Bad means.</li>
</ul>
<p>How would this affect your approach to the project?</p>
<h3>Finally, deliberate discovery</h3>
<p>So, I think we&#8217;ve been looking in the wrong place. Methodologies, practises and patterns for delivery are all well and good, but they don&#8217;t take into account the single biggest limiting factor to successful delivery. Let&#8217;s assume that during the life of the project our ignorance will reduce across a number of axes that are relevant to our project. Let&#8217;s also assume that ignorance of certain factors <em>right now</em> are the things currently limiting us the most. Let us further assume that we probably don&#8217;t know which ones those magic enabling factors are: we are second-order ignorant of which factors are currently the most constraining. Once we realise what these are, we can apply methodology to consistently move forwards, but until we do, we&#8217;re shooting in the dark.</p>
<p>Surely it makes sense to invest effort in firstly discovering which aspects of delivery we are most critically ignorant of (i.e. both where we are ignorant and where that ignorance is hampering throughput), and further to invest in reducing that ignorance &#8211; deliberately discovering enough to relieve the constraint and allow us to proceed. And all the way through the project, day by day, we should be trying to identify where and how ignorance is hampering us. Ideally we want to create as steep a descent as possible for each axis on the curve of ignorance, so we deliberately reduce the degree to which we are constrained by that ignorance, rather than being a victim of circumstance.</p>
<p>This is a skill, and as such is subject to the Dreyfus model. Which means that initially we&#8217;ll be rubbish at it. Then we&#8217;ll start to figure out <em>how</em> we are rubbish at it, and work on that. Then we&#8217;ll figure out some Best Pracises (I&#8217;m sorry &#8211; it&#8217;s inevitable. That&#8217;s what Competent people do to &#8220;protect&#8221; Advanced Beginners), and, hopefully shortly after, figure out ways to subvert those Best Practises to continue getting work done. The hardest part is going to be the damage to our egos as we realise just how systemically poor we are at delivering projects, and how we&#8217;ve been staring <em>straight past</em> the problem, because our methodology is always under the street lamp, and we feel safe under the street lamp.</p>
<h3>What next?</h3>
<p>This then comes back to my original premise last year, which is that during an inception, when we are most ignorant about most aspects of the project, the best use we can possibly make of the time available is to attempt to identify and reduce our ignorance across all the axes we can think of. (Arguably one of the first exercises should be to take a first stab at identifying these axes, and trying to figure out just how ignorant we are. How&#8217;s that for an exercise in humility!) Sure, if we stick to the traditional Agile planning model, we will do <em>some</em> discovery as we break down epics into features into stories into scenarios, but how much more could we accomplish if we put that to one side and instead focused on the real deal?</p>
<p><a href="http://www.domainlanguage.com/">Domain-driven design</a> inventor Eric Evans describes up-front analysis as &#8220;locking in our ignorance.&#8221; He&#8217;s got a point, and it doesn&#8217;t just apply to old-school requirements analysis. The death-by-stories planning exercises I&#8217;ve seen on many Agile projects bear testament to the same problem.</p>
<p>I hope this has given you an idea of where my head has been at. There is much more to say about deliberate discovery. Think about applying the principle to learning a new language, or picking up a new technology, or a new domain. What could you do to identify and reduce your ignorance most rapidly? Why are rapid-feedback teams so much more successful than long cycle teams? How can we measure ignorance? I&#8217;ll be writing more on this topic over the coming weeks and months, and I&#8217;ll be talking about Deliberate Discovery at <a href="http://qconsf.com">QCon, San Francisco</a> in November.</p>
<p><em>Thanks to Liz Keogh, Lindsay North, Joe Walnes, Chris Matts, Steve Hayes, Kevlin Henney and numerous others for helping to grow the ideas in this article. And special thanks to Glenn Vanderburg and Mike Nygard for the conversation at JAOO Australia about a unit of ignorance. (That will have to wait for a future article.)</em></p>
<br />Filed under: <a href='http://dannorth.net/category/agile/'>agile</a>, <a href='http://dannorth.net/category/discovery/'>discovery</a>, <a href='http://dannorth.net/category/learning/'>learning</a>, <a href='http://dannorth.net/category/planning/'>planning</a>, <a href='http://dannorth.net/category/programming/'>programming</a>, <a href='http://dannorth.net/category/software/'>software</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dannorthnet.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dannorthnet.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dannorthnet.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dannorthnet.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dannorthnet.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dannorthnet.wordpress.com/431/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dannorthnet.wordpress.com/431/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dannorthnet.wordpress.com/431/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dannorth.net&#038;blog=11322506&#038;post=431&#038;subd=dannorthnet&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dannorth.net/2010/08/30/introducing-deliberate-discovery/feed/</wfw:commentRss>
		<slash:comments>70</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/33cfb4d051a768c06f7fb380c7c2abe3?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">tastapod</media:title>
		</media:content>
	</item>
	</channel>
</rss>
