<?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>Singing Horse Studio LLP</title>
	<atom:link href="http://singinghorsestudio.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://singinghorsestudio.com</link>
	<description>Scalable Software.  Reliably Engineered.</description>
	<lastBuildDate>Thu, 20 Sep 2012 07:20:13 +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>Lock-In</title>
		<link>http://singinghorsestudio.com/lock-in/</link>
		<comments>http://singinghorsestudio.com/lock-in/#comments</comments>
		<pubDate>Thu, 20 Sep 2012 07:19:30 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=578</guid>
		<description><![CDATA[Lock-in is something we don&#8217;t sell at Singing Horse Studio LLP. We love our customers to stay with us, but not because they have to. How do we make sure our customers aren&#8217;t locked in? An open source stack, standard published frameworks, simple source code, and a test suite that ensures future programmers can understand<a class="moretag" href="http://singinghorsestudio.com/lock-in/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>Lock-in is something we don&#8217;t sell at Singing Horse Studio LLP. We love our customers to stay with us, but not because they have to. How do we make sure our customers aren&#8217;t locked in? An open source stack, standard published frameworks, simple source code, and a test suite that ensures future programmers can understand and modify our software.</p>
<p>Using an <a href="http://en.wikipedia.org/wiki/Open-source_software" title="Open Source Software" target="_blank">open source software</a> stack means using freely available software to run your application. Typically, we&#8217;ll recommend a Debian Linux server. It&#8217;s fast, reliable, well documented, and there are many many Linux sys admins in the world that can help you upgrade, maintain and optimise it. On top of this platform, we&#8217;ll use a standard framework to implement your software. Django is a favourite. It&#8217;s a Python framework, and again, is <a href="https://docs.djangoproject.com/en/1.4/" title="Django Documentation" target="_blank">well documented</a>, very popular, and top quality Django programmers are easy to come by.</p>
<p>Years of experience has taught us that simple software works. We compose any software system &#8211; no matter how large &#8211; of small, well specified modules. Each module has one area of responsibility &#8211; your system may have a customer module, a login module and a payments module for example. Each part of the system can be worked on in isolation, thereby reducing the burden on a new programmer. They don&#8217;t have to read everything to fix or extend any area of function. Within each module, we write simple code. Simple code is easy to read, easy to fix &#8211; you don&#8217;t have to wade through pages and pages of complexity to find the block of code that speaks to the database &#8211; and is more reliable. Simplicity works. Complexity is often hiding problems, and is always a headache for the next development team, who often suggest a rewrite in favour of understanding and propagating the problem.</p>
<p>And finally, we write automated tests. Any new programmer coming to our system can use the tests as documentation. The tests show how the software should work, and enforce the ways it shouldn&#8217;t work. Better than that, the new programmer can run the tests, and prove that the system works. This is great news when you are extending your system to handle a new use case, and you want to know you haven&#8217;t upset any existing function. The tests are a safety net, they are a useful form of documentation, and they set a good precedent &#8211; we hope your new programmer will run them, add to them and keep them up to date.</p>
<p>So your shiny new software is delivered on an industry standard platform, is built of industry standard software, is written with very popular programming languages and is composed of neat, simple code. It&#8217;s protected by tests. And it is free of vendor lock-in. It&#8217;s our goal that your system can be worked on by any competent developer or development team. We know businesses grow and change. We realise there may be a time when you take all of your development in house, or you need to hire a maintenance programmer to upgrade your system. Of course, we&#8217;d really like that to be us, but we want that to be your choice, not ours.</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/lock-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It all starts with a spreadsheet (usually)</title>
		<link>http://singinghorsestudio.com/it-all-starts-with-a-spreadsheet-usually/</link>
		<comments>http://singinghorsestudio.com/it-all-starts-with-a-spreadsheet-usually/#comments</comments>
		<pubDate>Wed, 22 Aug 2012 13:24:53 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[Software Tools]]></category>
		<category><![CDATA[The Way We Work]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=566</guid>
		<description><![CDATA[We run a software company. We specialise in writing business tools, payments engines and data layers that can be scaled up to epic proportions. As you might expect, we write tools to help us run our company. Any task we need to carry out more than once or twice is usually automated. We have a<a class="moretag" href="http://singinghorsestudio.com/it-all-starts-with-a-spreadsheet-usually/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>We run a software company. We specialise in writing business tools, payments engines and data layers that can be scaled up to epic proportions. As you might expect, we write tools to help us run our company. Any task we need to carry out more than once or twice is usually automated. We have a growing suite of internal business tools that free up our time so that we can spend more time writing software and less time performing repetitive business tasks. However, writing business tools takes time, and if we automated <em>everything</em>, we&#8217;d spend all of our time writing internal tools and quickly go out of business as we neglect our project work! I thought I&#8217;d share our approach to striking a balance between making sure we have a useful set of internal tools and spending all of our time writing the tools. Since most tools are data driven, it all starts with a spreadsheet (usually).</p>
<p>When we decide that some piece of data, trend or pattern is worth monitoring, we start off with a shared spreadsheet which we can all quickly dump information into. For example, when we decided to start tracking what we spent our time at work actually doing, the first port of call was a Google Docs Spreadsheet. We use Google for our e-mail, so we got all of the sharing, authentication and security for free. All of the Singing Horse Studio LLP Founders then put five minutes aside at the end of each day to update the spreadsheet with a rough breakdown of what we&#8217;d done that day. Once we&#8217;d done this for a couple of months, we had data to play with. Which meant graphs (who doesn&#8217;t love a graph?), analysis, and informed decision making in our weekly strategy meeting. But this graphing, analysis and data extraction in itself became a repetitive task. Each week before our strategy meeting, we&#8217;d sort the spreadsheet, print several sheets and tabs out, and collate the new data to compare to previous weeks. Which is when we realised the data was valuable enough to us for us to spend the time writing an internal tool to do the leg work for us.</p>
<p>We carved out a little time from one of our developers and asked them to create a web based internal tool for our hours tracking. That developer, lets call them Johnny, created a lovely Python / Django / MySQL web app running on a VM on our internal Virtual Server. Django&#8217;s admin interface let us set up our users and enter the time records with very little time spent coding the nuts and bolts. A few days later, we had a rather lovely internal tool that allowed us to navigate our hours by project, person, date range, type of activity, and various other fields. </p>
<p>Heaps of information about our working hours is now instantly available on an internal web page, and we review it each week in the strategy meeting. Since all the historical data is also readily available, we also have a couple of graphs to show us how our activities are trending &#8211; do we have enough work in the pipeline? Have we met our business development targets this week? Do we have signed contracts for all the projects coming up in the next few weeks? In this way, our hours tracking has evolved from a simple spreadsheet to a really neat business tool. The way we all used the spreadsheet informed the design of the tool we wrote, and the tool continues to grow organically with our company as we find new things to monitor and track.</p>
<p>So why didn&#8217;t we write the tool first off and skip the spreadsheet? One of the main reasons is that we didn&#8217;t see the immense value in tracking our activities until after we had started doing it. We always try and start with the simplest solution, and writing a tool wasn&#8217;t appropriate until we knew we wanted to be able to compare our data to previous weeks. Had it turned out not to be a useful exercise, we would have been able to ditch the spreadsheet without having wasted any of our development resources. And since it was useful, the spreadsheet turned out to be a great rapid prototype, and the formulae we&#8217;d each started writing in it to give summary data turned out to be the starting point for our internal hours and projects tracking tool.</p>
<p>If you are starting to get to the limits of a spreadsheet based tracking system in your business, why not get in touch with us at <a href="mailto:hello@singinghorsestudio.com?Subject=Spreadsheet to business tool enquiry" target="_blank">hello@singinghorsestudio.com</a> or + 44 1273 234690 to discuss converting this into a database driven tool that gives you the power to collate data at the click of a mouse, navigate your stored information with ease, and generate real time reports to suit your company requirements.</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/it-all-starts-with-a-spreadsheet-usually/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quality, Features, Time.</title>
		<link>http://singinghorsestudio.com/quality-features-time/</link>
		<comments>http://singinghorsestudio.com/quality-features-time/#comments</comments>
		<pubDate>Tue, 03 Jul 2012 08:39:28 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[The Art Of Software]]></category>
		<category><![CDATA[The Way We Work]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=517</guid>
		<description><![CDATA[We all know the old adage &#8230; &#8220;Quality, Features, Time: pick two&#8221;. It&#8217;s a useful reminder that trying to squeeze too many features into too little time will inevitably impact quality. It&#8217;s also a useful reminder that focussing only on quality will lead to a reduction of the rate of feature development. And it even<a class="moretag" href="http://singinghorsestudio.com/quality-features-time/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://singinghorsestudio.com/quality-features-time/agile_dashboard/" rel="attachment wp-att-518"><img src="http://singinghorsestudio.com/wp-content/uploads/agile_dashboard.jpg" alt="Quality, Features and Time, all turned up to 11. Because it&#039;s one louder than 10." title="Quality, Features and Time, all turned up to 11. Because it&#039;s one louder than 10." class="alignleft size-full wp-image-518" style="float:right" /></a></p>
<p>We all know the old adage &#8230; &#8220;Quality, Features, Time: pick two&#8221;. It&#8217;s a useful reminder that trying to squeeze too many features into too little time will inevitably impact quality. It&#8217;s also a useful reminder that focussing only on quality will lead to a reduction of the rate of feature development. And it even works to remind us that if we keep increasing the number of features, we&#8217;ll never ship anything!</p>
<p>The mitigations for each scenario? Work out the right number of features for the time you have available. Sprints, prioritisation and MVP help a lot here. Work out a realistic schedule for shipping something, (hint: make it as soon as MVP makes possible), and focus on the right level of quality for the deliverable you need. Heavy engineering is needed if the system you are building is planned to be a web scale app, while a faster, more lightweight approach might be appropriate for an internal tool that will only ever experience light use.</p>
<p>As always, delivering a successful software project is a balance of multiple factors, and the smartest thing we can do is measure and assess the impact of what we do versus what we&#8217;re planning to deliver.</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/quality-features-time/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scope Creep</title>
		<link>http://singinghorsestudio.com/scope-creep/</link>
		<comments>http://singinghorsestudio.com/scope-creep/#comments</comments>
		<pubDate>Sun, 01 Jul 2012 19:30:10 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[The Way We Work]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=470</guid>
		<description><![CDATA[Scope creep can be a killer. Adding features to a work in progress almost always causes trouble. At its simplest, the extra work delays the delivery of the current phase of a project and increases cost. Subtler effects include a gradual degradation of the quality of a project. Changing requirements contribute to a shifting of<a class="moretag" href="http://singinghorsestudio.com/scope-creep/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>Scope creep can be a killer. Adding features to a work in progress almost always causes trouble. At its simplest, the extra work delays the delivery of the current phase of a project and increases cost. Subtler effects include a gradual degradation of the quality of a project. Changing requirements contribute to a shifting of the bedrock of a project. The basics are never nailed down for long enough for the development team to make headway, and project management is always trying to catch up with the new list of features and deliverables.</p>
<p>So what do we do about scope creep at Singing Horse Studio LLP? Our Agile process takes care of it for us. The project management team captures the new requirement and simply adds it to the product backlog. The product backlog is the long list of features that could and / or will be included in the project. The development team is able to keep their heads down developing, safe in the knowledge that the content of the current sprint will not change. The customer gets their deliverable on time and at maximum quality.</p>
<p>What happens to the new feature we just added to the backlog? Nine times out of ten, the new feature is addressed in the next sprint. And since sprints at Singing Horse Studio LLP are between three and ten working days long, the wait isn&#8217;t too long. And the other one time out of ten? At the start of the new sprint, when we sit with the customer and prioritise the backlog to agree what to work on next, the customer chooses other features over the new requirement. Sprint planning is an exercise in comparing all the available features to decide what the customer would most like next. Sometimes that new feature just doesn&#8217;t seem as important when considered against all the other great feature ideas sitting in the backlog.</p>
<p>Working on and delivering software in short sprints means that we can respond to our customers&#8217; changing needs and new features without the loss of control that scope creep introduces. Regularly assessing the backlog at the start of each sprint means the customer gets to choose what is most important and relevant &#8212; including all the great ideas the most recent demonstration inspired in them &#8212; but the team delivering your project can always give their best, as they have a clear and unchanging picture of what is in the current sprint.</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/scope-creep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Horizontal vs Vertical Scaling</title>
		<link>http://singinghorsestudio.com/horizontal-vs-vertical-scaling/</link>
		<comments>http://singinghorsestudio.com/horizontal-vs-vertical-scaling/#comments</comments>
		<pubDate>Tue, 01 May 2012 20:48:46 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=433</guid>
		<description><![CDATA[What are horizontal and vertical scaling? And when do you use them? Vertical scaling is adding oomph to the machine that an application is running on. Perhaps your e-commerce site is getting more traffic as your business grows, and it&#8217;s starting to creak at the seams. A common way to give the application a boost,<a class="moretag" href="http://singinghorsestudio.com/horizontal-vs-vertical-scaling/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>What are horizontal and vertical scaling? And when do you use them?</p>
<p><strong>Vertical scaling</strong> is adding oomph to the machine that an application is running on. Perhaps your e-commerce site is getting more traffic as your business grows, and it&#8217;s starting to creak at the seams. A common way to give the application a boost, is to add more RAM, more processors, more bandwidth, or more storage to your machine. Maybe you simply move your application to a new, more powerful machine.</p>
<p>Using vertical scaling is great for applications that can only run on a single machine. Perhaps you are using an off the shelf web shop that is fully integrated and can&#8217;t run on more than one machine at a time. Or perhaps the server you are using is underpowered for the latest version of the software you have installed.</p>
<p>Vertical scaling can be a quick and easy way to get your application&#8217;s level of service back up to standard. On the negative side, vertical scaling will only get you so far. Upgrading a single server beyond a certain level can become very expensive. If you already have a quad processor, moving up to eight processors can add cost quickly. And if you already have eight processors, you may start to wonder if there is an easier way. Especially if your disaster recovery strategy is to have a mirror machine at the ready at all times!</p>
<p><strong>Horizontal scaling</strong>, on the other hand, is adding more servers to your application to spread the load. The simplest case of horizontal scaling may be to move your database onto a separate machine from your web server. Now your web server can simply satisfy requests, and your database server can simply crunch data.</p>
<p>If your application can be broken down into more modules, perhaps it has a three tier architecture &#8211; a database layer, a business logic layer and a presentation layer &#8211; then it can be spread across more servers. If your application is running on three machines and you find your database is holding you back, you can add a second machine to your database layer. Your data crunching capacity is virtually doubled. If your presentation layer is the next to slow you down, you can simply add a second machine serving web requests and split the traffic with a load balancer.</p>
<p>Horizontal scaling can only be applied to applications built in layers that can run on separate machines. Horizontal scaling applies really well to on-demand cloud server architectures, such as Amazon&#8217;s EC2 hosting platform. Horizontal scaling can also facilitate redundancy &#8211; having each layer running on multiple servers means that if any single machine fails, your application keeps running.</p>
<p>An application that has been designed from the ground up to be scaled horizontally tends to be really easy to scale down too. If you have a seasonal demand pattern, it is very easy to bring your application layers back down to run on a single server when demand is low. And you can add the servers back when demand is high again. And best of all? A horizontally scalable application tends to run on low end hardware. You tend to add low power servers into your cluster to reduce load, rather than needing powerful (and more expensive) machines to run your application.</p>
<p>So which scaling strategy should you use? Both are useful. There are many applications that can only scale vertically. They can only be run on a single server. You have a clear strategy choice with these applications! But, a well written application should scale horizontally very easily. An application that is designed to scale horizontally can <em>also</em> be scaled vertically. So you still have a choice. You can weigh up the cost of vertically scaling with an extra 4Gb of RAM vs horizontally by adding a new server in your cluster.</p>
<p>At Singing Horse Studio LLP, we always write our web applications with horizontal scaling in mind. It&#8217;s easy to do, it gives you the maximum choice in the future, and it tends to drive flexibility and modularity into your web application. And those things are almost never bad <img src='http://singinghorsestudio.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>If you&#8217;d like to know more about scaling issues in general, why not listen to our <a href="http://podcast.singinghorsestudio.com/scalability-for-managers" target="_none">podcast</a> on the subject? Or better still; <a href="http://singinghorsestudio.com/contact-us/">get in touch</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/horizontal-vs-vertical-scaling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simon&#8217;s Top Three Picks from the AWS Cloud for Start-Ups &amp; Developers Event</title>
		<link>http://singinghorsestudio.com/simons-top-three-picks-from-the-aws-cloud-for-start-ups-developers-event/</link>
		<comments>http://singinghorsestudio.com/simons-top-three-picks-from-the-aws-cloud-for-start-ups-developers-event/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 16:38:30 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Cloud computing]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Software Tools]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=410</guid>
		<description><![CDATA[I attended the Amazon Web Services Cloud for Start-Ups &#038; Developers Event in London today, there were several really useful talks and a nice run through of some of the newer AWS technologies. Here are my top three picks from the day: #1 EC2 Autoscaling We got some demos of some very solid and practical<a class="moretag" href="http://singinghorsestudio.com/simons-top-three-picks-from-the-aws-cloud-for-start-ups-developers-event/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>I attended the Amazon Web Services Cloud for Start-Ups &#038; Developers Event in London today, there were several really useful talks and a nice run through of some of the newer AWS technologies. Here are my top three picks from the day:</p>
<p><strong><a href="http://aws.amazon.com/autoscaling/" target="_blank">#1 EC2 Autoscaling</a></strong></p>
<p>We got some demos of some very solid and practical auto scaling tools. Set some maximum and minimum system sizes, add some CloudWatch monitoring and you can easily create policies for when to have extra resources spun up or dropped out of your cluster. Very useful, very practical, and all bounded by hard limits (just in case your app becomes sentient I guess! #skynet).</p>
<p><strong><a href="http://aws.amazon.com/ec2/spot-instances/" target="_blank">#2 EC2 Spot Market</a></strong></p>
<p>Did you know you can bid for time on unused EC2 instances? I didn&#8217;t! Set some instance criteria (small / large, high memory / high cpu, etc), nominate a price you are willing to pay per hour, and when an unused instance is available at that price, AWS will spin it up and run your app. Perfect for apps that chug their way through a queue of jobs. Of course, the instance will spin down as soon as it is required by AWS (for a customer paying full price, for example), so it&#8217;s not the right way to run your database layer. However, spot instances are perfect for batch processing that is not time critical &#8211; like a payroll run, or image stitching. Can&#8217;t wait for the right customer app to come along that could use it &#8211; it sounds like fun, and has the potential to save the right sort of app a lot of the cost of its processing.</p>
<p><strong><a href="http://zeebox.com/" target="_blank">#3 ZeeBox</a></strong></p>
<p>Great talk by Anthony Rose, the CTO of ZeeBox. Not a lot of detail on how they use AWS, but a great app that adds &#8216;second screen&#8217; functionality and interaction to your tv viewing. I really loved the concept.</p>
<p>All in all, the afternoon was well worth attending. We use a lot of Amazon Web Services technology here at SHS and Amazon&#8217;s armoury is constantly expanding. Today was a great way to stay aware of what is coming from the Cloud.</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/simons-top-three-picks-from-the-aws-cloud-for-start-ups-developers-event/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Measure Twice, Cut Once &#8211; How To Take Care Of Your Online Application</title>
		<link>http://singinghorsestudio.com/measure-twice-cut-once-how-to-take-care-of-your-online-application/</link>
		<comments>http://singinghorsestudio.com/measure-twice-cut-once-how-to-take-care-of-your-online-application/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 23:55:35 +0000</pubDate>
		<dc:creator>H</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Software Tools]]></category>
		<category><![CDATA[The Art Of Software]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[ganglia]]></category>
		<category><![CDATA[graphite]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[New Relic]]></category>
		<category><![CDATA[statsd]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=378</guid>
		<description><![CDATA[My mother always told me about the carpenter who would measure twice and cut once. It didn&#8217;t make any sense to me as a kid, but I soon understood exactly what she meant the day I built my first set of shelves. Hrm. If only I had listened to her sooner &#8230; It seems that<a class="moretag" href="http://singinghorsestudio.com/measure-twice-cut-once-how-to-take-care-of-your-online-application/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>My mother always told me about the carpenter who would measure twice and cut once.  It didn&#8217;t make any sense to me as a kid, but I soon understood exactly what she meant the day I built my first set of shelves. </p>
<p>Hrm. If only I had listened to her sooner &#8230; <img src='http://singinghorsestudio.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>It seems that this advice can be applied to software engineering too, as one of the most important aspects of building a scalable online application (or any software architecture for that matter) is the ability to measure what&#8217;s going on.  After all, if you can&#8217;t tell what your application is up to, then how on earth are you going to be able to tune it, or fix it when it goes wrong (or even notice when it&#8217;s broken!), if you&#8217;re not monitoring it?</p>
<p>Makes total sense, eh?</p>
<p>Of course it makes sense!</p>
<p>Which is why we recommend it to all our clients &#8212; monitor what your application is doing, otherwise you won&#8217;t be able to know when you have to put your scalability plan into place. (You do have a scalability plan, don&#8217;t you?!)</p>
<p>So recently we&#8217;ve been investigating different solutions for monitoring hosts and applications that we install for clients. Traditionally we&#8217;ve used plain old Ganglia for host performance characteristics e.g. CPU, RAM, disk, network i/o etc. and Nagios to warn us when certain things aren&#8217;t working how we expect e.g is that host up and running, are there 23 newsletter sign ups happening every hour, does that web page say what we expect, is that database responding to queries etc.</p>
<p>If something isn&#8217;t working how we expect to be working, then we get told about it.  Depending on the  system, the responsible engineer(s) receive an email, SMS text, or ping via their <a href="http://damien.degois.info/android/aNag/">aNag</a> app on their Android device. Sweet.</p>
<p>But we never really get much of an insight into how our software is performing once it goes live; we rarely get to see how our apps perform once they&#8217;re up and running.</p>
<p>Don&#8217;t get me wrong, we have logging throughout development/deployment/production life cycle, we run performance testing and load testing before go live, we collect stats. But nothing that&#8217;s easily harnessed and displayed via a simple dashboard.</p>
<p>We&#8217;ve been looking into different technologies to solve this. From one end of the scale there&#8217;s the roll your own a la <a href="http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/">Etsy</a> and the <a href="https://github.com/etsy/statsd">statsd</a> plus <a href="http://graphite.wikidot.com/">graphite</a> solution, all the way to the SaaS (software as a service) solution from <a href="http://newrelic.com/">New Relic</a>.</p>
<p>Most reporting mechanisms implement some kind of UDP fire and forget network ping which is perfect for the kind of web based applications we all love to develop; hey, it seriously doesn&#8217;t matter if our reporting metric doesn&#8217;t get through, because remember we still have logs on the actual host in case of emergency, but it&#8217;s great to see performance stats being charted on a cool dashboard in (nigh on) real time.</p>
<p>New Relic gives us that in-depth x-ray look into how our apps are performing &#8212; was it that pymongo query affecting throughput, or was it the network causing excessive latency? We can even drill down to the Python method/function layer in our RESTful services if that&#8217;s what it takes.</p>
<p>The statsd approach requires a little more forethought into what we need to do to implement measurement recording, but at the same time it gives us a higher level of flexibility in what we want to measure exactly.</p>
<p>In the meantime, Johnny is working on an internal Erlang product that, as part of its plugin module nature, will be able to measure, report, and take necessary action on significant events that occur within an application or that occur based on the server&#8217;s performance characteristics. I can&#8217;t wait to get this into production!</p>
<p>Either way, measuring performance is the ultimate goal, because without measurements, you can&#8217;t take any informed action, and without informed action, you&#8217;re effectively running your online business in the dark.</p>
<p>And you wouldn&#8217;t want that, in the same way you wouldn&#8217;t want a set of shelves that didn&#8217;t fit.  Now where did I put that tape measure and saw &#8230;?</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/measure-twice-cut-once-how-to-take-care-of-your-online-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nose Plugin Raising AttributeError</title>
		<link>http://singinghorsestudio.com/nose-plugin-raising-attributeerror/</link>
		<comments>http://singinghorsestudio.com/nose-plugin-raising-attributeerror/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 18:46:14 +0000</pubDate>
		<dc:creator>H</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[The Art Of Software]]></category>
		<category><![CDATA[Nose]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=368</guid>
		<description><![CDATA[Hah. So here&#8217;s something of a Nose gotcha that caught me out the other day, and hopefully you won&#8217;t make the same mistake as me! In case you don&#8217;t know what I&#8217;m talking about, Nose is a neat Python test discovery and runner. Essentially you can point it at your Python source code and it<a class="moretag" href="http://singinghorsestudio.com/nose-plugin-raising-attributeerror/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>Hah. So here&#8217;s something of a Nose gotcha that caught me out the other day, and hopefully you won&#8217;t make the same mistake as me!</p>
<p>In case you don&#8217;t know what I&#8217;m talking about, <a href="http://readthedocs.org/docs/nose/en/latest/">Nose</a> is a neat Python test discovery and runner.  Essentially you can point it at your Python source code and it will automatically discover your unit tests (<em>you do have unit tests, don&#8217;t you?!</em>), run them, and then provide you with a report of success/failure.  It&#8217;s perfect for Test Driven Development, and makes your whole development process as smooth as silk from the command line, and integrates nicely with the likes of <a href="http://jenkins-ci.org/">Jenkins</a> et al.</p>
<p>On top of that, Nose supports an elegant plugin model that allows the basic functionality of Nose to be extended in any direction you wish; for example there are plugins for reporting on your test coverage, plugins for profiling your Python code, plugins to integrate with Google App Engine, Django, or Komodo etc.</p>
<p>Thing is, there wasn&#8217;t a plugin available to specifically integrate with a project that we&#8217;re currently working on at Singing Horse Studio (<em>more on that in a blog post to follow</em>), but that&#8217;s ok, because we can easily extend Nose ourselves by creating our own plugin &#8230;</p>
<p>&#8230; and all was swimming along nicely until something rather odd happened.</p>
<p>Whenever I ran my tests with the auto discovery option (by simply typing <em>nosetests</em>), it would raise an AttributeError: &#8216;NoneType&#8217; object has no attribute &#8230; </p>
<p>But if I chose a particular module to test (<em>nosetests the_module_to_test</em>) it would work fine.</p>
<p>Huh?!</p>
<p>Now the solution was trivial, but I needed Johnny&#8217;s help to notice it, because I was too caught up in the code, and couldn&#8217;t see the wood for the trees.  I had named my plugin class starting with the word &#8220;Test&#8221; (it was relevant to the project we&#8217;re working on, not that I was too lazy to think of an appropriate name, honest!)</p>
<p>[cc lang="python"]<br />
from nose.plugins import Plugin</p>
<p>class TestThingThatWeNeed(Plugin):<br />
    name = &#8216;test_thing_that_we_need_plugin&#8217;</p>
<p>    def configure(self, options, conf):<br />
        &#8220;&#8221;"<br />
        Configure plugin.<br />
        &#8220;&#8221;"<br />
        Plugin.configure(self, options, conf)<br />
        self.do_that_thing_we_want = True</p>
<p>&#8230;<br />
&#8230;<br />
[/cc]</p>
<p>So, Nose being awesome and everything, kindly chose to auto discover my plugin class (because it started with the word Test), and thereby prevented any of the module from importing and initialising.  D&#8217;Oh!</p>
<p>Renaming the class to something without Test in the name solved it.  No more AttributeError when trying to run tests whilst using the plugin. Yay!</p>
<p>Now that this blog post is out there, you won&#8217;t make the same stupid mistake, will you? <img src='http://singinghorsestudio.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Incidentally, keep a watch out for an announcement about the project that we&#8217;re writing the plugin for; if you&#8217;re into unit/continuous integration testing, you&#8217;ll love it &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/nose-plugin-raising-attributeerror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How We Work</title>
		<link>http://singinghorsestudio.com/how-we-work/</link>
		<comments>http://singinghorsestudio.com/how-we-work/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 18:16:29 +0000</pubDate>
		<dc:creator>H</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[burndown chart]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[product backlog]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[sprint]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=305</guid>
		<description><![CDATA[As part of any project we undertake, we usually like to work in a particular style. Now, ultimately we want to follow a process that our clients enjoy, that allows us to finish projects within a well-defined and predictable time-scale, and that allows clients to launch products earlier rather than later to give best return<a class="moretag" href="http://singinghorsestudio.com/how-we-work/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>As part of any project we undertake, we usually like to work in a particular style.</p>
<p>Now, ultimately we want to follow a process that our clients enjoy, that allows us to finish projects within a well-defined and predictable time-scale, and that allows clients to launch products earlier rather than later to give best return on investment.</p>
<p>So as good Agile practitioners, we have been continually modifying and improving our process as we&#8217;ve gone along, throwing out the methods that fail (erk!), and tweaking the process where it succeeds (yay!)</p>
<p>Sure, there&#8217;s been times in the past where we felt a <em>lot</em> of improvement was deserved and required, but we now believe we&#8217;re at a point where we&#8217;re happy and confident in the way we work &#8230;</p>
<h2>Agile Development</h2>
<p>At Singing Horse Studio we follow an Agile development methodology. Now, Agile development means many different things to many different people, so I think I should describe the core tenets of our process, and why we believe it&#8217;s so beneficial.</p>
<h3>High-priority work first</h3>
<p>By always focusing on the most important task first, we&#8217;re given the greatest flexibility for reducing scope whenever the tensions increase between the other aspects of the project completion triangle &#8212; i.e. scope, resourcing, and time.</p>
<p>For example, a client wanting to launch a product as soon as possible, can safely cut down on the features if required, being safe in the knowledge that the most important work has been completed first. This actively supports development and launch of MVP (<a title="Minimum Viable Product" href="http://www.startuplessonslearned.com/2009/08/minimum-viable-product-guide.html" target="_blank">Minimum Viable Product</a>) as described by Eric Ries in his lean startup techniques.</p>
<h3>Short bursts of focused work</h3>
<p>In the development vernacular, these are called sprints.</p>
<p>The goal of a sprint is to deliver one or more features or components of a project, and to do so with a maximum focus on actually delivering work.</p>
<p>Software development really benefits from the <em><a title="Flow State" href="http://en.wikipedia.org/wiki/Flow_(psychology)" target="_blank">flow state</a></em>, so we try to limit distractions and context switching during a sprint. This means that task/project planning, creative thinking about how to use the product with yellow widgets, discussions about how the product will evolve in 6 to 9 months time, modifications to the agreed sprint goal etc etc are <strong>BANNED</strong> &#8212; or at least those that involve the actual software developer!</p>
<p>This is why we have project managers and project teams; leave the coders to <em>focus</em> on getting the sprint completed before you involve them on these distractions.</p>
<p>Anyway, assuming all goes well, at the end of a sprint there&#8217;s traditionally a demonstration of the feature/component/sprint goal to the client and project stakeholders. It&#8217;s at this point we all go for a beer. Or two.</p>
<h3>SCRUM artefacts</h3>
<p>One Agile methodology that Singing Horse Studio enjoys following is SCRUM. As part of the SCRUM project management process, several artefacts are created &#8212; the product backlog, the sprint backlog, and the burndown chart.</p>
<p><em>The Product Backlog:</em> At the start of the project, the product owner prepares a list of client requirements, and then prioritises each of these by business value. We contribute to this product backlog by estimating the cost of developing those features. The requirements are formed by features visible to end-users, as well as the technical requirements to build the product.</p>
<p>The prioritisation is important, because this is what allows us to focus on most important features first. Of course, once the sprint is under way, anything in the product backlog can be re-prioritised if desired.</p>
<p><em>The Sprint Backlog:</em> When the team has committed to delivering a set of top priority features from the product backlog, those items are then broken down into individual tasks required to deliver each feature. Once tasks are planned and estimated, they form the workload required to deliver the next sprint. These tasks form the sprint backlog which makes for a simple reference for both product owner and development team to understand exactly what&#8217;s expected to be delivered at the end of the sprint.</p>
<p><em>The Burndown Chart:</em> During the course of a sprint, the actual time taken to deliver a task can be compared with the original estimate. These actuals and estimates are recorded on the burndown chart, which shows the current progress of the development team. By closely monitoring the burndown chart, each interested party can easily visualise how the project is progressing, and can quickly rectify wayward planning or implementation.</p>
<h3>Frequent product demonstrations</h3>
<p>Demonstrations show the piece of high-priority work that has just been completed. This demonstration can be validated against the specification whilst at the same time soliciting feedback from the client to help assure that we&#8217;re doing the work required in the manner to which we&#8217;ve committed.</p>
<p>By running frequent product demonstrations, we all avoid the trap of completing a project without feedback. Imagine a year long software development project, and being told on day 365 that it&#8217;s <em>not</em> how the product should now work! Finding out after week one is a <em>much</em> better way of mitigating against a truly expensive mistake, eh?</p>
<h3>Iterations</h3>
<p><a title="Marc Raibert" href="http://www.ai.mit.edu/projects/leglab/old-leglab/people/mxr.html" target="_blank">Marc Raibert</a> once said <a title="Good Writing Is Bad Writing Rewritten" href="http://www.cs.cmu.edu/~pausch/Randy/Randy/raibert.htm" target="_blank">&#8220;Good Writing is Bad Writing That Was Rewritten&#8221;</a>.  A similar thing can be said for code.</p>
<p>Kinda.</p>
<p>Apart from the fact that we <em>start</em> with good code, not bad code!</p>
<p>You see, we make good software the first time; we make <em>great</em> software by being able to iterate on it. Working on the most important things first, we evolve that core code with greater enhancements, additional features and clearing out defects as we go along. All this iteration over the codebase is made possible because we make sure our code is covered by tests &#8230;</p>
<p>&#8230; which leads us to &#8230;</p>
<h3>Test-driven development</h3>
<p>So, how can we continue iterating over the code without fear of breaking previously working code (something that QA discover with regression tests)?</p>
<p>By insisting upon a high level of continually tested code, that&#8217;s how. And which we ensure by adopting test-driven development.</p>
<p>Test-driven development is a way of writing software that makes it easily testable from the start. Hey, it doesn&#8217;t <em>have</em> to be done that way. In fact you can try and write code to test your assumptions <em>afterwards</em>, but usually you&#8217;ll find that you&#8217;ve made it impossible to test because your spaghetti code has introduced inter-dependencies, and relies too much upon expensive (in terms of execution time) method calls to live databases, networks and customer data. Ouch.</p>
<p>Test-driven development has the double benefit of firstly insisting on having tests that ensure everything works as expected, and secondly makes the codebase that much easier to understand and digest.</p>
<p>Furthermore, we never encounter the same defect twice. If we discover a problem, we first write a test to warn us of the defect, and then we write the code to ensure the test passes. It will never turn in to a defect ever again, even with non-related changes.</p>
<h3>Continuous Integration</h3>
<div style="float:right"><img class="captify" src="http://singinghorsestudio.com/wp-content/uploads/the_cube.jpg" alt="Green Cube FTW!" width="150" height="150" /></div>
<p>So, how can you be confident that your latest version of the product build actually works?  Surely, just because the individual unit tests pass, it doesn&#8217;t mean your product as a whole will work successfully first time, will it?</p>
<p>Well, <em>we</em> have confidence because of continuous integration.</p>
<p>Any time code is checked into our repository, the product is automatically re-built and integration tests are immediately run. A green light means all is ok; a red light means something broke. And if something broke, then <em>that</em> becomes our highest priority thing to fix, because we always want to be in a state where we can <em>&#8220;make the product live&#8221;</em> and have no fear in doing so.</p>
<h3>Code is Law</h3>
<p>How many times have you read a wiki page, documentation, or a instruction manual about how something is supposed to work, but it never quite seems to work that way in reality? </p>
<p>It&#8217;s far too easy for documentation that lives outside of the codebase to fall out of sync with changes in the software. And so, because of this, we always aim to derive our documentation from the code itself. Tools like <a href="http://epydoc.sourceforge.net/" title="Epydoc" target="_blank">Epydoc</a> help drive this to ensure we generate useful documentation. </p>
<div class="mb30"></div>
<p>Anyway, hopefully this has given you a little insight into how we work. It&#8217;s a process that has evolved; it&#8217;s a process that will continue evolving, I&#8217;m sure. Remove the fail, celebrate the win, and deliver high quality software products in the process &#8212; that&#8217;s our ultimate goal.</p>
<p><script type="text/javascript">
$(function(){
	$('img.captify').captify();
});
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/how-we-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scalability: What To Do When Disaster Strikes</title>
		<link>http://singinghorsestudio.com/scalability-what-to-do-when-disaster-strikes/</link>
		<comments>http://singinghorsestudio.com/scalability-what-to-do-when-disaster-strikes/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 10:47:30 +0000</pubDate>
		<dc:creator>H</dc:creator>
				<category><![CDATA[Best Practice]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[downtime]]></category>
		<category><![CDATA[scalabilty]]></category>

		<guid isPermaLink="false">http://singinghorsestudio.com/?p=264</guid>
		<description><![CDATA[It&#8217;s happened to the best of us; no matter what scalability plans we put into place, no matter how many horizontally scaled virtual hosts we spin up, no matter how we shard our carefully crafted data, no matter how many greens we show in our automated tests, there&#8217;s always one element that might just catch<a class="moretag" href="http://singinghorsestudio.com/scalability-what-to-do-when-disaster-strikes/">... [Continued]</a>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s happened to the best of us; no matter what scalability plans we put into place, no matter how many horizontally scaled virtual hosts we spin up, no matter how we shard our carefully crafted data, no matter how many greens we show in our automated tests, there&#8217;s always one element that might just catch us out.</p>
<p>Human error.</p>
<p>It&#8217;s easy to overlook a misplaced comma in a config file, or heaven forbid coding a quick patch on a live running service. The human error is bound to creep in one day, and so you should be prepared.</p>
<p>And I don&#8217;t mean be prepared <em>just</em> for the human error. The advice I&#8217;m going to give applies just as equally to hardware or software failures. You see, it&#8217;s all about how you communicate with your customers when disaster strikes.</p>
<p>Whilst writing this, I&#8217;m reminded of a recent incident involving a DNS outage at MyDomain.com, an example of how <em>not</em> to handle a disaster. In fact, had they handled the incident better, we would probably still be hosting our DNS with them. I&#8217;ll be taking this as an example, and compare it with how Singing Horse Studio currently handle outages, some of which we&#8217;ve inherited from our time at Linden Lab, the makers of Second Life.</p>
<h2>Don&#8217;t Panic</h2>
<p>The main thing is don&#8217;t panic! No matter how bad it seems to be, taking a breath and stepping back from the problem is the best first step. You won&#8217;t be making it any worse by taking your time, whereas I&#8217;ve witnessed more small errors turn into bigger problems by stupid mistakes made under stress.</p>
<h2>Assign One Person As Point</h2>
<p>If you&#8217;re not a one-man-band then you&#8217;ll have the luxury of appointing a single person as point. It&#8217;s this person&#8217;s job to co-ordinate events, taking the lead in organising who deals with what, and facilitating communication with others.</p>
<p>Here at Singing Horse Studio, the person on point would be responsible for documenting events for the post-mortem (more on that later), and communicating with customers directly, but for organisations that have their own dedicated customer services department, point will simply communicate events to the customer service representatives for them to inform the customers.</p>
<p>The advantage of assigning someone as point means that you can allow the engineers to fix the problem without giving them any additional pressure and stress of &#8220;get it fixed now!&#8221;; they can focus on what they need to do whilst one person can handle the co-ordintation. This gives them the freedom, instead, to regularly inform management, customer services, affected departments etc on the progress of the fix. Which leads to &#8230;</p>
<h2>Keep Your Customers Informed. Regularly.</h2>
<p>If there&#8217;s anything more frustrating for a customer or manager, it&#8217;s the lack of information. Put yourself in the customer&#8217;s shoes:</p>
<div class="testimonial mb20"><em>Hey, if you&#8217;ve broken something, and my business relies on it working, then I want to know when it&#8217;s going to be fixed</em></div>
<p>Damn right. And being kept in the dark about progress (or lack thereof) is going to make your customer worry even more than necessary.  Even communication saying &#8220;we&#8217;re still looking into it&#8221; is better than silence.</p>
<p>With the MyDomain DNS outage, we first became aware because of our own internal <a href="http://www.nagios.org/" title="Nagios" target="_blank">Nagios</a> checks.  A disappearing host isn&#8217;t a good sign, and it was quickly diagnosed as a DNS failure.  I first checked to see if MyDomain had a maintenance window or a service status page, but unfortunately it just pointed to their knowledge base.  Not a good sign.</p>
<p>So what&#8217;s the best way of keeping up with news as it happens? Twitter of course! And checking their Twitter stream showed that they did indeed have problems.</p>
<p>Now, at least they did something right by monitoring their Twitter messages and responding to them, but there was never a series of planned communication to the customers.  Instead, the only communication they exposed was a reply to any question about their service being down with &#8220;I&#8217;m sorry, yes we&#8217;re working on it&#8221;.  No explanation as to what the problem might be, no estimation time for a fix, no setting of expectations of future updates.</p>
<p>When customers are given content such as <em>&#8220;At 7:57 UTC the main East Coast server suffered an, as yet, undiagnosed problem, causing software connectivity issues.  Engineers are currently diagnosing the problem.  An update will be provided within 30 minutes&#8221;</em> they know what to expect; there&#8217;s a serious problem, it&#8217;s being looked at, and I&#8217;ll find out more in half-an-hour. Cool.</p>
<p>Tell your customers what&#8217;s going on, even if it&#8217;s your own fault.  Saying &#8220;we messed up, but we&#8217;re fixing it&#8221; is going to give you respect, and you&#8217;ll be surprised at how easily customers will forgive you if you&#8217;re open and honest, and taking responsibility.</p>
<h2>Learn From The Experience With A Five-Whys Analysis</h2>
<p>As part of our Agile process, we&#8217;re always looking at ways to improve what we do, whether that&#8217;s looking at our coding practice, our project management style, or even how we make sure faults don&#8217;t re-occur.  I guess that&#8217;s why we love test driven development because writing a failing test before fixing a bug should mean you&#8217;ll never have to worry about that bug showing its face in a later regression test.</p>
<p>One excellent method for gradually improving a process or methodology is something that we&#8217;ve learned from <a href="http://www.startuplessonslearned.com/2008/10/about-author.html" title="Eric Ries" target="_blank">Eric Ries</a> and IMVU (oddly enough, a competitor of Linden Lab), called <a href="http://www.startuplessonslearned.com/2008/11/five-whys.html" title="Five-Whys" target="_blank">Five-Whys</a> which originated in Toyota&#8217;s production system.</p>
<p>It involves asking the question why five times to drill down to the root cause of a problem.  The method then suggests you invest a small amount of time to address each of the five answers, effectively improving the process piece by piece without having to invest huge amounts of time, money or effort.  It&#8217;s a very effective method, and I strongly urge you to read all the details.</p>
<h2>Publish A Post-Mortem</h2>
<p>And finally the most important part when you&#8217;ve suffered a disaster is to let people know.  The guy on point would have recorded all the details in a timeline of events; you have your five-whys analysis and the actions you&#8217;re going to take to make sure this kind of disaster never happens again; so publish it.</p>
<p>If it&#8217;s an internal facing problem, then there&#8217;s obviously no need to publish outside of your own organisation, but it makes sense to distribute the post-mortem to at least those who had been effected by the disaster.  If it was a public facing problem where your customers (or a percentage of) suffered, then make it a public post-mortem.  Release it to the customer services department to distribute, put it on the upcoming maintenance/service status page (assuming you have one that works!), or publish it as a blog post.</p>
<p>Show people the results of the five-whys, even if it displays some of that human error &#8212; that&#8217;s ok, we&#8217;re all human, remember.  Show people the steps you&#8217;re going to take to make sure that this never happens again &#8212; your customers will appreciate it.</p>
<p>But one thing, don&#8217;t put it on your Facebook wall and then expect non-logged-in users to be able to view it.  Yes, MyDomain, I&#8217;m looking at your &#8220;you need to log into Facebook to see this page&#8221; post-mortem.  Ho hum.</p>
<div class="mb30"></div>
<p>So, there you have it.  What to do when disaster strikes at your scalable service.  Now let&#8217;s hope you never have to put this plan into action, eh &#8230;?</p>
]]></content:encoded>
			<wfw:commentRss>http://singinghorsestudio.com/scalability-what-to-do-when-disaster-strikes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
