<?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>Paul Dyson's Blog</title>
	<atom:link href="http://pauldyson.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pauldyson.wordpress.com</link>
	<description>Random thoughts about stuff that interests me</description>
	<lastBuildDate>Wed, 21 Dec 2011 16:56:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='pauldyson.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Paul Dyson's Blog</title>
		<link>http://pauldyson.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://pauldyson.wordpress.com/osd.xml" title="Paul Dyson&#039;s Blog" />
	<atom:link rel='hub' href='http://pauldyson.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Stopping Starting-up</title>
		<link>http://pauldyson.wordpress.com/2011/12/05/stopping-starting-up/</link>
		<comments>http://pauldyson.wordpress.com/2011/12/05/stopping-starting-up/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 19:59:41 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Start-up]]></category>
		<category><![CDATA[Lean Start-Up]]></category>
		<category><![CDATA[sustainability product-market fit]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=232</guid>
		<description><![CDATA[I love start-up. The early &#8216;wouldn&#8217;t it be great if &#8230;&#8217; conversations, the commitment to going on a journey into the unknown, the first days when absolutely nothing is in place and things like name, logo, and website are the focus of endless creative conversation, the first customer, the first hire &#8230; Its a hell [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=232&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I love start-up. The early &#8216;wouldn&#8217;t it be great if &#8230;&#8217; conversations, the commitment to going on a journey into the unknown, the first days when absolutely nothing is in place and things like name, logo, and website are the focus of endless creative conversation, the first customer, the first hire &#8230;</p>
<p>Its a hell of a ride.</p>
<p>There&#8217;s a huge amount of start-up advice around for the would-be entrepreneur. May favourites are the writings of <a title="Steve Blank" href="http://steveblank.com/" target="_blank">Steve Blank</a> and <a title="Eric Reis" href="http://www.startuplessonslearned.com/" target="_blank">Eric Reis</a>; <a title="Customer Development" href="http://www.slideshare.net/venturehacks/customer-development-methodology-presentation" target="_blank">Customer Development </a>and <a title="Lean Startup" href="http://www.startuplessonslearned.com/2008/09/lean-startup.html" target="_blank">Lean Startup</a> have more to say about how to go from a vague idea to a functioning startup than any other business approach I&#8217;ve seen. There&#8217;s an increasing amount of support for start-ups, in the UK at least, from <a href="http://cachef.ft.com/cms/s/0/a05beed0-596d-11e0-bc39-00144feab49a.html#axzz1f56Pw5QA" target="_blank">various tax breaks</a> for would-be investors to the well-intentioned but somewhat ill-executed <a title="Startup Britain" href="http://www.startupbritain.org/" target="_blank">Startup Britain</a>. There&#8217;s also a lot of very early stage investment money washing around from Angels and Micro-VCs; let&#8217;s face it if you&#8217;re going to invest in a hare-brained, high-risk scheme dreamt up by a bunch wide-eyed idealists you&#8217;re probably better off taking a punt on someone&#8217;s idea for a new type of social network than buying Euro-zone bonds.</p>
<p>Start-ups will save us from the global economic crisis!*</p>
<p>But once you&#8217;ve started your startup, you&#8217;ve done some customer development, you&#8217;ve perhaps pivoted your idea, you&#8217;ve reached a core of a product and you have some paying customers, then what? Its time to stop being a start-up and establish your business. Steve Blank calls this phase &#8216;Company Growth&#8217; in <a title="Four Steps to the Ephiphany" href="http://www.stevenblank.com/books.html" target="_blank">Four Steps to the Epiphany</a>.</p>
<p>In my experience** there are a few things you need to stop being a start-up:</p>
<p><strong>A sustainable business model</strong></p>
<p>On day one of your start-up you are concerned with the necessary detail of the company: what are we called, what do we do, where do we work? On day two you should be out there discovering your customers and understanding your potential market. On day three you should be trying to show those potential customers why they should become actual customers. And so on. You shouldn&#8217;t be worrying about sustainability, about what you need to keep being successful in 12-18 months time because unless you focus on finding your customers and your product-market fit you won&#8217;t be around in 12-18 months time.</p>
<p>But at some point you&#8217;re going to know roughly who your customers are and your product will have demonstrated a reasonable fit with the market. At this point you need to be worrying about sustainability because things like cash-flow, excessive overheads, technical debt and the like might just prove fatal if you don&#8217;t deal with them.</p>
<p>A sustainable business model is simply one where the revenue exceeds the cost (and beware hidden cost; many lean start-ups rely on the early joiners living with a reduced or waived salary in return for a stake in the long-term success of the company, which is an inherently unsustainable situation). It doesn&#8217;t necessarily have to be by a lot and it doesn&#8217;t necessarily have to make month-on-month profits, but it does need to support itself. But whilst it is defined by financial security, sustainability is about more than just about the money: a sustainable company will retain its employees, improve its processes, and learn from its internal influences as well as its external ones.</p>
<p><strong>Less Product-Market Fit, more Market-Product Fit</strong></p>
<p>A good product, one that meets the needs of its customers and has established itself in the market, should start to distort that market, no matter how niche (&#8220;Find your niche and dominate it&#8221;† was one of the excellent pieces of advice we were given on starting Singletrack). Disproportionately successful products like the iPad and Facebook demonstrate this in extremis; the newly-perceived tablet market is actually an iPad market, many times greater in size than the tablet market ever was, and early social networks simply never imagined the market was as big as Facebook has demonstrated it to be.</p>
<p>But all successful products demonstrate this effect to a degree. The current dominant player in our market does one thing well and many other things poorly (according to their customers we&#8217;ve talked to). They have distorted the market to be all about their core strength and we are actively seeking to displace them by redefining that market. Some of their customers will buy into us, some won&#8217;t, but we hope that in the next couple of years, when people talk about the market we&#8217;re in, the conversation will be much more diverse than it is today.</p>
<p>What I&#8217;m not saying is that Customer Development is a short-term process, or that an established company no longer listens to or learns from its customers. What I am saying is that in the early days a lean startup will do almost anything (within boundaries of ability, desire and possibly legality) that customers commit to paying for. But as time goes on you have a lot more data to go on and a lot more experience in your market and there will come a time when leading your customers on a market-defining journey is more valuable to you and them than focusing on fitting your product to the market.</p>
<p><strong>Weaning off the founders</strong></p>
<p>In the early days the founders are the company. As the company grows this effect lessens but it will be quite some time until the company is immune to the loss of some or all of its founders. But that is precisely what an established business needs to be. In the early days people will buy into the founders of the business as much as they buy into the product.</p>
<p>In fact I&#8217;d go so far as to say that believing in the founder has far more to do with an early customer making a commitment to buy something that doesn&#8217;t actually exist yet as whatever it is the product is portrayed as shortly to be doing.</p>
<p>But as time goes on the founders&#8217; need to replace themselves with others who do the jobs they&#8217;ve been doing better than they can. They need to reduce their day-to-day involvement and ensure they are steering the company in the right direction. This doesn&#8217;t mean they need to make themselves redundant or irrelevant, just that the company should continue on if and when the founders decide to leave.††</p>
<p><strong>In Conclusion</strong></p>
<p>These are the things I think you need to stop being a start-up and get established. But I&#8217;m sure there are more and am interested in other people&#8217;s experience. It seems to me that with all the buzz about start-up around at the moment, a good body of experience and knowledge about how to successfully stop being a start-up is going to be increasingly important.</p>
<p>*Actually start-ups won&#8217;t save us from the global economic crisis but they might just create a few much-needed jobs, create a bit of excitement and confidence, and instil more entrepreneurial spirit in this country.</p>
<p>** Background: I&#8217;ve started three companies. The first never got out of being a start-up and died midway through its second year. <a title="e2x limited" href="http://www.e2x.co.uk" target="_blank">The second</a> was modestly successful and is still around after 10 years. <a title="Singletrack Systems" href="http://www.singletracksystems.com" target="_blank">The third</a> is currently making the transition from start-up to established business.</p>
<p>† <a title="Parker Harris" href="http://www.salesforce.com/company/leadership/executive-team/#harris">Parker Harris</a>, co-founder of Salesforce.com</p>
<p>†† I&#8217;ll know Singletrack is doing okay when the team start telling me to shut up and let them do their jobs. I&#8217;m looking forward to that day.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=232&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2011/12/05/stopping-starting-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>Optimising Custom Applications on Force.com</title>
		<link>http://pauldyson.wordpress.com/2011/11/07/optimising-custom-applications-on-force-com/</link>
		<comments>http://pauldyson.wordpress.com/2011/11/07/optimising-custom-applications-on-force-com/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 15:24:22 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[force.com]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[PaaS]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=218</guid>
		<description><![CDATA[One of the greatest challenges of developing on someone else&#8217;s PaaS offering is performance optimisation. When I built large-scale enterprise web systems from the ground up there were so many levers we could pull to improve performance without changing a single line of code: more/better CPUs, more memory, more/better use of indexing/caching/threading, and so on. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=218&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the greatest challenges of developing on someone else&#8217;s PaaS offering is performance optimisation. When I built large-scale enterprise web systems from the ground up there were so many levers we could pull to improve performance without changing a single line of code: more/better CPUs, more memory, more/better use of indexing/caching/threading, and so on. And if we wanted to optimise code we could choose where to apply our efforts, from the lowest of the low-level infrastructure code to the client code running in the browser.</p>
<p>But when you build code that runs on someone else&#8217;s platform you have only one thing you can optimise: your own code.</p>
<p>One of the things that amazes me about building on force.com is how infrequently we need to do performance optimisation. Create a simple custom page with a record or two&#8217;s worth of data and a smattering of dynamic client-side functionality and an end user will be hard pushed to tell that its not a native force.com tab. Even more complex pages, with more than a couple of records and more than just a smattering of client-side functionality render pretty damn quickly and are perfectly usable. But the Singletrack system also has a few pages that are really very complex, cover a few hundred records and provide a lot of client-side tools. This post covers the specific topic of how we optimised a custom force.com page that took ~40s to render in its first version and got this down to &lt; 2s.</p>
<h3>The problem</h3>
<p>Deliver information about a list of contacts, usually around 150-300 in length. Which contacts are returned may be manually set or may be dynamically chosen using a set of non-trivial criteria. What information is delivered is configurable on a per-user basis but typically consists of ~20 fields covering the Contact, its Account, and recent Activity History. Add in a number of tools for manipulating and interacting with the information on the list. If it helps, think of it as a Salesforce list view on steroids.</p>
<h3>The first solution</h3>
<p>Work out what information the user wants to see about each contact (from Custom Settings). Work out the criteria for selecting the contacts (stored on the record underpinning the view). Dynamically construct the query string and execute. Render as a table using Visualforce (think JSP/ASP/ERB for none-force.com&#8217;ers) along with embedded Javascript for all the client-side functionality. The result: ~40s from request to availability in Chrome.</p>
<h3>The first optimisation &#8230; and some lessons learned</h3>
<p>Rule #1 of optimisation; profile the shit out of the system and work from facts not opinions. But profiling isn&#8217;t well supported in force.com (basically, debug statements with timestamps are required) so we made some guesses as to where we thought the problem was likely to be in order to focus our instrumentation efforts. Given we were still quite new to force.com at the time we were probably a bit too influenced by our fears and immediately set about instrumenting all the querying. Waste of time, even increasing the number of contacts tenfold the querying accounted for less than 300ms of the request. And in general the server processing was really very fast.</p>
<p><strong>Lesson #1 of optimising in the cloud: profile the shit out of the system and work from facts not opinions.</strong></p>
<p>Instead we turned our attention to the page rendering and this turned up a surprising result. We needed two &lt;apex:repeat /&gt; loops to construct the table; one for the rows and one for the columns. Rendering a table of 3000 rows (requiring 2000 iterations in one loop) was pretty fast, rendering a table of 400 rows with 5 columns (also requiring 2000 iterations but two loops) was not. In fact it was 10 times slower and rendering 200 rows with 10 columns &#8211; our most typical use case &#8211; was much slower still.</p>
<p>This is when<strong> lesson #2 of optimising in the cloud really hit home: you can either do less or you can do differently, you don&#8217;t have the option of adding more of a vital resource</strong>. We could remove the ability of users to choose which columns they saw (making the column set fixed and removing the need for the nested loop) or we could change the way we rendered the table. In the end we decided to do differently and return all the results as JSON data and construct the table in Javascript on the client. Our first version of this approach gave us a 100% improvement in performance: 20s from request to availability.</p>
<p>However we also quickly worked out that our JSON based solution (this was before force.com released native support for JSON) was still pretty slow due to using &#8216;+&#8217; for String concatenation in creating the JSON string. Replacing this with extensive use of String.format() gave us another 100+% performance improvement: 8.5s.</p>
<h3>The second optimisation &#8230; and more lessons</h3>
<p>We lived with this for a while. 10s wasn&#8217;t great but it was no slower than opening up an Excel spreadsheet (what users had been doing before they used our system) and general consensus was 10s was okay. Of course, what seems acceptable on day one rapidly becomes irritatingly slow and within a couple of months there was a lot of grumbling about performance especially as some people were reporting that the page &#8216;regularly&#8217; took 20+s to load. This turned out to be rooted in some environmental issues: i) browser caches were being cleared out every time the browser was closed &#8211; a not uncommon admin setting in our customers&#8217; domain and ii) the ISP routing for salesforce.com subdomains (used for accessing custom code in managed packages) turned out to be less than optimal &#8211; sometimes adding 6-8s to a request. The latter was a real eye-opener and we still haven&#8217;t got to the bottom of why that was the case but switching to a back-up ISP and resolving the browser cache issue ensured the customers&#8217; were getting consistent 10s response times.</p>
<p>Once we&#8217;d resolved these problems we noticed that the latency in requesting Static Resources from force.com could be pretty high: ~1.5-2s in some cases (as is commonly the case all our Javascript and CSS files were packaged up as a zip file and deployed to force.com as a Static Resource). By moving our Javascript and CSS outside the package and delivering it via Amazon Cloudfront we won&#8217;t improve performance in the common circumstance of someone accessing the system via a browser with a fully populated cache but, we can shave a second or two off the overall response time for a browser with an empty cache as well as isolating ourselves from whatever the circumstances that cause force.com to update the timestamps for Static Resource caching (it seemed that every new force.com release required all browsers to completely repopulate their caches causing a rash of performance complaints directly after a major Salesforce upgrade).</p>
<p><strong>Lesson #3 of optimising in the cloud: there&#8217;s not much you can optimise outside your own code, but there is more than nothing.</strong></p>
<p>This round of work got us looking at our implementation again. One thing that really stood out was the amount of time we had a &#8216;blank page&#8217; before any of our data was being downloaded, even ignoring client-side processing of it: 4s. Create a custom Visualforce page with just some text in it and it will have sub-second response time. Given we knew that querying and processing the data took only ~300ms it seemed surprising that it was taking ~3s to download the data. Some investigation here turned up a very surprising result &#8211; that the viewstate for the page was huge even though there wasn&#8217;t much real state within the page. By ensuring that the scope of the &lt;apex:form/&gt; tags was as narrow as possible (just encompassing the fields and actions within the form) and judicious use of transient variables we were able to significantly reduce the size of the viewstate and this brought the &#8216;blank page&#8217; time down to below 2s and overall response times of ~4.5s. Additionally, the psychological effect of not staring at a blank page for a few seconds meant that people felt the page was a lot faster than you might expect from a 60% improvement.</p>
<p>Something else we looked at here, after realising that Static Resources can be a bit slow, was how long it took for force.com to download its own Javascript and Stylesheets. By removing the Salesforce header and sidebar, and opting not to load standard style sheets we took another 0.5s off the page load.</p>
<p><strong>Lesson #4 of optimising in the cloud: a bit of understanding about how the platform works goes a long way to spotting areas for optimisation even when you think your actual code doesn&#8217;t have a lot of room for improvement.</strong></p>
<div>
<p>With the use of the new native support for JSON (worth ~1.5s over our homegrown implementation, and resulting in vastly simpler code) and a few other minor tweaks we&#8217;re now down to a steady 2s for page load; a whopping 2000% improvement over that first, not-too-naive implementation.</p>
<h3>Summary</h3>
<p>Far from just having whatever performance you get out of force.com on your first effort, there is plenty of opportunity for optimisation if you find you need to do it. However, don&#8217;t look too much to the platform for bottlenecks (apart from a few specific cases mentioned) the answer lies in your use of the platform and in your custom code. String concatenation and viewstate in particular seem to be areas where you can gain some quite significant improvements with relatively little effort and, with the new support for JSON, shipping compact JSON strings that you then render on the client rather than having Visualforce do all your rendering on the server side for you is definitely a good option even if you don&#8217;t need nested &lt;apex:repeats /&gt;. And if you see inconsistent performance in your customers&#8217; environments there are certain things to go looking for there that can make a dramatic improvement.</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/218/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=218&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2011/11/07/optimising-custom-applications-on-force-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>Why we don&#8217;t Continuously Deploy</title>
		<link>http://pauldyson.wordpress.com/2011/10/24/why-we-dont-continuously-deploy/</link>
		<comments>http://pauldyson.wordpress.com/2011/10/24/why-we-dont-continuously-deploy/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 11:56:48 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=215</guid>
		<description><![CDATA[Continuous Deployment is very much en vogue; its seen as the natural extension of Continuous Integration and is a part of the lean startup philosophy. But we don&#8217;t do it and I thought it might be interesting to explain why. Our users like improvement but they don&#8217;t like change. We build a business system for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=215&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Continuous Deployment" href="http://www.startuplessonslearned.com/2009/06/why-continuous-deployment.html" target="_blank">Continuous Deployment</a> is very much en vogue; its seen as the natural extension of <a title="Continuous Integration" href="http://martinfowler.com/articles/continuousIntegration.html" target="_blank">Continuous Integration</a> and is a part of the lean startup philosophy. But we don&#8217;t do it and I thought it might be interesting to explain why.</p>
<ol>
<li><strong>Our users like improvement but they don&#8217;t like change</strong>. We build a business system for business users and our users each spend 2-8 hours a day using our system. They want to see the system improve but having a consistent, recognisable user experience is more important than having one that is constantly changing, even if that change brings improvement. So we gather all their feedback as they use the system and package that into a release. When that release is ready we do demos and distribute documentation to make sure everyone is aware of the changes coming. Bundling up all improvements into one big change allows us to make sure everyone understands what is coming, is happy about what&#8217;s new, and there are no surprises when they log in.</li>
<li><strong>We do QA as well as testing</strong>. To me QA is a separate activity to writing and running automated tests. My experience of developer-written tests (unit, functional, integration and so on) is they tend to take a rational and logical view of the functionality under test: what happens when used correctly, what happens when expected parameters aren&#8217;t supplied, what happens when parameters are supplied with unexpected values? But users aren&#8217;t necessarily &#8216;rational&#8217; or &#8216;logical&#8217; as developers see it and having humans bash away at the system, hitting the back button randomly, pasting parameter values from surprising sources, leaving the browser open for an hour while they have lunch, and so on helps us to spot the gaps in the automated testing and the assumptions we made whilst writing them. But manual QA takes time and having continuous pressure to have it done as quickly as possible to support continuous deployment will be counter-productive. So we bundle our changes up into weekly QA releases which means QA can be done at a pace that suits the assurance of quality rather than speed of deployment.</li>
<li><strong>We&#8217;re still learning</strong>. To me there&#8217;s a bit of a paradox in Continuous Deployment as applied to lean startup. On the one hand, multi-variate testing and continuous deployment allow you to gather and act on lots of feedback very quickly. On the other hand, a constantly changing user experience makes it harder to make sense of that feedback. In our system there is a piece of core functionality that users use for ~3 hours each day. If that changed on a daily basis they&#8217;d quickly get pissed off with it and wouldn&#8217;t use it until it was &#8216;ready&#8217; or &#8216;done&#8217;. We&#8217;re now on our third major re-working of that functionality and the latest version is vastly improved, based on real user feedback. But each new version has been introduced as a whole, with all the change management mentioned above, and so we&#8217;ve kept our users onside whilst making quite radical changes to the product.</li>
<li><strong>&#8216;Continuous&#8217; is a relative, not an absolute, term</strong>. Sounds like a stupid statement but its a lesson I learned a while back. In a previous job I was doing some work with a company and their supplier to improve their responsiveness to change. We were pushing for weekly releases but quickly realised that, to a pair of companies used to 18-24 month release cycles, quarterly releases would be a big improvement and much more achievable than weekly. Were we being unambitious? Perhaps from our own point of view as eXtremists, but in terms of the goals our clients had, quarterly would take them along way to achieving what they wanted. At Singletrack we do releases every 6-10 weeks which is so much more continuous than other systems our users use (upgrades every 12-24 months is more the norm) but avoids the disruption that &#8217;true&#8217; Continuous Deployment would cause.</li>
</ol>
<div>So we currently do: Continuous Integration in development; Daily Builds with full runs of automated tests (takes about 3 hours otherwise we&#8217;d do this more frequently); Weekly QA releases; End-user releases every 6-10 weeks. A lot of this stems from our business: we sell a complex, powerful SaaS product to sophisticated and demanding business users. If we were running a B2C website with a host of irregular and infrequent users (from the point of view of our system, a user that doesn&#8217;t log in for hours every day is infrequent) then we would certainly go for a much more continuous process than the one we have now.</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/215/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=215&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2011/10/24/why-we-dont-continuously-deploy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>An economic model of technical debt?</title>
		<link>http://pauldyson.wordpress.com/2011/08/18/an-economic-model-of-technical-debt/</link>
		<comments>http://pauldyson.wordpress.com/2011/08/18/an-economic-model-of-technical-debt/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 12:22:19 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[economics of software]]></category>
		<category><![CDATA[technical debt]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=209</guid>
		<description><![CDATA[A lot of what I&#8217;ve read about technical debt assumes that it is generally a bad thing and, in general, I agree. A lot of these articles also use credit card analogies to compare technical debt to personal finance and I think this is missing a trick. Businesses take a different view of debt to people and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=209&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A lot of what I&#8217;ve read about technical debt assumes that it is generally a bad thing and, in general, I agree. A lot of these articles also use credit card analogies to compare technical debt to personal finance and I think this is missing a trick. Businesses take a different view of debt to people and I wonder if using a more mature model of technical debt  would allow us to take a more nuanced view? [Caveat, I'm not an economist or an accountant, I've just run SME businesses for a few years and so have a little knowledge, possibly just enough to get this badly wrong].</p>
<p>Start-ups like ours run on credit. Whether its founders taking no salary, people working for sweat equity, friends and family or Angel funding, buying kit and services on personal credit cards, whatever &#8211; there&#8217;s going to have to be a bit of debt incurred to get from having nothing but an idea to having enough paying customers to sustain you. When we incur technical debt in our start-up it is in very much the same spirit: if things don&#8217;t pan out the debt isn&#8217;t going to have to be paid back. That doesn&#8217;t mean you take on as much credit as is being offered because loading the business with debt may quickly become one of the causes of its failure. But you take sensible risks, take the credit you need and work bloody hard to pay it off before it becomes a burden.</p>
<p>As a business starts to establish itself things like cashflow become more important. A business might use credit (e.g. order factoring or  bridging loans) to smooth the flow and to reduce their risk of running out of money. Many projects I&#8217;ve run experience a similar ebb-and-flow of requirements and I wonder if taking a longer-term view of the &#8216;requirements flow&#8217; of a project might allow a more structured approach to technical debt; when there are lots of requirements to deliver in a short period, be prepared to take on a bit more technical debt. When there is less pressure to deliver requirements, pay the debt down. If the &#8216;less pressure&#8217; phase isn&#8217;t looking like coming, take extraordinary action if it looks like the TD might get out of hand.</p>
<p>Once a business is established and looking to grow, it often takes on debt in order to achieve strategic objectives. What would be the equivalent in software delivery?</p>
<p>The problem with all the above is that it is still very much an analogy and I&#8217;m <a title="Analogies considered harmful?" href="http://pauldyson.wordpress.com/2010/02/16/analogies-considered-harmful/" target="_blank">no great fan of analogies in software development</a>. But what struck me about the conversation leading up to and following <a title="Technical Debt and the Lean Startup" href="http://pauldyson.wordpress.com/2011/08/15/technical-debt-and-the-lean-startup/" target="_blank">my previous post on Technical Debt</a>  is that technical debt isn&#8217;t really a metaphor as such. It&#8217;s not <em>like</em> monetary debt &#8211; where taking a bit of extra risk and incurring a greater overall cost in the long term allows you to achieve important things in the short term &#8211; it <em>is</em> monetary debt. By accepting technical debt you are (presumably, or why else are you doing it) incurring a lower cost, or enjoying a higher income, today but incurring a higher cost in the long run.</p>
<p>So what if we stopped treating technical debt as metaphor and started considering it as monetary debt? Could we quantify the costs we save by not doing something today (e.g. pairing, refactoring, resolving limits issues, optimising, or even just applying good old YAGNI) that may cause us pain at a later date? Could we quantify the value gained by doing something valuable sooner? Could we quantify how much more it will cost at that later date when we have to deal with the pain? Could we use these numbers to base decisions about whether or not to incur technical debt?</p>
<p>Here&#8217;s a simple example from our start-up. Two customers wanted broadly similar features adding to our product but had different timescales and some differences in detailed requirements. We took the decision to build two separate versions of the feature, one for each customer, even though we knew that this would give us two broadly similar sets of code to maintain and, if we wanted to sell the same feature to other customers, we would not only need to refactor them into one code set, we&#8217;d also have to do some additional work to migrate the customer&#8217;s data from their individual versions to the new unified model.</p>
<p>In this instance it wasn&#8217;t about cost saving as such. Both customers were willing to pay for the feature to be added if we could do it to their timeframe. So we got some money up front, lets say $100 (I&#8217;ll preserve the ratios but I&#8217;m not prepared to reveal the real sums). The cost of building it twice was a bit more than building it just the once, let&#8217;s say $20 instead of $15. We then had an additional cost of maintaining two code sets for  awhile, lets say $3 instead of $2, and we then had the cost of the rework and migration: $12. All in, the gross profit for this was $100 &#8211; $20 &#8211; $3 &#8211; $12 = $65.</p>
<p>Now suppose we&#8217;d built it once for one customer, and then evolved it for the second customer. Immediate income is $50. Gross profit is $50 &#8211; $15 &#8211; $2 = $33. If we then sell to the second customer the profit goes up but probably not to $83, lets say $80 because there&#8217;s bound to be some migration or re-work required to keep customer 1 in alignment with what customer 2 wants.</p>
<p>In this economic model it is $15 more profitable not to incur the technical debt. But, and its a big but, in any business and particularly in a startup cash is king. $100 dollars this month is way better than $50 this month with the expectation of another $50 three months later. And that assumes customer 2 still wants to pay in three months time. By then they may have bought or built an alternative. If they don&#8217;t buy you&#8217;ve only made $33, not $65; by any conventional business model, a certain $65 profit is vastly preferable to a certain $33 profit with the possibility of an additional $47.</p>
<p>But whether or not you agree with the decision to go for the $100 now and incur the technical debt isn&#8217;t the point. The question isn&#8217;t whether we made the right choice in this instance, its whether quantifying like this makes it easier to surface the benefits and liabilities of technical debt? A lot of the blog articles about technical debt say its hard to quantify but making rough guesses about this stuff isn&#8217;t that hard and rough guesses should be all you need (let&#8217;s face it, most successful business are run on far rougher guesses about predicted revenue, predicted costs, etc.). And it seems to me that if, as techies, we could get better at using terms, equations and numbers the business understand we could get much better at communicating why we should or should not incur technical debt, what our current debt level is, what it will cost to pay down, what the financial, reputational or other forms of impact might be if the risks inherent in the debt don&#8217;t pan out, and so on.</p>
<p>Perhaps we could stop treating technical debt as a metaphor and start using it as a real tool for planning and delivering our products and projects.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/209/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=209&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2011/08/18/an-economic-model-of-technical-debt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>Technical Debt and the Lean Startup</title>
		<link>http://pauldyson.wordpress.com/2011/08/15/technical-debt-and-the-lean-startup/</link>
		<comments>http://pauldyson.wordpress.com/2011/08/15/technical-debt-and-the-lean-startup/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 16:25:47 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Not Agile]]></category>
		<category><![CDATA[Start-up]]></category>
		<category><![CDATA[lean startup]]></category>
		<category><![CDATA[technical debt]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=194</guid>
		<description><![CDATA[A conversation on twitter between @david_harvey,  @rachelcdavies, @RonJeffries and myself made me to think it was about time to post on my view of technical debt in a lean startup and how that view has changed since the days of running XP-based projects for established companies. There&#8217;s a lot of information about Technical Debt out there on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=194&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A conversation on twitter between <a href="http://twitter.com/David_Harvey">@david_harvey</a>,  @<a href="http://twitter.com/rachelcdavies">rachelcdavies</a>, <a href="http://twitter.com/RonJeffries">@RonJeffries</a> and myself made me to think it was about time to post on my view of technical debt in a lean startup and how that view has changed since the days of running XP-based projects for established companies.</p>
<p>There&#8217;s a lot of information about Technical Debt out there on the web (including <a href="http://www.youtube.com/watch?v=pqeJFYwnkjE">Ward&#8217;s Video</a>, a <a href="http://martinfowler.com/bliki/TechnicalDebt.html">clear summary by Martin Fowler</a>, and an interesting, albeit somewhat flawed, <a href="http://www.nomachetejuggling.com/2011/07/22/when-to-work-on-technical-debt/">article by Rod Hilton</a>) and I&#8217;m not going to get into a detailed description here, but at its simplest level it says that making some quick-and-dirty choices today may lead to pain later on, and that pain is like a debt that you&#8217;re going to have to pay back at some point.</p>
<p>Its that &#8216;at some point&#8217; which has led me to believe there is a difference between technical debt as applied to a lean startup vs. that applied to a project for an established business. In a project you are trying to deliver something which meets some kind of business case. You will know roughly who the customer is, roughly what their objectives are, roughly what you can spend (time and money) in order to achieve them, and so on. There&#8217;s going to be a lot of stuff that isn&#8217;t known but there are some constraints in place. When I used to use XP to deliver these kinds of project we had a very simple view of technical debt: don&#8217;t incur it if you can avoid it and, if you can&#8217;t avoid it, pay it down at the earliest possible time. Why? Because in these projects sustainability is a primary objective: you know you&#8217;ll have to pay the debt down at some point so why let it grow uncontrollably?</p>
<p>In a lean startup not only do you not know what your customers want, you don&#8217;t even know who they are, and you usually have less time and money to spend on finding out than most established companies would try and run a project with. Your primary objective is <a href="http://www.startuplessonslearned.com/2008/11/what-is-customer-development.html">finding those customers and learning what they want</a>, not sustainability. Which isn&#8217;t to say sustainability is unimportant, just that its not your primary objective; once you have a business, then you worry about how to make it sustainable. Its a <a href="http://pauldyson.wordpress.com/2010/06/01/high-quality-problems-and-the-lean-start-up/">High Quality Problem</a>.</p>
<p>Here are some examples of technical debt we incurred at various stages of our search for customers and what they wanted:</p>
<ul>
<li><strong>Areas of the system understood by only one person</strong>. I&#8217;m a pair-programming fanatic and would love for everything in our system to be developed by pairs. But when you have only one developer in the company, that isn&#8217;t possible. When you have two developers and one has to go support a sales meeting, that isn&#8217;t possible. In fact, our experience is that until you have 5+ full-time developers there are going to be times when it isn&#8217;t possible to have <em>everything</em> paired. And do you know what? That&#8217;s okay. Code can be developed by a single developer but the fact that they built it on their own is a form of technical debt: until others have worked on the code, it is more widely understood, and has had the benefit of many eyes on it, you are in debt to the system.</li>
<li><strong>Large scale refactorings left undone</strong>. We use a number of underlying platforms and tools. If the platform or tool doesn&#8217;t do what we need we develop custom code. It isn&#8217;t uncommon for the tool or platform provider to then release something that does what our custom code does at a later date and, until we refactor to use the new platform or tool feature, we have some debt to the system. But that&#8217;s okay &#8211; the custom code still works, its just not as simple as it could be nor as future-proof if the provider develops the feature further.</li>
<li><strong>Limitations left in place</strong>. Sometimes a truly scalable solution is much harder than a simple but limited one. We had a situation where using in-memory collections led to a hard limit on the number of objects we could handle but the in-memory version of the code took a couple of hours to produce. We knew how to get around the limit &#8211; by adding in a system of creating permanent records and then processing them asynchronously using scheduled jobs &#8211; but that was several days work. The limit was okay &#8211; the function still worked, just for small collections of objects, and we had a debt to the system as and when our customers couldn&#8217;t live with the size limit.</li>
<li><strong>Sub-optimal design approaches</strong>. Sometimes it is easier to deliver a simplistic design than a well-crafted one. For example we delivered a quick-and-dirty reporting function that was simple but slow because we were <a href="http://c2.com/cgi/wiki?MakeItWorkMakeItRightMakeItFast">making it work, then making it right but hadn&#8217;t yet got to making it fast</a>. But that was okay, the information was available to the users and correct, just not very quickly delivered.</li>
</ul>
<p>But why would we live with such limitations? Aren&#8217;t we just delivering a shoddy system?</p>
<p>The answer to the first question is that we&#8217;re prioritising learning what makes our business work over some abstract notion of quality. If we develop a feature and it turns out that customers don&#8217;t want to pay for it, does it matter if it is only understood by one developer, that it could be refactored, that it is limited or sub-optimal? We develop the feature to get it into customers&#8217; hands as quick as possible, to understand whether it is something valuable or not, to understand how it should work. Only if that features is valuable is it worth paying down any debt we have incurred building it. In fact, never mind the feature, the same applies to the whole system: unless the system is sufficiently valuable to customers we have no business and if we have no business the whole question of quality is moot. Customers pay for features and benefits, not fully-paired, beautifully factored, limitation-free, optimised code.</p>
<p>The answer to the second question is an emphatic &#8216;no&#8217;. We produce production quality, tested code. The testing is something we don&#8217;t compromise on simply because it is the mechanism by which we will pay down the debt if and when the time comes to do so. I can live with the fact that a design is sub-optimal if we have tests which will help us optimise it when we have to. I can live with code that need refactoring if we have tests which will help us refactor it when we have to. I can even live with something written by one person if &#8230; well you get the picture.</p>
<p>In a startup, technical debt is something to be managed, not minimised. We make sure we understand how much debt we have and which bits of the system it affects. We make sure we have the ability to pay down that debt as and when we need to. And we make sure we work the time and money required to pay down debt into any timsescales or budgets we agree.</p>
<p>Anything less would be irresponsible. Anything more is prioritising some notion of &#8216;code quality&#8217; over learning what makes our business work and equally irresponsible.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/194/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/194/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/194/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=194&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2011/08/15/technical-debt-and-the-lean-startup/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>What is the cloud? Three little words: As-A-Service</title>
		<link>http://pauldyson.wordpress.com/2011/07/11/what-is-the-cloud-three-little-words-as-a-service/</link>
		<comments>http://pauldyson.wordpress.com/2011/07/11/what-is-the-cloud-three-little-words-as-a-service/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 11:00:22 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=189</guid>
		<description><![CDATA[I&#8217;ve been talking to a few people recently about what this cloud stuff I&#8217;ve been doing is really all about. Isn&#8217;t it just some marketing hype? If I set up some servers have I just created a cloud? Isn&#8217;t &#8216;cloud&#8217; just another word for &#8216;Internet&#8217;? Clearly it is a marketing term; witness Microsoft&#8217;s embarrassing and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=189&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been talking to a few people recently about what this cloud stuff I&#8217;ve been doing is really all about. Isn&#8217;t it just some marketing hype? If I set up some servers have I just created a cloud? Isn&#8217;t &#8216;cloud&#8217; just another word for &#8216;Internet&#8217;?</p>
<p>Clearly it is a marketing term; witness Microsoft&#8217;s embarrassing <a title="To the Cloud!" href="http://www.microsoft.com/windows/cloud/" target="_blank">and somewhat desperate attempt</a> to brand nearly everything they do and sell as &#8216;cloud&#8217;. And there are many ways to set up a &#8216;private&#8217; or &#8216;hybrid&#8217; cloud on your own servers, some of which have been around for years and have been re-badged to appease the marketeers.</p>
<p>But what I see, what excites me about what we do, is so much more than the hype. To me the cloud is a computing platform defined by those three little words: as-a-service.</p>
<p>Having spent a professional lifetime building large-scale enterprise systems from the ground up it is mind-boggling to me that I can integrate an apparently infinite amount of versioned, replicated, backed up and edge-cached storage into our system with nothing more than a credit card and a surprisingly small amount of coding. And <a title="S3" href="http://aws.amazon.com/s3/" target="_blank">Amazon S3/Cloudfront </a>is the least sophisticated of the services we utilise.</p>
<p>As-a-service I can deploy to a powerful application platform, complete with user management, sophisticated security, reporting, and more (force.com). Or I can deploy web applications built on Ruby on Rails (<a title="Heroku" href="http://www.heroku.com/" target="_blank">Heroku</a>, <a title="Clojure on Heroku" href="http://blog.heroku.com/archives/2011/7/5/clojure_on_heroku/" target="_blank">soon to support Clojure</a> for FP fans) or Java (<a title="Elastic Beanstalk" href="http://aws.amazon.com/elasticbeanstalk/" target="_blank">Amazon Elastic Beanstalk </a>or <a title="App Engine" href="http://code.google.com/appengine/" target="_blank">Google App Engine</a>). I can <a title="Hadoop as-a-Service" href="http://aws.amazon.com/elasticmapreduce/" target="_blank">store and manipulate data</a>, <a title="SendGrid" href="http://sendgrid.com/" target="_blank">send bulk emai</a>l, <a title="Gaug.es" href="http://get.gaug.es/" target="_blank">instrument and report on my services</a>, the list is growing daily.</p>
<p>As-a-service: as I need it, paying for only what I use, with scalability, availability, security and performance all built in.</p>
<p>And it&#8217;s this as-a-service nature that I believe makes &#8216;the cloud&#8217; a truly different and fundamentally better place to build software. The vision of Service Oriented Architecture is finally being realised but not in terms of the truly dreadful SOAP and WSDL that were bound too-tightly into the concept, or  auto-discoverable service white-pages, or centrally-controlled service architecture that simply re-packaged much of the distributed objects thinking into distributed services.</p>
<p>The as-a-service nature of the cloud creates a free market where service providers compete to capture our attention and take our money. To do this the emphasis isn&#8217;t on standardisation or &#8216;discoverability&#8217; but on simplicity, effectiveness (compare the wonderful JSON with SOAP) and value. The &#8216;mash-up&#8217; approach to service integration pioneered by web developers is an increasingly viable approach for building large-scale, enterprise-strength systems.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/189/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=189&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2011/07/11/what-is-the-cloud-three-little-words-as-a-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>Old Dog, New Tricks &#8211; Lessons learned from a year with my head in the Cloud</title>
		<link>http://pauldyson.wordpress.com/2010/12/23/old-dog-new-tricks-lessons-learned-from-a-year-with-my-head-in-the-cloud/</link>
		<comments>http://pauldyson.wordpress.com/2010/12/23/old-dog-new-tricks-lessons-learned-from-a-year-with-my-head-in-the-cloud/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 22:08:18 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Cloud technology]]></category>
		<category><![CDATA[force.com]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[lessons learned]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=169</guid>
		<description><![CDATA[Coming to the end of my first full year developing systems built exclusively on and for cloud platforms (primarily force.com) I figured this was a good time to reflect on some of the lessons learned and some old lessons unlearned. How I learned to stop worrying and love the platform [With apologies, Stanley Kubrik] For 13 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=169&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Coming to the end of my first full year developing systems built exclusively on and for cloud platforms (primarily force.com) I figured this was a good time to reflect on some of the lessons learned and some old lessons unlearned.</p>
<h2>How I learned to stop worrying and love the platform</h2>
<p>[With apologies, <a href="http://www.imdb.com/title/tt0057012/">Stanley Kubrik</a>]</p>
<p>For 13 years or so prior to committing to the cloud I was a professional worrier. I had no doubt the various teams I worked in could deliver features and good code but part of my job was to worry about the non-functional characteristics of the system. How would it perform, how would it scale, would it be available, would it be secure, was it manageable, was it maintainable, etc. and so on? I like to think I got pretty good at making sure our systems did what they needed to in all these areas by building up a toolkit of common issues and their solutions.</p>
<p>Building on force.com and S3, there&#8217;s just no point worrying about most of these. I have no control whatsoever over the scalability or availability of the system. The security is what it is:secure to a degree that no project I&#8217;ve run ever had a budget to achieve; and we&#8217;d have to be trying pretty hard to leave security holes in our product. Manageability is built into the force.com platform and following the conventions means we get a high degree of manageability in our application &#8216;for free&#8217;. Maintainability is still under our control but this goes back to good old-fashioned code-quality: make sure the code is understandable, well factored, and covered in tests and you&#8217;ll be okay. Even performance, to a large degree out of our hands, requires a new way of thinking if we&#8217;re going to do anything about it.</p>
<p>So lesson learned/un-learned number one: take all the time and energy you used to spend worrying about the architecture and non-functional characteristics of the system you&#8217;re building and divert this into delivering great products and services. You need to <em>understand</em> what the platform offers in terms of security, etc. but there&#8217;s not much you can actually do to change it so you might as well learn to love it.</p>
<h2>Don&#8217;t upset the Algorithm, baby</h2>
<p>[With anguished apologies to <a href="http://www.wat.tv/video/noisettes-don-upset-the-rhythm-1mtw0_2ey0j_.html">The Noisettes</a>]</p>
<p>On a walk through the Scottish hills with <a href="http://twitter.com/johnsnolan">@johnsnolan</a> he mourned the death of the algorithm. John&#8217;s view &#8211; which I share &#8211; is that many developers no longer understand the wide variety of algorithmic approaches available to them, nor is there enough discussion of algorithm as a subject. As John said: &#8220;Not everything can be solved with fucking Map-Reduce!&#8221;. Design patterns, object-orientation, frameworks, libraries and so on have lead to a homogenisation of development approach. Perhaps the current slightly hysterical vogue for functional programming languages is in part due to the frustration that, as developers, we spend more time assembling other people&#8217;s clever solutions than we do writing our own?</p>
<p>But this homogenisation is not a wholly bad thing. In teams of any significant size, having clear code understandable by the whole team is often better than having incredibly clever or efficient but somewhat obscure code. And you can have your cake and eat it: if your simple code is a bit slow or memory inefficient you can always spec a bigger server, throw a few new database indexes into the mix, up the thread pool size, up the cache size and so on.</p>
<p>But not on someone else&#8217;s platform.</p>
<p>On someone else&#8217;s platform algorithm is about the only tool you have at your disposal if you want to speed things up or make them more efficient (and on force.com, as on Google&#8217;s App Engine, there are some hard and fast limits on things like heap size to ensure your application plays nice on their servers which makes a degree of efficiency imperative). Force.com is a extremely well-optimised platform but its still possible to screw up end-user performance by doing too much calculation or returning too much data for any given request.</p>
<p>Lesson number two: spending time crafting efficient algorithms and designing a UX that supports these (by, for example, loading large data sets in pages rather than all in one go) is the best and possibly only option for ensuring consistently good performance.</p>
<h2>It&#8217;s a Mashable, Mashable, Mashable, Mashable World</h2>
<p>[No, I'm not apologising <a href="http://www.imdb.com/title/tt0057193/">again</a>]</p>
<p>Probably the nicest lesson to learn, and one that I addressed in my previous post, is that the cloud isn&#8217;t about one platform or one language but about creating and consuming services written and integrated in a variety of different languages running on a variety of different technologies. I hate the term &#8216;Mash-Up&#8217; but there is something enduringly wonderful about the idea that you can take all of these services and platforms and splurge them together in different and interesting way. Its like the anti-SOA &#8230; a primordial mass of open and accessible stuff with no-one curating, standardising or organising it.</p>
<p>Lesson number three: developing applications for the cloud is about having some knowledge of a broad range of platforms, technologies and languages at your disposal, and an appreciation what each of them can do for you, rather than understanding one technology or language inside-out.</p>
<p>So my New Year&#8217;s resolution is to worry less, reaquaint myself with Djikstra, and learn a bit of Ruby and Heroku  and Node.js and &#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/169/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=169&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2010/12/23/old-dog-new-tricks-lessons-learned-from-a-year-with-my-head-in-the-cloud/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>What will be the programming language of the Cloud?</title>
		<link>http://pauldyson.wordpress.com/2010/11/17/what-will-be-the-programming-language-of-the-cloud/</link>
		<comments>http://pauldyson.wordpress.com/2010/11/17/what-will-be-the-programming-language-of-the-cloud/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 14:24:51 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Cloud technology]]></category>
		<category><![CDATA[force.com]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=163</guid>
		<description><![CDATA[When I used to be responsible for building on-premise enterprise systems I railed against heterogeneity. I understood that architectures based on &#8216;best of breed&#8217; solutions were typically less than the sum of the parts (if they worked at all). I believe in collective code ownership but that means that when the resident Python guru says [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=163&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>When I used to be responsible for building on-premise enterprise systems I railed against heterogeneity. I understood that architectures based on &#8216;best of breed&#8217; solutions were typically less than the sum of the parts (if they worked at all). I believe in collective code ownership but that means that when the resident Python guru says &#8220;I could easily knock up a quick script to do that&#8221; or the long-time Smalltalker says &#8220;this bit of the system would be so much better built in Seaside&#8221; the implication is that the whole team has to learn Python or Seaside. I believe in simplicity, and whilst using &#8220;the best tool for the job&#8221; is a form of simplicity getting even just two techies to agree what the best tool for any given job actually is is a task in itself. Having a small, well-defined set of technologies is, to my mind, far simpler than having an ever-growing morass of different tools, languages, applications and libraries.</p>
<p>After twelve months of doing serious development on force.com we have a relatively small and well-defined set of technologies:</p>
<ul>
<li>All application code and unit tests written in Visualforce and Apex &#8211; the languages of the force.com platform &#8211; plus JQuery/Javascript for added client-side dynamism</li>
<li>System test code written in Java (we could use any other language that has a binding for Selenium WebDriver but all the dev team has a lot of Java experience behind them)</li>
<li>Build written in Ant running via Bash scripts on EC2</li>
<li>Force.com IDE</li>
</ul>
<p>And that&#8217;s it.</p>
<p>But something is threatening my nice safe, sanitised and homogenous Utopia: pesky customers. Because one customer needs to have some of the data from our service appear in their Microsoft Office suite we now have a small utility written in C# and WPF. And because other customers love the idea of accessing some services and data from within MS apps this is going to get bigger and more complicated. Because another customer wants a feature that the force.com platform can&#8217;t support, and we think this is going to be a good core feature to offer other clients, we&#8217;re going to have to build it using Google App Engine, or maybe in Java/Tomcat on EC2, or maybe in Ruby or &#8230;</p>
<p>All of which got me thinking: what might become the dominant programming language of the cloud? Apex is syntactically similar to Java and Google AppEngine is effectively a cut-down version of Java. But the ever growing complexity of the language and the shenanigans of Sun and now Oracle (not to mention Apple) lead me to think Java will not too shortly be appearing in various lists of legacy technologies. Ruby is simpler than Java but I never got the feeling that it was <em>that much</em> better and, if it wasn&#8217;t for Rails, would probably be nothing more than vaguely interesting. The various functional programming languages genuinely do offer something different to Java or Ruby but, at the moment, their support for some of the fundamentals of cloud computing are a bit limited: web services in Haskell anyone?</p>
<p>I even went so far as to start to draw up a list of the characteristics for my perfect cloud language before realisation dawned:</p>
<p><em>I&#8217;m asking the wrong question.</em></p>
<p>Because one of the great things about coding in the cloud is the incredible variety of platforms and services offered and their different strengths and weaknesses. Want to store and distribute files in the cloud? Use Amazon S3 &#8230; there is no language to learn as such, just a simple REST API. Need to run your build process in the cloud? Use whatever your favourite technology is and spawn up an EC2 instance to run it in. Need an application for capturing, managing and reporting on information? Force.com is a great bet.</p>
<p>I can&#8217;t wait for the first functional programming cloud platform that will allow us to write functional transforms and drop them in such that we can call them with a URL and get the results back in XML or JSON form. Amazon Hadoop offers some basic data transformation and calculation services in the cloud and I&#8217;m sure many other types of calculation and data manipulation engines will start to appear. When <a href="http://en.wikipedia.org/wiki/Vector_processor">vector processing</a> becomes truly cloud-based we&#8217;ll have many further options for data processing.</p>
<p>The idea that one language could support all, or even a significant majority, of these types of service is patently ludicrous and the only conclusion I can make is that the principle of homogeneous technology stacks belongs with a lot of the other principles I used to apply to building large systems: in the past. Its going to be a challenge to embrace the heterogeous future of Apex + Java + C# + Javascript + Ruby(?) + Scala(?) + Pig + ???, plus the different platforms they support or are supported by, but I&#8217;ve come to believe that this old dog is going to have to learn a lot of new tricks if he&#8217;s to get the most out of the cloud.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/163/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=163&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2010/11/17/what-will-be-the-programming-language-of-the-cloud/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>I&#8217;m not Agile, just a little eXtreme</title>
		<link>http://pauldyson.wordpress.com/2010/11/13/im-not-agile-just-a-little-extreme/</link>
		<comments>http://pauldyson.wordpress.com/2010/11/13/im-not-agile-just-a-little-extreme/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 15:39:23 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Not Agile]]></category>
		<category><![CDATA[not agile]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=157</guid>
		<description><![CDATA[The moment of epiphany came at OOPSLA &#8217;97 when I went to Ward and Kent&#8217;s Pair Programming BoF. Here I saw in practice the things I&#8217;d heard Ward, Kent and others talk about: TDD, Pairing, Refactoring, Doing the Simplest Thing, User Stories, System Metaphor and more. I went back to work, full of fire, and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=157&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The moment of epiphany came at OOPSLA &#8217;97 when I went to Ward and Kent&#8217;s <a href="http://xprogramming.com/articles/test_first_intro/">Pair Programming BoF</a>. Here I saw in practice the things I&#8217;d heard Ward, Kent and others talk about: TDD, Pairing, Refactoring, Doing the Simplest Thing, User Stories, System Metaphor and more. I went back to work, full of fire, and managed to convince a sceptical manager that there was a better way of delivering software than what we were currently doing. Since then I&#8217;ve been an eXtreme Programmer.</p>
<p>In 1999 I started my first consultancy business and XP was at the heart of our development process and some of our business practices too. But we didn&#8217;t talk about it &#8230; we couldn&#8217;t because the &#8220;extreme&#8221; word worried people and the mention of such outlandish practices as Programming in Pairs and Writing the Tests First merely confirmed their view we were mad. In other words we did&#8217;t sell XP, we sold the outcome of an eXtreme approach to software delivery.</p>
<p>In 2001 the announcement of the <a href="http://agilemanifesto.org/">Agile Manifesto</a> left me bemused. By this point we were talking about XP and using it with big teams on big projects. Even though there were still customers who thought what we said we could do was &#8220;impossible&#8221;, that Pairing was &#8220;two people doing one person&#8217;s job&#8221; and so on we had enough of a track record to point to, as well as the experience of others, to overcome the scepticism. I could see where the Agile Manifesto was coming from, and had no doubts about the good intentions of the authors, I just couldn&#8217;t really relate the set of value statements to what we were doing: selling the delivery of software in a way that out-performed other projects<em> by every measure</em>. And to be clear, we were selling the delivery of software, not training people, not offering qualifications, not consulting, delivering software.</p>
<p>By 2004 the &#8220;Agile&#8221; word was in common usage. It was useful to short-cut a lot of the explanation about what we did by talking about an &#8220;Agile process&#8221;. It was easier to gain acceptance of what we did because this nice fuzzy word was a synonym for good software delivery. But this was also the time that the bigger consultancies started to rebrand what they did as &#8220;Agile&#8221;, that I started to meet people who described themselves as &#8220;coaches&#8221;, that I heard about the idea of being certified as a practitioner (I knew people who thought I was certifiable as a practitioner but that was a different thing altogether).</p>
<p>Now in 2010 I can&#8217;t help but hope this whole Agile thing has run its course. It was always a somewhat meaningless word anyway (as <a href="http://www.agile-lab.co.uk/people.php">Mark Stringer</a> once tweeted, &#8220;&#8230; ask people if their company&#8217;s Agile, nobody&#8217;s gonna say &#8211; oh no, we&#8217;re lethargic and arthritic&#8221;) but now the people who seem to be talking about it most are those that make money by selling the process, not the outcome. They sell coaching, process improvement, training, certification, tools, people, &#8216;value&#8217;, blah, blah, blah, but very rarely do they actually sell software delivery. You know, as in &#8220;we&#8217;ll deliver this software&#8221; as opposed to &#8220;we&#8217;ll help you deliver software&#8221;.</p>
<p>And that&#8217;s okay. I have nothing against people peddling Agile as a way of making money (and, mea culpa, for a brief period in 2008 I did a bit of this too). It&#8217;s just that it no longer has anything to do with what I do. I recently sat in front of a customer&#8217;s project manager &#8211; a very smart and reasonable person &#8211; and accidentally used the A-word when describing how we were going to deliver our product and required customisations to them, and they sneered.<em> </em></p>
<p><em>They actually snorted in disgust</em>.</p>
<p>When I then explained we would get them live and using the base product quickly, followed by weekly incremental improvements with regular reviews and plenty of opportunity for rework they were very happy.</p>
<p><em>But they didn&#8217;t see any connection between the two things</em>.</p>
<p>Many years ago I tried to explain the concept of small-a architecture in software to a conference in Manchester. This was the idea (from <a href="http://www.c2.com/cgi/wiki?BruceAnderson">Bruce Anderson</a>) that every software system has an architecture than needs to be understood and cared for. Which is very different from what was considered Software Architecture at the time: people who hadn&#8217;t written a line of code in many years drawing lots of boxes and connecting them up in ininteresting ways to hand over to the poor schmucks who actually have to implement the thing.</p>
<p>It&#8217;s tempting to champion the concept of small-a agile: achieving agility rather than being Agile. But, do you know what? I can&#8217;t be arsed. Because its not about being agile/Agile or achieving agility, or being lean/Lean and efficient , its about delivering software. And I figure the best way to champion that is actually just to get better at doing it.</p>
<p>So, with a nod to Mr Stringer, I&#8217;d like to say &#8220;I&#8217;m not Agile&#8221; &#8230; I just deliver software.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/157/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/157/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/157/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=157&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2010/11/13/im-not-agile-just-a-little-extreme/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
		<item>
		<title>Using eXtreme Practices to Run Your Business</title>
		<link>http://pauldyson.wordpress.com/2010/10/17/using-extreme-practices-to-run-your-business/</link>
		<comments>http://pauldyson.wordpress.com/2010/10/17/using-extreme-practices-to-run-your-business/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 15:27:51 +0000</pubDate>
		<dc:creator>pauldyson</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Start-up]]></category>
		<category><![CDATA[lean startup]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://pauldyson.wordpress.com/?p=150</guid>
		<description><![CDATA[To me the great innovation of XP was to shift the emphasis of software development away from realising a set of specifications to realising value for the customer and the twelve practices are all about maximising the team&#8217;s ability to do so. Its no great insight to recognise that running any kind of business is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=150&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>To me the great innovation of XP was to shift the emphasis of software development away from realising a set of specifications to realising value for the customer and the <a href="http://en.wikipedia.org/wiki/Extreme_programming_practices" target="_blank">twelve practices</a> are all about maximising the team&#8217;s ability to do so. Its no great insight to recognise that running any kind of business is also about realising value for the customer and about a year after starting my first business I saw that we could usefully apply some of the XP practices to the business management as well as software delivery.</p>
<p>That was a number of years ago but this week I was reminded of the value of applying these practices, especially in the context of a lean startup where the need to discover your product/market fit and develop your business model is directly analogous to the XP team&#8217;s &#8216;discovery&#8217; of the system implementation that achieves the greatest value for their customers and to keep on doing so.</p>
<p><strong>Pairing</strong> &#8211; In a startup you can&#8217;t afford to do everything together; there has to be some division of responsibility and labour. However, the key business management activities &#8211; accounting, customer discovery, sales, marketing, product development &#8211; are best paired. Working as a pair to produce the monthly financial summary is so much more valuable than reviewing a spreadsheet produced by someone else and everyone on the management team needs to know what is going on in sales and customer discovery. The pair-programming benefits of lack of a single-point-of-failure, cross-pollination of skills, improved quality of output and so on are just as desirable in business management as software development.</p>
<p><strong>Planning Game</strong> &#8211; However you execute the &#8216;planning game&#8217; the same principles and outcomes are desirable in business planning as software delivery planning:</p>
<ul>
<li>Quick and Easy. If you spend all your time plotting how to take over the world only one thing is certain: you wont.</li>
<li>Short-term Focussed. You need some idea of where you&#8217;re going but the emphasis has to be on what you do in the next few weeks to find out what your customers want and to make those sales.</li>
<li>Feedback-Driven. Don&#8217;t forget, in the relentless drive towards growth, to look at what has been working and what hasn&#8217;t.</li>
<li>Priority-Driven. There is no such thing as &#8220;not enough time&#8221; only &#8220;<a href="http://accu.org/index.php/journals/509">too much to do</a>&#8220;. Make sure you&#8217;re doing the right things.</li>
<li>Visible. Getting the tasks up on the wall and making them visible to everyone is a powerful way of ensuring the priority tasks get delivered, everyone can see when things aren&#8217;t happening fast enough or when someone is struggling, and everyone can contribute to ensuring the goals for the business iteration are achieved.</li>
</ul>
<p><strong>Test Driven</strong> &#8211; My personal moment of epiphany with XP came when I realised how TDD meant we could spend a lot less time worrying about &#8216;architecture&#8217; and &#8216;the design&#8217; (less, not none) and more on saying what we wanted to happen and then making it happen. Setting simple tests for business management tasks like running a marketing campaign or pursuing a particular deal makes it easier to focus on getting things done and to learn from the outcomes.</p>
<p><strong>Continuous Integration</strong> &#8211; Just as separately developing several streams of code and then trying to bring them together after a long period of time is usually a disaster, having the product people go off and develop the product separate from the sales and marketing people, separate from the people worrying about the money will usually end up with a bust company. Even in startups such as ours where the product people, the sales and marketing people and the people worrying about the money is actually a grand total of two people, the various strands of thinking and work need to be &#8216;integrated&#8217; on a continuous (daily or weekly) basis.</p>
<p><strong>Sustainable Pace</strong> &#8211; The first six months of a start-up are the hardest, except for all the months that come after. Which is to say that, if your startup is a success, you will work extremely hard to get it off the ground and then have to step your game up to keep it in the air. If you need to work 20 hours a day, 7 days a week just to get it off the ground, there&#8217;s a very good chance that you don&#8217;t have a business there. There&#8217;s also a very good chance that you&#8217;re just trying to do too much. Either way, you will have difficulty sustaining that level of effort when you get to the point the business <em>really</em> needs it.</p>
<p>As an aside, one thing that&#8217;s important to recognise about Sustainable Pace in running a startup is that for many people its not just your Sustainable Pace. If you have a partner and/or children, or just friends that you value, what&#8217;s the pace that you can sustain <em>and that they can too</em>?</p>
<p>I think its also worth saying that I don&#8217;t see XP as being a blueprint for lean start-up management and there are at least two XP practices that I think don&#8217;t really work:</p>
<p><strong>Collective [Code] Ownership</strong> doesn&#8217;t really have an analog in business management. As mentioned earlier, most startups rely on some degree of division of labour. The fact that delivering a new sale or a marketing initiative requires building a whole load of relationships and interacting with people rather than a deterministic machine means that someone else can&#8217;t just step in at any point, make a bunch of changes and then roll back if it doesn&#8217;t work out. By all means collectively own the business and the objectives but no-one should be able to just go and interfere in someone else&#8217;s work at the drop of a hat.</p>
<p><strong>Whole Team</strong> &#8211; Possibly a controversial one this but, after 13 years of running startup businesses, I&#8217;ve come to the conclusion that the running of a business is not a matter for the whole company. Yes objectives should be shared, there should be some form of vision for everyone to buy into, everyone should have a voice that is listened to. But not everyone has the skills and experience to make good judgements about the business direction or about the business&#8217;s current position. Especially in startup where things like cashflow, market conditions, and sales prospects are extremely volatile, the management team needs to know how and when to communicate about how the company is doing to everyone in it and how and when to respond to feedback and ideas from outside management.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pauldyson.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pauldyson.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pauldyson.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pauldyson.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pauldyson.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pauldyson.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pauldyson.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pauldyson.wordpress.com/150/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pauldyson.wordpress.com&amp;blog=4425612&amp;post=150&amp;subd=pauldyson&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pauldyson.wordpress.com/2010/10/17/using-extreme-practices-to-run-your-business/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ade8d99cac41f797ce8ef709261644d6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldyson</media:title>
		</media:content>
	</item>
	</channel>
</rss>
