<?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/"
	>

<channel>
	<title>Pragmatic Dictator &#187; software development</title>
	<atom:link href="http://www.dancres.org/blitzblog/tag/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dancres.org/blitzblog</link>
	<description></description>
	<lastBuildDate>Sat, 31 Dec 2011 19:08:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Quantitative</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2009%2F05%2F18%2Fquantitative%2F&#038;seed_title=Quantitative</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2009%2F05%2F18%2Fquantitative%2F&#038;seed_title=Quantitative#comments</comments>
		<pubDate>Mon, 18 May 2009 17:57:11 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=249</guid>
		<description><![CDATA[It&#8217;s tempting when trying to be customer-centric to focus on delivering lots of functionality quickly. Supposedly features win the race and can increase revenue, but is that all that matters? Evidence such as the troubles Twitter have had in the past and this anecdote from Google about search time suggests there are other qualities of [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s tempting when trying to be customer-centric to focus on delivering lots of functionality quickly. Supposedly features win the race and can increase revenue, but is that all that matters? Evidence such as <a href="http://www.businessinsider.com/2008/5/no-social-network-is-down-more-than-twitter">the</a> <a href="http://mashable.com/2008/01/30/twitter-down-for-the-debates-twitter-forces-my-hand/">troubles</a> Twitter have had in the past and this <a href="http://blogs.zdnet.com/BTL/?p=3925">anecdote</a> from Google about search time suggests there are other qualities of our website that matter like:</p>
<ul>
<li>Service charges</li>
<li>Responsiveness</li>
<li>Availability</li>
<li>Quality of interaction</li>
</ul>
<p>Whilst these qualities are all about the customer experience, success in maintaining them at an appropriate level is related to how well a company performs internally:</p>
<ul>
<li>It&#8217;s undesirable to be charging excessively to cover development inefficiencies caused for example, by a tightly coupled architecture that makes even a small change a multi-month death-march.</li>
<li>A service that runs slow at peak times due to insufficient focus in our architecture and code on performance and scaling, appears sluggish or even down which can drive customers away.</li>
<li>Prolonged outages as the result of trivial problems occurring that take operational staff excessive time to fix because of poor monitoring and diagnostic tools, will impact customer satisfaction.</li>
<li>If we routinely rollback upgrades or they&#8217;re brittle or bug-ridden we will negatively impact the quality of interaction.</li>
</ul>
<p>Thus being more customer-centric requires a company to quantify it&#8217;s performance and work to improve it. In the case of the examples above, things like response time, site downtime, number of failed upgrades, time to perform a release, bug counts and feature count against cost of delivery can be used as metrics to indicate how we&#8217;re doing in our mission to make the customer happy. Methods for improving these metrics though not always easy to apply are relatively well-understood and include:</p>
<ul>
<li>Ensuring architecture/design includes well-defined interfaces, avoid integration via databases etc.</li>
<li>Considering scalability: how many machines can be thrown at a problem and are they used efficiently? Essentially, balancing horizontal-scale and straight-line optimisation.</li>
<li>Removing computation from the critical path to generating a user-response e.g. use asynchronous methods.</li>
<li>Publishing software and hardware telemetry, gather it all up (using the right infrastructure) and perform appropriate analysis via tools etc.</li>
<li>Focusing on simplicity, isolation of components, failure tolerance, in-live testing, versioning and the ability to rapidly rollback.</li>
<li>Applying an appropriate testing regime.</li>
</ul>
<p>Ultimately everything a company does internally has implications for customers. This includes what might normally be notoriously subjective such as, for example technology selection.  In this particular case we ought to test the technology and assess the effect on relevant metrics to verify that it does provide meaningful benefits.  Also as most technology has it&#8217;s downsides, we can quantify these too and ensure there&#8217;s an appropriate trade-off.</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2009%2F05%2F18%2Fquantitative%2F&#038;seed_title=Quantitative/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remodelling</title>
		<link>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F12%2F02%2Fremodelling%2F&#038;seed_title=Remodelling</link>
		<comments>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F12%2F02%2Fremodelling%2F&#038;seed_title=Remodelling#comments</comments>
		<pubDate>Tue, 02 Dec 2008 19:24:37 +0000</pubDate>
		<dc:creator>Dan Creswell</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.dancres.org/blitzblog/?p=238</guid>
		<description><![CDATA[The codebase of a subsystem or maybe the whole system has turned into a big ball of mud. It&#8217;s claimed too brittle, too complex and too costly to continue developing. It&#8217;s at this point that a grand rewrite is proposed accompanied by statements of how things will be different: We&#8217;ll eliminate static wiring using Spring [...]]]></description>
			<content:encoded><![CDATA[<p>The codebase of a subsystem or maybe the whole system has turned into a <a href="http://www.laputan.org/mud/mud.html">big ball of mud</a>.  It&#8217;s claimed too brittle, too complex and too costly to continue developing.  It&#8217;s at this point that a grand rewrite is proposed accompanied by statements of how things will be different:</p>
<ul>
<li>We&#8217;ll eliminate static wiring using Spring</li>
<li>We&#8217;ll model everything as a service</li>
<li>We&#8217;ll adopt test-driven development and make use of jMock</li>
<li>We&#8217;ll build everything using a RESTful approach</li>
<li>We&#8217;ll avoid using RPC in favour of messaging</li>
<li>&#8230;&#8230;.</li>
</ul>
<p>Things will be so much better in this brave new world but&#8230;&#8230;they won&#8217;t.  The reason the codebase has got into a mess is because we failed to execute on important principles such as:</p>
<ol>
<li>Take account of coupling and cohesion.</li>
<li>Be clear about people&#8217;s roles and responsibilities to avoid unqualified or inappropriate decision making.</li>
<li>Clarity and simplicity of roles and responsibilities in design elements.</li>
<li>Maintain modular, well-isolated code and <a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month#Conceptual_Integrity">conceptual integrity</a>.</li>
<li>Avoid shared data-schemas or integration via the database.</li>
<li>Make the software testable and maintain the tests.</li>
<li>Select technology based on appropriate design work.</li>
<li><a href="http://www.artima.com/intv/fixitP.html">No broken windows</a>.</li>
<li>Track and maintain appropriate metrics.</li>
<li>Review projects to identify and disseminate useful lessons to developers, architects and customers.</li>
<li>Account for the operational aspects of our software in requirements and design.</li>
<li>Review to ensure code aligns with appropriate design principles.</li>
<li>Surface, balance and mitigate risks.</li>
</ol>
<p>It&#8217;s these principles and others that enable superior engineering which in turn delivers a good-quality, maintainable codebase. Any rewrite will end up a ball of mud just like it&#8217;s predecessor unless the style of engineering is adapted to incorporate principles such as these.</p>
<p>Some propose that frameworks can prevent mistakes, ensure a quality design and deliver testable code. I think experience suggests otherwise as we routinely (by accident or design) bend frameworks to fit some problem they weren&#8217;t really designed for leading to ugly, broken, poorly designed, brittle code. What would stop us doing it with new frameworks delivered as part of a grand re-write?</p>
<p>Should we successfully revise our engineering practices would we then have sufficient leverage to restructure our ball of mud into something nicer to work with?  Maybe, maybe not but we might be better equipped to answer the question: re-write or re-factor?</p>
]]></content:encoded>
			<wfw:commentRss>http://dancres.org/feeder/?FeederAction=clicked&#038;feed=Articles+%28RSS2%29&#038;seed=http%3A%2F%2Fwww.dancres.org%2Fblitzblog%2F2008%2F12%2F02%2Fremodelling%2F&#038;seed_title=Remodelling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

