<?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>niksilver.com &#187; Software design</title>
	<atom:link href="http://niksilver.com/category/software-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://niksilver.com</link>
	<description>Mostly about the management of software development</description>
	<lastBuildDate>Wed, 01 Feb 2012 20:37:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='niksilver.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/929dd549b4d099719f34e472d1f7a25a?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>niksilver.com &#187; Software design</title>
		<link>http://niksilver.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://niksilver.com/osd.xml" title="niksilver.com" />
	<atom:link rel='hub' href='http://niksilver.com/?pushpress=hub'/>
		<item>
		<title>Appropriate complexity for better living</title>
		<link>http://niksilver.com/2012/01/12/software-complexity/</link>
		<comments>http://niksilver.com/2012/01/12/software-complexity/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 09:43:00 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/?p=2482</guid>
		<description><![CDATA[I was recently involved in great example of software complexity, technical debt, and refactoring, and I want to pass on the experience. As part of a project some new requirements came in. I had been concerned that part of the system under development was a little complex, but not overly concerned, as it worked and &#8230; <a href="http://niksilver.com/2012/01/12/software-complexity/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=2482&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was recently involved in great example of software complexity, technical debt, and refactoring, and I want to pass on the experience.</p>
<p>As part of a project some new requirements came in. I had been concerned that part of the system under development was a little complex, but not overly concerned, as it worked and had comprehensive automated tests.</p>
<p>But the new requirements changed that. They concerned a subsystem which took three inputs and processed them. The problem that the subsystem was trying to solve was roughly stated as follows:</p>
<blockquote><p>We have an input stream which needs to be combined with two other input streams. But if some of the combining can&#8217;t take place because the input streams have gaps then we have to fill in the gaps from other sources. And then we can output the result.</p></blockquote>
<p>If that seems a bit vague, it&#8217;s because it is: I hadn&#8217;t paid much attention to expressing the logic clearly.</p>
<p>The new requirement, meanwhile, was to add a fourth input. Since we were using a visual tool I can present the &#8220;as is&#8221; software design along with the &#8220;to be&#8221; that was the likely outcome of the requested changes:</p>
<p><img class="aligncenter size-full wp-image-2572" title="Excessive complexity" src="http://niksilver.files.wordpress.com/2012/01/software-design-1.jpg?w=750" alt=""   /></p>
<p>The threatened &#8220;to be&#8221; state would have been excessively complex. Two things concerned me greatly. First was that I couldn&#8217;t keep all the &#8220;to be&#8221; logic in my head at one time, so didn&#8217;t have confidence that it was right. And second was that &#8212; as a guiding rule &#8212; software should be exactly as complex as the problem it attempts to address, and no more so&#8230; and that was not reflected here. My gut feeling was that the problem was simple, and adding one more input should have added linear complexity, but it felt like the complexity was growing exponentially. This was compounded by the fact that it was quite apparent there might soon be a fifth, sixth, or even seventh input.</p>
<p>The solution was to take a step back, express the logic of the problem clearly, and redesign the subsystem to reflect that. The problem, once clarified, became this:</p>
<blockquote><p>We have a number of input streams which are merged. For each missing element of the merged stream we take action to fill it in. And then we output the result.</p></blockquote>
<p>The refactored &#8220;as is&#8221; and the eventual &#8220;to be&#8221; logic became much simpler:</p>
<p><img class="aligncenter size-full wp-image-2573" title="Complexity reduced" src="http://niksilver.files.wordpress.com/2012/01/software-design-2.jpg?w=750" alt=""   /></p>
<p>I hope you agree with me that the new flow is much clearer, and additional inputs add only linear complexity.</p>
<p>In terms of software development the sequence of steps was: (1) Make sure all the tests pass, (2) refactor the subsystem to reflect the new logic, (3) make sure all the tests still pass, (4) add the fourth input with appropriate tests.</p>
<p>For me this experience demonstrates a few things:</p>
<ol>
<li>If software internals aren&#8217;t continually kept clean and of good quality then complexity increases excessively and progress slows accordingly. Or to put it another way, technical debt is very well named: the longer you neglect the debt the more interest you pay.</li>
<li>&#8220;Software should be exactly as complex as the problem it&#8217;s addressing&#8221; is a very good driver for reducing complexity.</li>
<li>Automated tests save the day again! The refactoring above would have been quite daunting and unreliable without them. But instead the worst thing about the operation was that it was a little time-consuming. It was not risky, it was not stressful, and it was not really that difficult.</li>
<li>Visual software development tools sure do expose messy software design for what it is.</li>
</ol>
<br />Filed under: <a href='http://niksilver.com/category/software-design/'>Software design</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/2482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/2482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/2482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/2482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/2482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/2482/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/2482/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/2482/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=2482&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2012/01/12/software-complexity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:thumbnail url="http://niksilver.files.wordpress.com/2012/01/software-design-featured.jpg?w=150" />
		<media:content url="http://niksilver.files.wordpress.com/2012/01/software-design-featured.jpg?w=150" medium="image">
			<media:title type="html">software-design-featured</media:title>
		</media:content>

		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2012/01/software-design-1.jpg" medium="image">
			<media:title type="html">Excessive complexity</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2012/01/software-design-2.jpg" medium="image">
			<media:title type="html">Complexity reduced</media:title>
		</media:content>
	</item>
		<item>
		<title>Migrating systems (such as Delicious)</title>
		<link>http://niksilver.com/2011/09/29/migrating-delicious/</link>
		<comments>http://niksilver.com/2011/09/29/migrating-delicious/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 09:26:10 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Planning]]></category>
		<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/?p=1433</guid>
		<description><![CDATA[A few words on rewriting and migrating systems, based on experience. This is because the painful rejuvination of Delicious under Avos is very much at the front of my mind right now &#8212; I&#8217;m both a user caught in the backwash, and also an industry professional who&#8217;s dealt with these things before. While Chad and &#8230; <a href="http://niksilver.com/2011/09/29/migrating-delicious/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=1433&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1434" title="URL-based indirection layer" src="http://niksilver.files.wordpress.com/2011/09/migration-architecture-1.jpg?w=750" alt="URL-based indirection layer"   />A few words on rewriting and migrating systems, based on experience. This is because <a href="http://gigaom.com/2011/09/28/oh-delicious-where-did-it-all-go-so-wrong/">the painful rejuvination of Delicious</a> under Avos is very much at the front of my mind right now &#8212; I&#8217;m both a user caught in the backwash, and also an industry professional who&#8217;s dealt with these things before. While Chad and Steve&#8217;s best known experience is building something new (i.e. YouTube) my experience is more with taking first-generation systems and transforming them into next-generation systems (the parallel with Delicious).</p>
<p>There are a few pertinent lessons:</p>
<ol>
<li>Roll out slowly</li>
<li>Let systems co-exist</li>
<li>Always have a rollback plan</li>
</ol>
<p><strong>1. Roll out slowly</strong></p>
<p>I&#8217;ve <a href="http://niksilver.com/2006/05/12/big-bangs-and-telegraphcouks-redesign/">written before about the almost-inevitable pain of big bang launches</a>, following Telegraph.co.uk&#8217;s update in 2007. Those lessons are true still. The only way to avoid that pain while still having a big bang launch is with a vast amount of additional resources (cost and time), which are rarely worth the value of what you&#8217;re gaining.</p>
<p>An approach with more likely success is to roll out piecemeal, replacing one user feature, or one system component, at a time. This is not sexy for engineers, who typically want greenfield projects and new technology, but nor is it sexy working 18 hour days to fix a torrent of bugs under a hail of angry user feedback.</p>
<p>This approach means breaking up the system into discrete components and replacing those. If the system doesn&#8217;t have such discrete components then the first job is to create them, going through the code and making logical fences. No this isn&#8217;t sexy, but let&#8217;s repeat: neither is working 18 hour days.</p>
<p><strong>2. Let systems co-exist</strong></p>
<p>It&#8217;s a computer science joke that every known software problem can be solved by adding an extra layer of indirection. However, sometimes that&#8217;s also a practical solution. This allows you to build an old and a new system side by side, and funnel specific users/activity/processes/etc to either one. As you build up the capabilities of the new system you can funnel more and more activity to it.</p>
<p><strong><img class="alignright size-full wp-image-1435" title="Internal API for indirection" src="http://niksilver.files.wordpress.com/2011/09/migration-architecture-2.jpg?w=750" alt="Internal API for indirection"   /></strong>Two architecture cast studies:</p>
<p>In the first (Architecture 1, above) we needed to replace a proprietary application server with one over which we had much more control. Critically, the new application server needed to be able to execute the same scripts, of which there were thousands.</p>
<p>Our first-release replacement app server had only the most basic capability, and so could only execute a tiny fraction of the scripts. So we put in a layer of indirection which filtered requests to either the old or the new server. As we enhanced the capability of the of new application server we filtered more and more requests to it, until we were finally able to switch off the old one.</p>
<p>In the second (Architecture 2) we needed to migrate our user data to a new, more flexible database (MongoDB), despite some of the application code being rather old and tied closely to the legacy database. <a href="http://www.slideshare.net/tackers/why-we-chose-mongodb-for-guardiancouk">The solution was to introduce an internal API</a>, ensure all code used that API instead of direct database access, and then add the new database under that. The two systems co-existed for a long time as their capabilities were brought together and tested for consistency.</p>
<p><strong>3. Always have a rollback plan</strong></p>
<p>Once we have a step-by-step approach to moving from one system to another we have to recognise that some steps may not work flawlessly. In this case we have to be able to switch back, because fixing a problem in situ may take too long. This is something that can be built into the indirection layer&#8217;s config system, or into the release mechanism (allowing easy rereleaes of the previous version), or be switchable in the application&#8217;s own config  (<a href="http://code.flickr.com/blog/2009/12/02/flipping-out/">see Flickr&#8217;s approach</a> as one example).</p>
<p><strong>It&#8217;s still difficult</strong></p>
<p>None of this is easy, of course, but it&#8217;s the kind of thing were the effort is in the up-front planning and the initial (possibly time-consuming) prep to tidy up the old system, all for the sake of a smoother rollout. Launches are exciting, but they can be exciting in the intended way at the same time as going boringly to plan.</p>
<p>Meanwhile the folks at Delicious are <a href="http://deliciousengineering.blogspot.com/">slowly restoring many lost features</a>, and I wish them well, because we&#8217;ll all win if they do.</p>
<br />Filed under: <a href='http://niksilver.com/category/planning/'>Planning</a>, <a href='http://niksilver.com/category/software-design/'>Software design</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/1433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/1433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/1433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/1433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/1433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/1433/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/1433/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/1433/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=1433&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2011/09/29/migrating-delicious/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:thumbnail url="http://niksilver.files.wordpress.com/2011/09/migration-architecture-1.jpg?w=100" />
		<media:content url="http://niksilver.files.wordpress.com/2011/09/migration-architecture-1.jpg?w=100" medium="image">
			<media:title type="html">URL-based indirection layer</media:title>
		</media:content>

		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/09/migration-architecture-1.jpg" medium="image">
			<media:title type="html">URL-based indirection layer</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/09/migration-architecture-2.jpg" medium="image">
			<media:title type="html">Internal API for indirection</media:title>
		</media:content>
	</item>
		<item>
		<title>Technology decisions are social decisions</title>
		<link>http://niksilver.com/2011/07/13/social-technology-decisions/</link>
		<comments>http://niksilver.com/2011/07/13/social-technology-decisions/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 07:11:33 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://niksilver.com/?p=1279</guid>
		<description><![CDATA[A couple of things happened recently bringing home something that I&#8217;ve found increasingly important: technology decisions are social. Social decisions in software architecture The other day in conversation about team structures the Guardian&#8217;s lead software architect, Mat Wall, mentioned that architecture is social. This is a good, and often disregarded, observation. In that context he &#8230; <a href="http://niksilver.com/2011/07/13/social-technology-decisions/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=1279&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A couple of things happened recently bringing home something that I&#8217;ve found increasingly important: technology decisions are social.</p>
<p><strong><a href="http://www.flickr.com/photos/worldbank/5094162993/"><img class="alignright size-full wp-image-1285" title="People and technology - Photo by Jonathan Ernst" src="http://niksilver.files.wordpress.com/2011/07/people-computers1.jpg?w=750" alt="People and technology - Photo by Jonathan Ernst"   /></a>Social decisions in software architecture</strong></p>
<p>The other day in conversation about team structures the Guardian&#8217;s lead software architect, <a href="http://twitter.com/#!/matwall">Mat Wall</a>, mentioned that architecture is social. This is a good, and often disregarded, observation. In that context he meant that architectural decisions influence who works with who, what issues they need to sort out together, how they regard their work, and so on. Three examples&#8230;</p>
<p>The Guardian has an API that allows access to its content. That means that when developing an iPhone application the iOS team can work much more closely together, requiring less information about the guts of the back-end, and become more focused on the user experience.</p>
<p>Consider also the team embracing Scala. Our platform lead <a href="http://www.infoq.com/articles/guardian_scala">Graham Tackley has gone on record</a> to say that one consequence of this is that it has &#8220;reinvigorated the team&#8221;. That&#8217;s not the only reason to take up a technology, but it is a significant consideration.</p>
<p>Third, I&#8217;ll relate the story of one of our recent projects. The team devised four candidate architectures and needed to choose between them. The first decision was to make the call in conjunction with the business owner. The second decision was for them to ask not &#8220;which architecture do you prefer?&#8221; but rather &#8220;what do you want your business to look like?&#8221; Because each architecture had a different impact on the end users inside and outside the company: certain things would be difficult, others would be easy, etc.</p>
<p><strong>Social decisions in algorithms</strong></p>
<p>And it&#8217;s not just about architecture and software design. It&#8217;s true also of the more abstract matter of algorithms, as seen by a couple of examples from the masters (or should that be &#8220;slaves&#8221;?) of the algorithm: Google.</p>
<p>The most recent example concerns Google+. <a href="http://techcrunch.com/2011/07/09/scoble-problem-social-networks/">Rocky Agrawal wrote</a>:</p>
<blockquote><p>I finally blocked Robert Scoble in Google+. I have absolutely nothing against Scoble. I quite admire him, actually. He’s a great asset to the startup scene and he works damn hard. I’ve met him a few times and I’m sure we’ll meet again. But he was just getting to be way too much.</p>
<p>My Google+ feed was dominated by him. I tried to take a half-step and just remove Scoble from my circles. But then he became Google’s perpetual #1 suggestion for a new friend.</p></blockquote>
<p>Google have created an algorithm which provides recommendations, and of course highly-referenced people will be recommended more than others. But Robert Scoble&#8217;s star power is clearly so significant it&#8217;s ended up disrupting Rocky&#8217;s experience, and getting in the way of him using the service effectively. Clearly the algorithm needs to be tweaked for the optimum user experience, and how that is done is entirely at the discretion of Google engineers. They could cap the influence of exceptional stars like Scoble if they wanted. They have choices, and ultimately those choices are based on social, human instincts.</p>
<p>The second Google example comes from <a href="http://searchengineland.com/google-bing-is-cheating-copying-our-search-results-62914">the spat earlier this year between the Google search team and Bing</a>. Google noticed that Bing was copying some of its search results; they demonstrated this by deliberately generating irrelevant Google search results for particular nonsense queries, and then observing that the same results appeared in Bing for the same queries; Microsoft said, <a href="http://www.zdnet.com/blog/microsoft/microsoft-we-do-not-copy-googles-results/8557">sure, &#8220;We use multiple signals and approaches&#8221;,</a> including observing what search results people click on, even if those clicks happen to be by Google engineeers conducting a sting operation; Google cried foul; the world moved on.</p>
<p><a href="http://searchengineland.com/bing-why-googles-wrong-in-its-accusations-63279">What was happening</a> was that the Bing toolbar was tracking search results that the user clicked on. If a user had the Bing toolbar installed, did a Google search, and clicked on a link, then the toolbar would send a message back to Bing HQ saying &#8220;Hey, someone thought this link was good for this query&#8221; and Bing would consider that next time it needed to respond to the same query.</p>
<p>I found the whole episode quite amusing and slightly baffling, most notably <a href="http://googleblog.blogspot.com/2011/02/microsofts-bing-uses-google-search.html">these rather indignant words on the Official Google Blog</a>:</p>
<blockquote><p>At Google we strongly believe in innovation and are proud of our search quality. We’ve invested thousands of person-years into developing our search algorithms because we want our users to get the right answer every time they search, and that’s not easy. We look forward to competing with genuinely new search algorithms out there—algorithms built on core innovation, and not on recycled search results from a competitor.</p></blockquote>
<p>To be fair, I think that post was written before Google knew exactly how Bing was doing its job, but even so, they jumped to conclusions. My personal reading of the above is that &#8220;pure&#8221; algorithms using only digital, abstract data are good and acceptable, while algorithms that use human data and feedback from a wide variety of sources are cheating and bad.</p>
<p>Unfortunately that&#8217;s just wrong. Google may like to say they don&#8217;t editorialise and their search results are purely machine-generated. But what they choose to feed into their algorithm, and how they weight those things, is an entirely human affair influenced by very human traits: culture, prejudice, politics and more. That&#8217;s not a critique of Google or its staff; it&#8217;s a critique of human beings.</p>
<p><a href="http://jonathanstray.com/the-editorial-search-engine">Jonathan Stray has made this point, too.</a> He said &#8220;It’s impossible to build a computer system that helps people find or filter information without at some point making editorial judgements.&#8221; And he quoted Matt Cutts of Google: &#8220;In some sense when people come to Google, that’s exactly what they’re asking for — our editorial judgment. They’re expressed via algorithms.&#8221;</p>
<p>So however &#8220;pure&#8221; we think a technical decision might be, ultimately it&#8217;s not. Whether it&#8217;s software architecture, algorithms, or something else, it&#8217;s all influenced by and influences our social world.</p>
<br />Filed under: <a href='http://niksilver.com/category/software-design/'>Software design</a>, <a href='http://niksilver.com/category/technology/'>Technology</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/1279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/1279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/1279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/1279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/1279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/1279/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/1279/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/1279/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=1279&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2011/07/13/social-technology-decisions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:thumbnail url="http://niksilver.files.wordpress.com/2011/07/people-and-technology-featured.jpg?w=141" />
		<media:content url="http://niksilver.files.wordpress.com/2011/07/people-and-technology-featured.jpg?w=141" medium="image">
			<media:title type="html">People and technology</media:title>
		</media:content>

		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/07/people-computers1.jpg" medium="image">
			<media:title type="html">People and technology - Photo by Jonathan Ernst</media:title>
		</media:content>
	</item>
		<item>
		<title>A software proposal to improve estimation</title>
		<link>http://niksilver.com/2011/01/20/estimation-proposal/</link>
		<comments>http://niksilver.com/2011/01/20/estimation-proposal/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 23:00:03 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/?p=925</guid>
		<description><![CDATA[Previously I&#8217;ve talked about estimation, using an example of a project that we were very confident would make a certain amount of revenue. The slight flaw in this approach is that &#8220;very confident&#8221; varies depending on who&#8217;s making the estimate. So here is a proposal for an application to train the user in consistent estimation. &#8230; <a href="http://niksilver.com/2011/01/20/estimation-proposal/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=925&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Previously I&#8217;ve <a href="http://niksilver.com/2011/01/04/better-proposal-figures/">talked about estimation</a>, using an example of a project that we were very confident would make a certain amount of revenue. The slight flaw in this approach is that &#8220;very confident&#8221; varies depending on who&#8217;s making the estimate. So here is a proposal for an application to train the user in consistent estimation. I&#8217;d love to see this running somewhere and looking pretty. &#8220;Improve your estimation&#8221; would be a fun game to play (if you&#8217;re that way inclined). So let me set out&#8230;</p>
<ol>
<li><a href="#point">The point of it</a></li>
<li><a href="#notech">The no-tech solution (and credit)</a></li>
<li><a href="#software">The software proposal</a></li>
</ol>
<p><strong><a name="point"></a>The point of it</strong></p>
<p><a><img class="alignright size-full wp-image-957" title="Sepia Eiffel Tower, by Joanna Kiyoné" src="http://niksilver.files.wordpress.com/2011/01/eiffel1.png?w=750" alt="Sepia Eiffel Tower, by Joanna Kiyoné"   /></a>Here are example situations we want to improve in project proposals:</p>
<ul>
<li>&#8220;I&#8217;m very confident this will bring in $0.5m to $2.5m of new business&#8221;</li>
<li>&#8220;I&#8217;m very confident this change will see no less than a 2% drop-off rate in conversions&#8221;</li>
<li>&#8220;I&#8217;m very confident the addressable market is between 5m and 9m users globally&#8221;</li>
</ul>
<p>We want to turn those into:</p>
<ul>
<li>&#8220;I&#8217;m 90% certain this will bring in $0.5m to $2.5m of new business &#8212; and you can be sure that when I say 90%, I&#8217;m right 90% of the time&#8221;</li>
<li>&#8220;I&#8217;m 95% confident this change will see no less than a 2% drop-off rate in conversions &#8212; and you can be sure that when I say I&#8217;m 95% confident of something I really am right 95% of the time&#8221;</li>
<li>&#8220;I&#8217;m 90% sure the addressable market is between 5m and 9m users globally &#8212; and when I say I&#8217;m 90% sure of something I really am right 90% of the time&#8221;</li>
</ul>
<p>The purpose of the application is to help people really be right 90% of the time when they say they&#8217;re 90% certain &#8212; or any percentage they want.</p>
<p>Estimating well is important for accuracy. This is particularly true when we consider that targets like revenue and reach are actually factors of many other measures (market size, consumer price sensitivity, economic conditions) which are themselves estimated. With estimation piled on estimation it becomes even more important to move from a nebulous &#8220;very confident&#8221; to a concrete &#8220;90% confident&#8221; and so be sure of our bounds of certainty.</p>
<p><strong><a name="notech"></a>The no-tech solution (and credit)</strong></p>
<p>Credit for switching me on to the problem, and for the no-tech solution that follows, is to Doug Hubbard and is part of the narrative of his book <a href="http://howtomeasureanything.com/">How to Measure Anything</a>. What is his approach to getting good at estimating percentage certainty? Have a look at this question:</p>
<p style="padding-left:30px;">What is the height of the Eiffel Tower in feet?</p>
<p>I don&#8217;t suppose you know&#8230; exactly. I certainly don&#8217;t. But we can have a good go at estimating a range with 90% certainty. I am absolutely certain that it&#8217;s taller than me, so it&#8217;s definitely over 6 ft. And I&#8217;m virtually certain that a mile is a thousand-and-something feet, and it must surely be less than a mile high, but let&#8217;s say it&#8217;s less than two miles for safety.</p>
<p>So I&#8217;m 99.9% certain it&#8217;s between 6 ft and 2,000 ft tall. But that&#8217;s too conservative, because we&#8217;re aiming for 90% certainty, not 99.9% certainty. So I&#8217;ve got start using some other tricks. I&#8217;m 6ft 3in, and a house is about six mes tall&#8230; call it 40ft. How many houses tall is the Eiffel Tower? Between six and twenty, I reckon. So between 240 ft and 800 ft. That seems better &#8212; I can sign up to that range with 90% confidence.</p>
<p><a href="http://www.flickr.com/photos/thenandagain/48203378/in/photostream/"><img class="size-full wp-image-952 alignright" title="Spinner, by Darrell Hamilton" src="http://niksilver.files.wordpress.com/2011/01/spinner1.png?w=750" alt="Spinner, by Darrell Hamilton"   /></a>Now let&#8217;s keep going. Answer the following questions,  each with a range you&#8217;re 90% confident of:</p>
<ol>
<li>What is the height of the Eiffel Tower in feet?</li>
<li>In what year was Anne Boleyn born?</li>
<li>What is the population of Tokyo?</li>
<li>How many square miles is Peru?</li>
<li>How many saints did John Paul II canonise?</li>
<li>How many books in the Mister Men series?</li>
<li>What is the weight of the Liberty Bell, in kilograms?</li>
<li>What is the circumference of the moon, in kilometres?</li>
<li>How many square centimetres is the Mona Lisa?</li>
<li>How many patents did IBM lodge in 1999?</li>
</ol>
<p>The aim, of course, is to have 90% of your ranges right. This is what Doug Hubbard calls being &#8220;calibrated&#8221; &#8212; i.e. when we say we&#8217;re <em>x</em>% sure of something we are indeed correct <em>x</em>% of the time.</p>
<p>Unfortunately it&#8217;s not quite as easy as saying we <em>must</em> score 9/10 in the above questions &#8212; we&#8217;re expected to get 9 out of 10 on average, not necessarily 9 of these particular 10 right. So we refer to statistics, and the <a href="http://en.wikipedia.org/wiki/Binomial_distribution">binomial distribution</a> says if we want to be 95% sure that we are calibrated then we can expect to get 8, 9 or 10 out of 10. Similarly&#8230;</p>
<ul>
<li>20 questions implies 17-19 should be right at the 90% level.</li>
<li>25 questions implies 21-24 should be right at the 90% level.</li>
<li>30 questions implies 25-29 should be right at the 90% level.</li>
</ul>
<p>We can calibrate ourselves with true/false questions, too. This time we have add how certain we are of our choice:</p>
<p style="padding-left:30px;">The first Cannes Film Festival was held in 1961. True or false? And how sure are you of your answer: 50%? 60%? 70%? 80%? 90%? Or 100%</p>
<p>Saying we are 50% sure means we have no idea &#8212; equivalent to the flip of a coin. 100% means we&#8217;re absolutely certain. If we answer five questions with certainties of 60%, 60%, 50%, 90% and 80% then we expect on average we&#8217;ll get 0.6 + 0.6 + 0.5 + 0.9 + 0.8 = 3.4 out of 5. If we want to be 95% sure that we are indeed calibrated then (if my maths is right) we should expect to get 2, 3, or 4 out of 5. This is clearly too wide a margin to be informative so in reality we should again be answering 20 or 30 questions at a time.</p>
<p>By putting in a feedback loop we can improve. We answer 30 questions, find out if we&#8217;re over-cautious or under-cautious in our estimating, then consciously compensate while we try answering another 30 questions. And so on until we start hitting our targets.</p>
<p><img class="size-full wp-image-947 alignright" title="Chippewa Country info box" src="http://niksilver.files.wordpress.com/2011/01/chippewa1.png?w=750" alt="Chippewa Country info box"   />There are also tricks to helping us judge our understanding of 90% confidence. Again, I&#8217;m taking my queue from Doug Hubbard. Take a look at a wheel with a one-tenth slice marked out and a spinnable needle in the centre. If we are 90% confident of something then we should be equally confident that we can risk £5 that a spin of the needle will end up in the larger zone (if it ends up in the smaller slice we lose our money). If we would rather spin the needle then we&#8217;re less than 90% confident of our assertion and should widen our range; if we&#8217;d prefer to stick with our assertion then we&#8217;re more than 90% confident and should narrow our range; it&#8217;s only when we think we&#8217;d be equally happy with one or the other that we&#8217;ve got to 90% confidence.</p>
<p>This seems to be worth trying with each question whenever in doubt.</p>
<p>I think being good at estimating like this would be a cool party trick. Especially if we go to the parties held by our local maths department. Now the only question is: where do we find an endless source of semi-obscure questions? This brings us to&#8230;</p>
<p><strong><a name="software"></a>The software solution</strong></p>
<p>The proposal, then, is for an application which automates this estimation training:</p>
<ol>
<li>How many questions would you like to answer? 10, 20, 30&#8230;? And would you like questions about ranges or true/false questions?</li>
<li>Here are the questions, enter your answers. (If you want help with an answer you can pop up a wheel with a suitably-proportioned slice marked out &#8212; do you prefer your answer or prefer to spin the wheel? Now you can rethink your answer in the light of that.)</li>
<li>Feedback: You got this many right, which was/wasn&#8217;t what we expected for someone who is a good estimator. You&#8217;re over/under/correctly confident so you need to adjust accordingly/congratulate yourself. Now let&#8217;s go again&#8230;</li>
</ol>
<p>I imagine this would look nice with now-de-rigueur CSS3, pastel colours and big shiny buttons with rounded corners. And a good source of questions is Wikipedia.</p>
<p>In particular the info box on the right hand side of a many articles is good source of stark facts &#8212; for example, the one for <a href="http://en.wikipedia.org/wiki/Chippewa_County,_Minnesota">Chippewa County, Minnesota</a>. There are some good range-type questions to be extracted from this: total area in square kilometres, population as of 2000, year of founding. There are also some good true/false questions (largest city, date founded) but only if we can find a reasonable-sounding false answers.</p>
<p>That last problem can be solved like this: First, at the bottom of the page find a list in which this subject appears. In this case Chippewa appears in a list of counties. Then find another item in the same list &#8212; say, <a href="http://en.wikipedia.org/wiki/Murray_County,_Minnesota">Murray County</a> &#8212; and go to that page and find its info box. Now we can compare the same aspects of Chippewa and Murray (largest city, date founded, timezone) with different values (largest city and date founded are different; but avoid timezone as it&#8217;s the same for both) and swap them randomly.</p>
<p><img class="alignright size-full wp-image-946" title="Murray County info box" src="http://niksilver.files.wordpress.com/2011/01/murray1.png?w=750" alt="Murray County info box"   />The list these two subjects were drawn from (Counties), the heading of that list (State of Minnesota) and the aspect selected from the info box (largest city, etc) provide a reasonable way to present the question, since English-language question generation looks a bit tricky. We end up with something like:</p>
<ul>
<li>Answer these questions with 90% confidence:
<ul>
<li>State of Minnesota &gt; Counties &gt; Chippewa County, Minnesota &gt; Area &#8211; Total &gt; &#8230;&#8230;. to &#8230;&#8230; km<sup>2</sup></li>
<li>&#8230;</li>
</ul>
</li>
<li>Answer these questions as true or false, and state your confidence:
<ul>
<li>State of Minnesota &gt; Counties &gt; Murray County, Minnesota &gt; Founded &gt; February 20, 1862. True or false? 50%? 60%? 70%? 80%? 90%? 100%?</li>
<li>&#8230;</li>
</ul>
</li>
</ul>
<p>There are still some flaws with this. You have to go through quite a lot of random Wikipedia pages before you find one with a decent info box. And sometimes whether the info in the info box is true or false is too obvious:</p>
<ul>
<li>State of Minnesota &gt; Counties &gt; Chippewa County, Minnesota &gt; Named for &gt; Chippewa Indians, Chippewa River. True or false? 50%? 60%? 70%? 80%? 90%? 100%?</li>
<li>State of Minnesota &gt; Counties &gt; Murray County, Minnesota &gt; Website &gt; www.co.chippewa.mn.us. True or false? 50%? 60%? 70%? 80%? 90%? 100%?</li>
</ul>
<p>Maybe we should restrict the subjects to some known areas (books, US states, composers,&#8230;) and not look in the entire pool of Wikipedia articles. And maybe some kind of text matching might help avoid the embarrassingly obvious true/false questions.</p>
<p>Or maybe you can think of a better source of questions.</p>
<p>If so, there&#8217;s a very useful service just waiting to be created&#8230;</p>
<p><strong>Footnote</strong></p>
<p>Where to find answers to the above questions&#8230;</p>
<ol>
<li><a href="http://www.discoverfrance.net/France/Paris/Monuments-Paris/Eiffel.shtml">http://www.discoverfrance.net/France/Paris/Monuments-Paris/Eiffel.shtml</a></li>
<li><a href="http://www.bbc.co.uk/history/historic_figures/boleyn_anne.shtml">http://www.bbc.co.uk/history/historic_figures/boleyn_anne.shtml</a></li>
<li><a href="http://www.metro.tokyo.jp/ENGLISH/PROFILE/overview03.htm">http://www.metro.tokyo.jp/ENGLISH/PROFILE/overview03.htm</a></li>
<li><a href="http://www.wolframalpha.com/input/?i=how+many+square+miles+is+peru%3F">http://www.wolframalpha.com/input/?i=how+many+square+miles+is+peru%3F</a></li>
<li><a href="http://en.wikipedia.org/wiki/Pope_John_Paul_II">http://en.wikipedia.org/wiki/Pope_John_Paul_II</a></li>
<li><a href="http://www.themistermen.co.uk/mrmen.html">http://www.themistermen.co.uk/mrmen.html</a></li>
<li><a href="http://history.howstuffworks.com/revolutionary-war/liberty-bell.htm">http://history.howstuffworks.com/revolutionary-war/liberty-bell.htm</a></li>
<li><a href="http://solarsystem.nasa.gov/planets/profile.cfm?Display=Facts&amp;Object=Moon">http://solarsystem.nasa.gov/planets/profile.cfm?Display=Facts&amp;Object=Moon</a></li>
<li><a href="http://en.wikipedia.org/wiki/Mona_Lisa">http://en.wikipedia.org/wiki/Mona_Lisa</a></li>
<li><a href="http://www-03.ibm.com/press/us/en/pressrelease/1920.wss">http://www-03.ibm.com/press/us/en/pressrelease/1920.wss</a></li>
</ol>
<br />Filed under: <a href='http://niksilver.com/category/software-design/'>Software design</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/925/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/925/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/925/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/925/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/925/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/925/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/925/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/925/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=925&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2011/01/20/estimation-proposal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/01/eiffel1.png" medium="image">
			<media:title type="html">Sepia Eiffel Tower, by Joanna Kiyoné</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/01/spinner1.png" medium="image">
			<media:title type="html">Spinner, by Darrell Hamilton</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/01/chippewa1.png" medium="image">
			<media:title type="html">Chippewa Country info box</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2011/01/murray1.png" medium="image">
			<media:title type="html">Murray County info box</media:title>
		</media:content>
	</item>
		<item>
		<title>QCon London 2009: A few lessons learned</title>
		<link>http://niksilver.com/2009/03/18/qcon-london-2009-a-few-lessons-learned/</link>
		<comments>http://niksilver.com/2009/03/18/qcon-london-2009-a-few-lessons-learned/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 21:10:09 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/?p=394</guid>
		<description><![CDATA[Last week I attended QCon London 2009, which was characteristically excellent &#8212; and I know my colleagues who attended thought the same. Most excitingly this year two of the Guardian development team were invited to give presentations on our most recent work building a large content management system for a very large website. I don&#8217;t &#8230; <a href="http://niksilver.com/2009/03/18/qcon-london-2009-a-few-lessons-learned/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=394&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/pigsaw/3360511363/"><img class="alignright" title="Mat Wall explains content and tags" src="http://farm4.static.flickr.com/3655/3360511363_a165409981.jpg" alt="" width="500" height="375" /></a>Last week I attended <a href="http://qconlondon.com/">QCon London 2009</a>, which was characteristically excellent &#8212; and I know my colleagues who attended thought the same. Most excitingly this year two of the Guardian development team were invited to give presentations on our most recent work building a large content management system for a very large website. I don&#8217;t mind admitting that I learnt one or two things from attending those talks; I also found <a href="http://qconlondon.com/london-2009/presentation/Forging+ahead+-+Scaling+the+BBC+into+Web%2F2.0">the presentation on the BBC&#8217;s architecture</a> fascinating. Here are some of the things I took away&#8230;</p>
<p><strong>Mat Wall on <em>The evolving Guardian.co.uk architecture</em></strong></p>
<p>Mat&#8217;s presentation was structured around rebuilding guardian.co.uk over many months and dealing with the scalability issues that were presented at various stages. Some of the many insights were presented in a deliberately provocative way, such as this one:</p>
<blockquote><p>Developers try to complicate things; architects simplify them.</p></blockquote>
<p>I&#8217;m not entirely sure about the first part, but it&#8217;s certainly true that over-engineering is a much more common trait than under-engineering. The second part, though, is very important. It&#8217;s something I&#8217;ve always known, but never quite in that pithy way. It&#8217;s a useful phrase to tuck away for future reference.</p>
<p>And if you think Mat wasn&#8217;t feeling too good towards developers, don&#8217;t worry, because he also put up a slide saying</p>
<blockquote><p>Developers are better than architects.</p></blockquote>
<p>The message behind this is that it&#8217;s the developers who are working on the code each day &#8212; they know what&#8217;s possible and what not, and what&#8217;s reasonable and what&#8217;s not. So it&#8217;s important to trust them when they say they can or can&#8217;t do something.</p>
<p><strong>Dirk-Willem van Gulik on <em>Forging ahead &#8211; Scaling the BBC into Web/2.0</em></strong></p>
<p>Dirk-Willem talked about the programme to re-engineer the BBC websites to enable greater scalability and dynamic content. In an organisation the size and complexity of the BBC you need to spend more time thinking about people than the technology. One of his first slides underlined this by presenting the seven layers of <a href="http://en.wikipedia.org/wiki/OSI_model">the OSI model</a> (physical up to application) and then said</p>
<blockquote><p>But most people forget there are two layers on top of that: level 8, the organisation, and level 9, its goals and objectives.</p></blockquote>
<p>From that point on he kept referring to something being &#8220;an L8 problem&#8221; or &#8220;a level 9 issue&#8221;. It was a powerful reminder that technology work is about much, much more than technology.</p>
<p>Another great insight was how much they have chosen to use the simplest of standard internet protocols to join various layers and services within their network &#8212; even when those layers and services are organisation- and application-specific. This ties back to Mat&#8217;s point about an architect&#8217;s job being one of simplification.</p>
<p><strong>Phil Wills on <em>Rebuilding guardian.co.uk with DDD</em></strong></p>
<p>Phil talked about the role domain driven design has played for us. He also pointed out various lessons that there were learnt along the way, such as the importance of value objects, and the fact that &#8220;database tables are not the model &#8212; I don&#8217;t know how many times I can say this.&#8221;</p>
<p>But it was only a day or two after his presentation that I was struck by a remarkable thing: Phil referred so many times to specific members of the team, and talked about contributions they had made to the software design process, even though the people he was talking about were generally not software developers. He put their pictures up on the screen, he named them, he told stories about how they had shaped key ideas. This was an important reminder to me that being close to our users and stakeholders on a day-to-day basis is incredibly important to the health of our software.</p>
<p><strong>Walking away</strong></p>
<p>I didn&#8217;t get to see as much at QCon as I&#8217;d like to have done, although I dare say most people will say that, even if they went to as many sessions as was physically possible. But what I did see was fascinating and thought-provoking, even when it came from people I work with every day.</p>
<br />Posted in Software design  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/394/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/394/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/394/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/394/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/394/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/394/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/394/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/394/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=394&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2009/03/18/qcon-london-2009-a-few-lessons-learned/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3655/3360511363_a165409981.jpg" medium="image">
			<media:title type="html">Mat Wall explains content and tags</media:title>
		</media:content>
	</item>
		<item>
		<title>An ABC of R2: D is for domain driven design</title>
		<link>http://niksilver.com/2008/11/21/an-abc-of-r2-d-is-for-domain-driven-design/</link>
		<comments>http://niksilver.com/2008/11/21/an-abc-of-r2-d-is-for-domain-driven-design/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 09:30:55 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Guardian.co.uk]]></category>
		<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/?p=164</guid>
		<description><![CDATA[&#8230;which Mat Wall and I have written about extensively before, However, for this piece let me say this&#8230; When you have a huge number of people for whom you are building software (1500 staff, 20 million unique users, and an entire wired economy influencing which way you should go next) then simply following instructions is &#8230; <a href="http://niksilver.com/2008/11/21/an-abc-of-r2-d-is-for-domain-driven-design/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=164&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-166" title="r2-alphabet-d" src="http://niksilver.files.wordpress.com/2008/11/r2-alphabet-d1.jpg?w=750" alt=""   />&#8230;which Mat Wall and I have <a href="http://www.infoq.com/articles/ddd-evolving-architecture">written about extensively before</a>, However, for this piece let me say this&#8230;</p>
<p>When you have a huge number of people for whom you are building software (1500 staff, 20 million unique users, and an entire wired economy influencing which way you should go next) then simply following instructions is insufficient, because your users&#8217; demands will change and evolve over time &#8212; even if not during the current project then certainly before Version Two. So to minimise the cost of those changes you need to understand the way your users are thinking.</p>
<p>That&#8217;s where domain driven design (DDD) comes from. It&#8217;s about taking the concepts in your users&#8217; heads and embedding them straight into the software you&#8217;re writing. And then when those concepts evolve and change the cost of changing your software is directly proportional to the mental shift that your users are making. When your users say &#8220;I want to make a small change&#8221; then usually it&#8217;s a small cost; if they propose a big change then they should understand when you walk them through all the implications.</p>
<p>For the R2 project we used DDD from the start, and it was key to many of our successes: when we discovered new opportunites which arose only from direct use of what we had implemented, then DDD allowed us to realise them.</p>
<p>Take, for example, the idea of &#8220;tone&#8221; &#8212; the principle that we should be able to categorise content by its &#8220;voice&#8221; or &#8220;style&#8221; (well, its tone). Its tone might be obituary, blog post, match report, and so on. The vague notion of this had been around since the start of the project, but we hadn&#8217;t settled on many details, let alone how to implement them. But after a few releases, and when the software started getting real use, it became apparent that applying a tone should be very like applying a keyword. Suddenly things fell into place. The functional requirements were clear, as were the implementation details. Tone has become a very powerful feature (here are <a href="http://www.guardian.co.uk/tone/obituaries">all our obituraries</a>, <a href="http://www.guardian.co.uk/tone/blog">all our blog posts</a>, <a href="http://www.guardian.co.uk/tone/matchreports">all our match reports</a>,&#8230;) yet it was a relatively straightforward piece of work because it was, in the end, a relatively intuitive idea.</p>
<p>Of course, domain driven design has a lot more to it than I&#8217;ve described here, and our use of it has been much deeper than feature implementation. If you&#8217;re lucky enough to be going to <a href="http://qconsf.com/">QCon San Francisco</a> then today you can see our software architect Phil Wills presenting a lot more detail there.</p>
<br />Posted in Guardian.co.uk, Software design  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=164&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2008/11/21/an-abc-of-r2-d-is-for-domain-driven-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2008/11/r2-alphabet-d1.jpg" medium="image">
			<media:title type="html">r2-alphabet-d</media:title>
		</media:content>
	</item>
		<item>
		<title>Lightweight versus heavyweight: The cost is in the management</title>
		<link>http://niksilver.com/2007/12/27/lightweight-versus-heavyweight-the-cost-is-in-the-management/</link>
		<comments>http://niksilver.com/2007/12/27/lightweight-versus-heavyweight-the-cost-is-in-the-management/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 15:05:54 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/2007/12/27/lightweight-versus-heavyweight-the-cost-is-in-the-management/</guid>
		<description><![CDATA[A recent conversation with a colleague got me thinking about so-called &#8220;lightweight&#8221; systems, and when they become more trouble then they&#8217;re worth. He was frustrated by some problems he was having; even more so, he explained, because he thought he was dealing with something that was &#8220;lightweight&#8221;. It&#8217;s a seductive word, and sometimes &#8212; as &#8230; <a href="http://niksilver.com/2007/12/27/lightweight-versus-heavyweight-the-cost-is-in-the-management/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=73&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A recent conversation with a colleague got me thinking about so-called &#8220;lightweight&#8221; systems, and when they become more trouble then they&#8217;re worth. He was frustrated by some problems he was having; even more so, he explained, because he thought he was dealing with something that was &#8220;lightweight&#8221;. It&#8217;s a seductive word, and sometimes &#8212; as with other forms of seduction &#8212; when you get more involved than you should things can get a bit sticky.</p>
<p>This article is an attempt to explain what lightweight really means, both in terms of benefits and drawbacks. There are also a couple of comparative examples from my own experience.</p>
<p><strong><img align="right" alt="A lightweight system (plus management support)" title="A lightweight system (plus management support)" src="http://niksilver.files.wordpress.com/2007/12/lightweight-system2.jpg?w=750" />Lightweight doesn&#8217;t mean simple</strong></p>
<p>People often mistake &#8220;lightweight&#8221; to mean simple or quick. But this can&#8217;t be right, because everyone wants simple and quick, and if it really meant this no-one would use anything else. Every website would be rewritten with the <a href="http://www.infoworld.com/article/07/08/31/Less-is-more-for-Ruby-on-Rails-inventor-says_1.html">lightweight Ruby on Rails</a> and every application would be sitting on top of the <a href="http://www.guardian.co.uk/technology/2007/jun/21/it.guardianweeklytechnologysection">lightweight SQLite database</a>. Who wouldn&#8217;t? Who doesn&#8217;t want simple? Who doesn&#8217;t want quick?</p>
<p>Lightweight is often good, but it must have its tradeoffs, otherwise other technologies wouldn&#8217;t exist.</p>
<p>From the examples below I see lightweight as offering low cost in return for low demands, high cost for high demands. Heavyweight is disproportionately high cost for low demands, but low cost for high demands.</p>
<p>Lightweight carries low inherent management costs. But some situations require a high degree of management control whether you like it or not. That means that if a lightweight system needs to scale up you have to wrest management from it and maintain it externally. If you can do that then the lightweight system continues to work, but if the lightweight system will not relinquish management control, or if you don&#8217;t have the discipline to keep the management going, then it won&#8217;t be effective in the long run. By contrast heavyweight systems impose management and structure of their own. This is good if you&#8217;re going to need it, as it takes the pressure of discipline off you, but it&#8217;s not effective if you didn&#8217;t need that management structure in the first place.</p>
<p>To illustrate this, here are a couple of lightweight/heavyweight comparison case studies&#8230;</p>
<p><strong>Language example: TCL and Java<br />
</strong></p>
<p>TCL is a lightweight language. You get to write <a href="http://www.ntecs.de/old-hp/uu9r/lang/html/tcl.en.html">Hello World in one line</a>, it doesn&#8217;t force much structure on you, and it&#8217;s <a href="http://www.psg.com/~joem/tcl/iotcc.html">pretty relaxed about how it&#8217;s written</a>.</p>
<p>TCL is so good, in fact, that was the basis of the original Guardian Unlimited website. We built Ajax-style tools with it before Ajax was known as a concept, we generated our front page from it, we used it to integrate with our ad server.</p>
<p>But as our site grew the language didn&#8217;t scale with it. Clever shortcuts implemented by earlier developers confused newer developers because they obscured the purpose of the code. The lack of an imposed structure meant every foray into older code involved learning its idiosyncracies from scratch. Development slowed down as we worked around older code. And when we wanted to redesign the website we found that through years of lightweight flexibility we had allowed ourselves to be tied into knots: it would be more effective to start again than to work with what we had.</p>
<p>In fact, for the most part we&#8217;re now using Java&#8230;</p>
<p>In contrast to TCL, Java is pretty heavyweight. Not only does <a href="http://javascript.about.com/library/bltut01.htm">Hello World require three lines</a> (excluding any lines with just braces), but its philosophy of structure and layering percolates through from the core language to most of its add-ons. For example, to parse an XML document you have to <a href="http://www.cafeconleche.org/books/xmljava/chapters/ch09s06.html#d0e14951">drill through two abstraction layers</a> before you can find the parser.</p>
<p>One Java framework that maintains this ethos is Hibernate, used for database access. <a href="http://www.hibernate.org/hib_docs/reference/en/html/architecture.html">Its architecture is complicated</a>, and as usual this is to offer flexibility without relinquishing manageability. Recently a forthcoming release of the Guardian Unlimited website was failing its pre-production performance tests. Our developers tracked down a major cause of the problem to an inefficient query within Hibernate. They extracted some of the query&#8217;s logic up into the application layer and simplified what remained, rebalancing the work between the application and the database. Problem solved, performance restored. What&#8217;s relevant to our story is that the developers did this entirely within the archicture of Hibernate, so they didn&#8217;t compromise the design of the application and therefore didn&#8217;t add complexity.</p>
<p><strong>CMS example: WordPress and the GU CMS</strong></p>
<p>Over on ZDNet Larry Dignan extolls the virtues of WordPress and says, effectively, <a href="http://blogs.zdnet.com/BTL/?p=7366">&#8220;What have big content management systems ever done for us?&#8221;</a></p>
<p>WordPress is the lightweight CMS I&#8217;ve chosen for this blog, and I&#8217;m very happy with it. It&#8217;s easy to install, requires almost zero maintenance, and lets me focus on the writing. And yet I&#8217;m a strong advocate of the home-grown CMS we have for our journalists and subs on the Guardian Unlimited site. Is lightweight not good enough for our journalists? What has a big CMS ever done for us?</p>
<p>Well, I just looked at a current article on guardian.co.uk: <a href="http://www.guardian.co.uk/environment/2007/dec/22/climatechange.carbonemissions">&#8220;Ministers ordered to assess climate cost of all decisions&#8221;</a>. It was created with our big CMS. What&#8217;s there that WordPress couldn&#8217;t deliver?</p>
<p>For a start it&#8217;s got a list of linked subjects down the side, which aren&#8217;t the same as WordPress&#8217;s tags because they&#8217;re tightly managed to ensure consistency and reliability. These subjects are also categorised, so Pollution and Climate Change are subjects under Environment, while Green politics is a subject under Politics. As I write this, I note also that the <a href="http://www.guardian.co.uk/environment/pollution">pages for Pollution</a> and <a href="http://www.guardian.co.uk/environment/climatechange">Climate Change</a> are designed differently, with Climate Change being more pictorial and feature-led. Subject categorisations and subject-specific designs are beyond what WordPress&#8217;s tags do.</p>
<p>Okay, so apart from the linked subjects, the categorisations, and the subject-specific designs, what has a big CMS ever done for us? I suppose it&#8217;s worth mentioning the related advertising, which as write includes a large ad for environmentally-friendly washing liquid. There are other contextual commercial elements, too, such as the sponsored features, links to green products and books, and offers of reducing energy bills and offsetting carbon emissions. And there are related articles and related galleries. And details of the article history, listing when and where it was first published, on what page and in what newspaper section.</p>
<p>Okay, so apart from the linked subjects, the categorisations, the subject-specific designs, the related advertising, the contextual sponsored features, the links to relevant products and books, the complementary offers, the related articles, the related galleries, and the article history, what has a big CMS ever done for us?</p>
<p>Well, I suppose it is <a href="http://www.pressgazette.co.uk/story.asp?sectioncode=1&amp;storycode=39814&amp;c=1">serving to over 17 million unique users a month&#8230;</a></p>
<p>I&#8217;ll stop now. The point is a lightweight CMS such as WordPress could probably do any one of these things, with a bit of work. But it isn&#8217;t designed to do anywhere near all of them. And each time it&#8217;s changed to do one more of these things the more it is moved away from its core architecture and it gets closer to a point of paralysis, where nothing functions well anymore because no part of it is doing what it was designed to do. A bit like the TCL example.</p>
<p><strong>Looking back</strong></p>
<p>Reviewing these two examples, it&#8217;s clear that the lightweight systems became, or would become, very costly when they were pushed beyond their initial expectations. In both cases the corresponding heavyweight systems came with their own (heavy) management structure, but that management structure ensures lower running costs.</p>
<p>In the Hibernate example our software maintained its architecture after we&#8217;d made our performance change; anyone looking at this new code would be able to rely on previous knowledge to understand what was going on. By contrast, anyone coming fresh to a snippet of old TCL code would be starting from scratch, regardless of how much of the other TCL code they&#8217;d seen.</p>
<p>Similarly, the large-scale content management system at GU is internally consistent, despite its vast range of features and functionality. Once someone has learnt the principles (which, admittedly, are non-trivial) they can get to work on pretty much any part of it. Pushing WordPress to do that would have created a monster.</p>
<p>Lightweight systems take the management away from you. And that&#8217;s ideal, as long you don&#8217;t need that manageability.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/niksilver.wordpress.com/73/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/niksilver.wordpress.com/73/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/73/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/73/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/73/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=73&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2007/12/27/lightweight-versus-heavyweight-the-cost-is-in-the-management/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2007/12/lightweight-system2.jpg" medium="image">
			<media:title type="html">A lightweight system (plus management support)</media:title>
		</media:content>
	</item>
		<item>
		<title>Anti-features</title>
		<link>http://niksilver.com/2007/10/06/anti-features/</link>
		<comments>http://niksilver.com/2007/10/06/anti-features/#comments</comments>
		<pubDate>Sat, 06 Oct 2007 16:38:00 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/2007/10/06/anti-features/</guid>
		<description><![CDATA[Sometimes you can trust too much. Wherever I&#8217;ve worked I&#8217;ve been involved in a few examples where we listened to the customer, trusted them to know what they wanted, given it to them, and they&#8217;ve regretted it. We have delivered anti-features. Most recently at Guardian Unlimited our (previous) homepage had clever layout rules whose logic &#8230; <a href="http://niksilver.com/2007/10/06/anti-features/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=63&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sometimes you can trust too much. Wherever I&#8217;ve worked I&#8217;ve been involved in a few examples where we listened to the customer, trusted them to know what they wanted, given it to them, and they&#8217;ve regretted it. We have delivered <em>anti-features</em>.</p>
<p><img align="right" title="A lamp with slightly too many features" alt="A lamp with slightly too many features" src="http://niksilver.files.wordpress.com/2007/10/excessive-lamp1.jpg?w=750" />Most recently at Guardian Unlimited <a href="http://www.sortroom.net/index.php/archives/2007/05/12/the-guardian-tidies-its-online-house-a-digital-redesign/">our (previous) homepage</a> had clever layout rules whose logic sometimes overrode the content that editors entered. The result was that editors were often confused that the page didn&#8217;t render according to what they had put in the system. The clever layout rules had been devised by close collaboration with the original editors and graphic designers &#8212; the expert users. They reasoned that they didn&#8217;t want anyone to unbalance the layout by entering inappropriate combinations of text and images.</p>
<p>But these layout rules had been forgotten over time, hence the confusion years later. Consequently the tech team was often called up regarding a supposed bug (&#8220;I&#8217;ve put this image in but it doesn&#8217;t appear&#8221;), and effort was expended only to discover that it was in fact a feature &#8212; much to the caller&#8217;s amazement. Our micro-lesson there was to give the end users the freedom they naturally expected, including the freedom to decide for themselves what was a balanced layout. If what they produced was unbalanced then the designers would steer them back in the right direction &#8212; a much more human corrective.</p>
<p>Those clever layout rules were an anti-feature. They were additional functionality that actually made users&#8217; lives worse. Eventually we removed them.</p>
<p>Anti-features happen in highly experienced mega-corporations, too. In November 2006 Joel O&#8217;Software started what became known as &#8220;the Windows shutdown crapfest&#8221;. <a href="http://www.joelonsoftware.com/items/2006/11/21.html">He compared</a> the three shutdown options of Apple&#8217;s OS X with the astonishing nine or more shutdown options of Microsoft&#8217;s Windows Vista. Not only is that confusing for the user, but it was also incredibly painful to develop &#8212; Moishe Letvinn, a former Microsoft engineer, tells <a href="http://moishelettvin.blogspot.com/2006/11/windows-shutdown-crapfest.html">the sorry story</a>.</p>
<p>But at least the Vista shutdown anti-feature made the problem visible. In the layout logic example, and others I know of, there is silent intelligence at work that leads to confusion and frustration without giving the user any visibility at all of what&#8217;s going on.</p>
<p>Anti-features are time-consuming to build in, because any features are time-consuming to build in. But anti-features also consume additional time in their removal.</p>
<p>One way to prevent anti-features is to help the end user determine the long-term consequences of what they want. Of course, you&#8217;d hope they&#8217;d think of that themselves, but you can&#8217;t avoid your responsibilities to the project as a whole if you see something that others have missed.</p>
<p>Another way is to adhere even more fervently to the Agile mantras of delivering early (before every last sub-feature is there), keeping it simple, and focusing ruthlessly on only the highest value work. This way we deliver first a front page without clever corrective layout logic, or one or two shutdown options only, and consider further enhancements later if we find we need them. Suggesting and doing this is easier said than done, of course, but if everyone trusts each other to listen honestly to what they have to say then it&#8217;s more likely the decisions made will be the best ones.</p>
<p>Meanwhile we can at least ask ourselves each time: Is this a feature or an anti-feature?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/niksilver.wordpress.com/63/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/niksilver.wordpress.com/63/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/63/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=63&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2007/10/06/anti-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2007/10/excessive-lamp1.jpg" medium="image">
			<media:title type="html">A lamp with slightly too many features</media:title>
		</media:content>
	</item>
		<item>
		<title>There&#8217;s nothing so permanent as temporary</title>
		<link>http://niksilver.com/2007/09/23/theres-nothing-so-permanent-as-temporary/</link>
		<comments>http://niksilver.com/2007/09/23/theres-nothing-so-permanent-as-temporary/#comments</comments>
		<pubDate>Sun, 23 Sep 2007 20:10:03 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/2007/09/23/theres-nothing-so-permanent-as-temporary/</guid>
		<description><![CDATA[An aphorism I heard recently seems to be particularly memorable: &#8220;there&#8217;s nothing so permanent as temporary&#8221;. However, it wasn&#8217;t originally referring to software &#8212; it comes from a builder who is rebuilding the kitchen of friends. He&#8217;s from Azerbaijan, and my friends are fond of quoting him in full, to give the words maximum colour: &#8230; <a href="http://niksilver.com/2007/09/23/theres-nothing-so-permanent-as-temporary/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=61&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img align="right" title="Temporary workaround" alt="Temporary workaround" src="http://niksilver.files.wordpress.com/2007/09/temporary-workaround2.jpg?w=750" />An aphorism I heard recently seems to be particularly memorable: &#8220;there&#8217;s nothing so permanent as temporary&#8221;. However, it wasn&#8217;t originally referring to software &#8212; it comes from a builder who is rebuilding the kitchen of friends. He&#8217;s from Azerbaijan, and my friends are fond of quoting him in full, to give the words maximum colour: &#8220;As we say in Azerbaijan, there&#8217;s nothing so permanent as temporary&#8221;.</p>
<p>It is, however, as relevant to software as it is to building (and probably to many other areas of life). The constant pressure to deliver means there is very rarely the opportunity to go back and improve a nasty historical workaround which is causing problems today. However, there are some strategies we might consider&#8230;</p>
<p><strong>1. Automated testing</strong></p>
<p>If the nasty programmatic stickytape is relatively small then a comprehensive suite of automatic tests should enable you to make the change relatively safely and painlessly. Of course, you need to have built up that suite of tests in the first place. And the &#8220;relatively small&#8221; caveat is important, because only then can the software people fit the replacement activty into their daily work without disrupting any schedules. If there&#8217;s no external change then this is an example of refactoring.</p>
<p>If the nasty workaround isn&#8217;t so small, but really does need replacing, then a much more concerted effort is needed. A plan needs to be carefully devised which allows slow piecemeal replacement. The point of the plan should be to take baby steps towards the end goal; each step should also leave the system in a stable state, because you never know when you might have to delay implementing any subsequent step. However, if everyone in the team knows the plan then the end goal can be achieved with minimum disruption to the business&#8217;s schedules.</p>
<p><strong>2. Act like a trusted professional</strong></p>
<p>I find trust and transparency is an increasing part of the software projects I&#8217;m involved with. Part of this is that the technical people want to give their customers options, and are keen to explain the pros and cons, so an informed decision can be made.</p>
<p>However, while this is usually excellent, there can be times when it is too much or undesirable. Stakeholders don&#8217;t necessarily want to be given options for every single thing, and sometimes it&#8217;s right for a technologist to make an executive decision without referring back &#8212; because they&#8217;re a professional, and because they are trusted (and employed) to be professional. In this regard it&#8217;s sometimes the responsibility of a technologist not even to entertain the possibility of a temporary workaround knowing it will become permanent.</p>
<p>The decisions I&#8217;ve been close to in this regard tend to be architecture or technology decisions. For example, in my current work we have, roughly speaking, legacy technologies and modern technologies. Sometimes a feature requirement would arise which is quicker to implement in the legacy technology &#8212; but of course we knew it would be more costly in the long run. If the difference in timescales was not wildly divergent then I&#8217;d encourage my team to choose the modern technology and not to offer up a choice. These days I need to do that much less, because by building up that base of modern technology it&#8217;s now easier to expand and extend that for future features. By making hard decisions in our professional capacity earlier on we&#8217;ve made it easier to make the right decisions in the future.</p>
<p><strong>3. Bite the bullet</strong></p>
<p>A third way to remove the temporary workaround is to just be honest about the work involved and the cost to the business. Easier said than done, but an open and frank discussion followed by adjustment and agreement will ensure the issue is examined properly and supported more widely.</p>
<p>One example I remember is a particularly troublesome database table. Originally conceived as an optimisation with a few hundred rows, it grew over time to be a real albatross, slowing both development and production work, and running to over 19 million rows. However, we couldn&#8217;t replace it without a lot of effort, because its tentacles were everywhere; we needed to schedule real time for it, and that would mean less time for other, more visible, work.</p>
<p>But when we presented the plan, two things sugared the pill. First, we had long cited the table as the reason for previous work taking longer than anyone would like, so the cost of its presence was already felt tangibly. Second, we ensured our plan was broken down using the &#8220;baby steps&#8221; approach outlined above &#8212; it would take a long time, but it would take out no more than 10% of our resources at any moment, and we could always suspend work for a period if absolutely necessary. The plan won support, was executed, and after several months our DBA typed the SQL &#8220;drop&#8221; command and we popped a bottle of champagne.</p>
<p><strong>Meanwhile, back in the kitchen&#8230;</strong></p>
<p>Of course, all that is assuming the temporary workaround really does need to be replaced. In my friends&#8217; kitchen they are actually quite happy with the drawer dividers they&#8217;ve requisitioned as a spicerack. Aside from anything else, it provokes conversation and allows them to talk about their Azerbaijani builder&#8217;s many philosophies. He seems to have so many pithy sayings &#8212; all of which begin &#8220;As we say in Azerbaijan&#8230;&#8221; &#8212; that they&#8217;re beginning to suspect he may be making them up as he goes along. Still, if he does have to make a hasty exit from the building trade there may be an opening for him in the software industry.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/niksilver.wordpress.com/61/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/niksilver.wordpress.com/61/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=61&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2007/09/23/theres-nothing-so-permanent-as-temporary/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2007/09/temporary-workaround2.jpg" medium="image">
			<media:title type="html">Temporary workaround</media:title>
		</media:content>
	</item>
		<item>
		<title>Series: One nice thing about three new sites</title>
		<link>http://niksilver.com/2007/07/26/series-one-nice-thing-about-three-new-sites/</link>
		<comments>http://niksilver.com/2007/07/26/series-one-nice-thing-about-three-new-sites/#comments</comments>
		<pubDate>Thu, 26 Jul 2007 16:51:20 +0000</pubDate>
		<dc:creator>Nik</dc:creator>
				<category><![CDATA[Guardian.co.uk]]></category>
		<category><![CDATA[Software design]]></category>

		<guid isPermaLink="false">http://niksilver.com/2007/07/26/series-one-nice-thing-about-three-new-sites/</guid>
		<description><![CDATA[Today we&#8217;ve launched three new sites on Guardian Unlimited. Well, more correctly, we&#8217;ve redesigned and rebuilt our Science, Technology and Environment sites. Working for a media organisation, I can rely on people much more articulate than me to tell the stories better &#8212; see Alok Jha on Science, Alison Benjamin on Environment and (with more &#8230; <a href="http://niksilver.com/2007/07/26/series-one-nice-thing-about-three-new-sites/">Continue reading <span class="meta-nav">&#187;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=56&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today we&#8217;ve launched three new sites on Guardian Unlimited. Well, more correctly, we&#8217;ve redesigned and rebuilt our <a href="http://www.guardian.co.uk/science">Science</a>, <a href="http://www.guardian.co.uk/technology">Technology</a> and <a href="http://www.guardian.co.uk/environment">Environment</a> sites. Working for a media organisation, I can rely on people much more articulate than me to tell the stories better &#8212; see <a href="http://blogs.guardian.co.uk/science/2007/07/this_brand_new_science_web_sit.html">Alok Jha on Science</a>, <a href="http://blogs.guardian.co.uk/climatechange/2007/07/better_environment_website.html">Alison Benjamin on Environment</a> and (with more technical info than you can shake a memory stick at) <a href="http://blogs.guardian.co.uk/technology/archives/2007/07/26/welcome_to_our_new_look_site.html">Bobbie Johnson on Technology</a>.</p>
<p>So I won&#8217;t repeat what they&#8217;ve said. Instead, I want to point to one tiny new feature which I&#8217;m unfeasibly excited about. It&#8217;s <em>series</em>. You know series. They&#8217;re those things which appear regularly in a paper or on a website.</p>
<p><img align="left" title="Flagging that it's a series" alt="Flagging that it's a series" src="http://niksilver.files.wordpress.com/2007/07/series-identified3.jpg?w=750" /><img align="right" title="Navigating through a series" alt="Navigating through a series" src="http://niksilver.files.wordpress.com/2007/07/series-navigation3.jpg?w=750" />In our redesigned sites we&#8217;ve introduced series as a specific and distinct concept. For example, <a href="http://www.guardian.co.uk/science/series/badscience">Bad Science</a> is a weekly series by Ben Goldacre on pseudo-science. <a href="http://www.guardian.co.uk/technology/series/askjack">Ask Jack</a> is a series in which Jack Schofield helps people with their computer problems. In the old world these articles would be gathered into their own sections and left at that. But a series is a little bit more than this. For one thing when you land on an article in a series it&#8217;s nice to know that it is one of a family. We now flag that at the side of the piece. For another thing, you should be able to navigate to the next and previous articles in the series. Again, this series-specific navigation appears with each piece.</p>
<p>It&#8217;s a very small thing, but to me it shows something fundamental and important: the software we&#8217;re producing really does match the way our writers and editors think. It is, for those in the know, a result of <a href="http://domaindrivendesign.org/">domain driven design</a>. For everyone else, it&#8217;s simply software that does what you think it should do.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/niksilver.wordpress.com/56/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/niksilver.wordpress.com/56/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/niksilver.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/niksilver.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/niksilver.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/niksilver.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/niksilver.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/niksilver.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/niksilver.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/niksilver.wordpress.com/56/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=niksilver.com&amp;blog=205744&amp;post=56&amp;subd=niksilver&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://niksilver.com/2007/07/26/series-one-nice-thing-about-three-new-sites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ed5f211191ad95ff564f9972490f40b1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">niksilver</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2007/07/series-identified3.jpg" medium="image">
			<media:title type="html">Flagging that it&#039;s a series</media:title>
		</media:content>

		<media:content url="http://niksilver.files.wordpress.com/2007/07/series-navigation3.jpg" medium="image">
			<media:title type="html">Navigating through a series</media:title>
		</media:content>
	</item>
	</channel>
</rss>
