<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>Codebrain Blog</title>
    <description>Dreaming In Code</description>
    <link>http://blog.codebrain.co.uk/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://blog.codebrain.co.uk/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Codebrain Blog</dc:creator>
    <dc:title>Codebrain Blog</dc:title>
    <geo:lat>51.483300</geo:lat>
    <geo:long>0.000000</geo:long>
    <item>
      <title>What Time Is It?</title>
      <description>&lt;p&gt;Time is an interesting concept, perhaps even something we take for granted in our universe! Leap years and daylight savings are just two human-imposed time counting quirks that crop up now and then, and can cause all manner of problems with poorly designed systems.&lt;/p&gt;

&lt;pre name="code" class="csharp"&gt;
var oldDate = Convert.ToDateTime(DateTime.Now.Day + "/" + DateTime.Now.Month + "/" + (DateTime.Now.Year - this.TimeAtAddress));
&lt;/pre&gt;

&lt;p&gt;The above code will work absolutely fine, until you hit a leap year, like today. The code is then at risk of failing if TimeAtAddress is not divisible by 4, in the process littering your error logs with random failures and likely impacting your business in some negative way.&lt;/p&gt;

&lt;div&gt;When dealing with DateTime objects &lt;u&gt;ALWAYS&lt;/u&gt; use the built in modifiers, for example .AddYears() and .AddMonths(). It'll save you the heartache of having to fix simple date bugs.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;When developing applications it's always worth considering how you handle your representation of time, and often it's worth introducing a time abstraction simply to buy you flexibility around testing.&lt;/p&gt;

&lt;p&gt;I've used classes such as the one below to push the calculation of the current date into an abstraction that allows you to override the calculation should you need to.&lt;/p&gt;

&lt;pre name="code" class="csharp"&gt;
public static class DateHelper
{
    public static Func&lt;DateTime&gt; DateTimeGenerator = () =&gt; DateTime.Now;

    public static DateTime Now()
    {
        return DateTimeGenerator();
    }
}
&lt;/pre&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;pre name="code" class="csharp"&gt;
var now = DateHelper.Now(); // will get the current date

DateHelper.DateTimeGenerator = () =&gt; DateTime.Now.AddDays(5);
var nowPlus5Days = DateHelper.Now(); // will be the current date time plus 5 days
&lt;/pre&gt;

&lt;p&gt;This becomes particularly useful in scenarios where you'd like to setup some test data for something that happened in the past, in order to validate something that occurs in the future. With some clever use of IDisposable it's possible to construct setups for tests such as:&lt;/p&gt;

&lt;pre name="code" class="csharp"&gt;
[Test]
public void A_test(){

	// we are at current time.
	
	using (var _ = DateTime.ShiftDays(-30))
	{
		// we are now 30 days ago.
	}
	
	// we are at current time.
}
&lt;/pre&gt;

&lt;p&gt;If you are feeling really fancy you could start nesting the using() statements and skip back and forth through time as you see fit.&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2012/02/29/What-Time-Is-It.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2012/02/29/What-Time-Is-It.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=37584d0a-482b-4dc6-9edd-3a14ce9df63a</guid>
      <pubDate>Wed, 29 Feb 2012 14:18:00 +0000</pubDate>
      <category>C Sharp</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=37584d0a-482b-4dc6-9edd-3a14ce9df63a</pingback:target>
      <slash:comments>58</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=37584d0a-482b-4dc6-9edd-3a14ce9df63a</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2012/02/29/What-Time-Is-It.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=37584d0a-482b-4dc6-9edd-3a14ce9df63a</wfw:commentRss>
    </item>
    <item>
      <title>C# Content Spinning Algorithm</title>
      <description>&lt;p&gt;There is a well known technique within black-hat SEO called content spinning. Content spinning involves writing an article using a specific syntax which allows a text processor to generate random variations. These variations can then be used for multiple purposes without fear of being labelled as duplicate content.&lt;/p&gt;

&lt;p&gt;I was searching for a C# algorithm which I could re-purpose into a nAnt script, but a few searches on the internet gave no results. I found a &lt;a href="http://www.halotis.com/2011/01/18/content-spinning-algorithm/" target="_blank"&gt;python version&lt;/a&gt; which seemed good enough, so I rewrote it for C#.&lt;/p&gt;

&lt;pre name="code" class="csharp"&gt;
public static class Spinner
{
    private readonly static Random Randomizer = new Random();

    public static string Spin(string content)
    {
        const char OPEN_BRACE = '{';
        const char CLOSE_BRACE = '}';
        const char DELIMITER = '|';

        var start = content.IndexOf(OPEN_BRACE);
        var end = content.IndexOf(CLOSE_BRACE);

        if (start == -1 &amp;&amp; end == -1 || start == -1 || end &lt; start)
        {
            return content;
        }

        if (end == -1)
        {
            throw new ArgumentException("Unbalanced brace.");
        }

        var substring = content.Substring(start + 1, content.Length - (start + 1));
        var rest = Spin(substring);
        end = rest.IndexOf(CLOSE_BRACE);

        if (end == -1)
        {
            throw new ArgumentException("Unbalanced brace.");
        }

        var splits = rest.Substring(0, end).Split(DELIMITER);
        var item = splits[Randomizer.Next(0, splits.Length)];
        return content.Substring(0, start) + item + Spin(rest.Substring(end + 1, rest.Length - (end + 1)));
    }
}
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Usage:&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Spinner.Spin("{Hi|Hello|Good morning}, my name is {Matt|Bob} and I {certainly |might |should |}have {something {important|special} to {say|eat|share}|a favorite {toy|book|poem|song}}.");&lt;/p&gt;
</description>
      <link>http://blog.codebrain.co.uk/post/2011/08/14/C-Content-Spinning-Algorithm.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2011/08/14/C-Content-Spinning-Algorithm.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=f7be7d18-7e6b-4a53-a946-aa7bb8d6860c</guid>
      <pubDate>Sun, 14 Aug 2011 13:00:00 +0000</pubDate>
      <category>.NET</category>
      <category>C Sharp</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=f7be7d18-7e6b-4a53-a946-aa7bb8d6860c</pingback:target>
      <slash:comments>41</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=f7be7d18-7e6b-4a53-a946-aa7bb8d6860c</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2011/08/14/C-Content-Spinning-Algorithm.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=f7be7d18-7e6b-4a53-a946-aa7bb8d6860c</wfw:commentRss>
    </item>
    <item>
      <title>New start up launched</title>
      <description>&lt;p&gt;So, this is the first update on this blog for quite a while and you are about to find out why it's been so quiet around here.&lt;/p&gt;

&lt;p&gt;I have been very busy working on a new start up with my business partner, Valere Speranza. If you have ever founded a start up you can appreciate just how much time they consume - all of it. It gives me great pleasure to announce Lead Magpie!&lt;/p&gt;

&lt;a href="http://www.leadmagpie.com" target="_blank"&gt;&lt;img src="http://blog.codebrain.co.uk/image.axd?picture=2011%2f1%2fleadmagpie.gif" alt="Lead Magpie : The marketplace for UK mortgage leads." /&gt;&lt;/a&gt;

&lt;p&gt;Check out the site at &lt;a href="http://www.leadmagpie.com" target="_blank"&gt;http://www.leadmagpie.com&lt;/a&gt; to learn more.&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2011/01/25/New-start-up-launched.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2011/01/25/New-start-up-launched.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=53921416-8b88-40d8-8f59-089062c5d183</guid>
      <pubDate>Tue, 25 Jan 2011 07:30:00 +0000</pubDate>
      <category>General</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=53921416-8b88-40d8-8f59-089062c5d183</pingback:target>
      <slash:comments>19</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=53921416-8b88-40d8-8f59-089062c5d183</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2011/01/25/New-start-up-launched.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=53921416-8b88-40d8-8f59-089062c5d183</wfw:commentRss>
    </item>
    <item>
      <title>CQRS</title>
      <description>&lt;p&gt;There seems to be a lot of noise around CQRS and DDDD these days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://cre8ivethought.com/blog/index" target="_new"&gt;Mark Nijhof&lt;/a&gt; has uploaded a &lt;a href="http://github.com/MarkNijhof/Fohjin" target="_new"&gt;DDDD sample using a CQRS approach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codebetter.com/blogs/gregyoung/" target="_new"&gt;Greg Young&lt;/a&gt; has put up a &lt;a href="http://github.com/gregoryyoung/m-r" target="_new"&gt;simplest possible CQRS implementation&lt;/a&gt; on GitHub.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ncqrs.org/" target="_new"&gt;NCQRS&lt;/a&gt; - a framework for enabling development of CQRS-based architectures is gaining some momentum. The &lt;a href="http://ncqrs.org/getting-started/screencast-building-a-website-with-ncqrs/" target="_new"&gt;getting started screencast&lt;/a&gt; was great.&lt;/li&gt;
&lt;/ul&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/09/04/CQRS.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/09/04/CQRS.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=90108025-7c31-4034-afc7-76a883d02bb9</guid>
      <pubDate>Sat, 04 Sep 2010 15:30:00 +0000</pubDate>
      <category>.NET</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=90108025-7c31-4034-afc7-76a883d02bb9</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=90108025-7c31-4034-afc7-76a883d02bb9</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/09/04/CQRS.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=90108025-7c31-4034-afc7-76a883d02bb9</wfw:commentRss>
    </item>
    <item>
      <title>Thycotic Alpha-End Competition Entry</title>
      <description>&lt;p&gt;Thycotic have put up a &lt;a href="http://thycoticsolutionsblog.wordpress.com/2010/08/12/code-challenge-win-a-gyroball/" target="_blank"&gt;Code Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Below is my heavily LINQ-oriented solution:&lt;/p&gt;

&lt;pre name="code" class="csharp"&gt;
public interface IConverter
{
    string Convert(int number);
    int Convert(string number);
    string ConvertUsing(IConverter convertor, string number);
}

public abstract class ConverterBase : IConverter
{
    protected abstract string Chars { get; }

    public string Convert(int number)
    {
        return this.Encode(number)
                   .Aggregate(string.Empty, (s, c) =&amp;gt; s + c);
    }

    public int Convert(string number)
    {
        return number.Reverse()
                     .Select((c, i) =&amp;gt; Chars.IndexOf(c) * (int)Math.Pow(this.Chars.Length, i))
                     .Sum();
    }

    public string ConvertUsing(IConverter convertor, string number)
    {
        return convertor.Convert(this.Convert(number));
    }

    private IEnumerable&amp;lt;char&amp;gt; Encode(int number)
    {
        var remainder = number % this.Chars.Length;
        if (number - remainder &amp;gt; 0)
        {
            foreach (var power in this.Encode((number - remainder) / this.Chars.Length))
            {
                yield return power;
            }
        }
        yield return this.Chars[remainder];
    }
}

public class Converter : ConverterBase
{
    protected override string Chars
    {
        get
        {
            return "0123456789xyz";
        }
    }
}

public class HexConverter : ConverterBase
{
    protected override string Chars
    {
        get
        {
            return "0123456789abcdef";
        }
    }
}

public class BinaryConverter : ConverterBase
{
    protected override string Chars
    {
        get
        {
            return "01";
        }
    }
}

public class OctalConverter : ConverterBase
{
    protected override string Chars
    {
        get
        {
            return "01234567";
        }
    }
}
&lt;/pre&gt;

&lt;p&gt;Note: The code doesn't handle negative inputs or exceptions.&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/08/14/Thycotic-Alpha-End-Competition-Entry.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/08/14/Thycotic-Alpha-End-Competition-Entry.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=17559f85-b39c-4979-902f-ef2f38d45ac8</guid>
      <pubDate>Sat, 14 Aug 2010 11:00:00 +0000</pubDate>
      <category>.NET</category>
      <category>C Sharp</category>
      <category>TDD</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=17559f85-b39c-4979-902f-ef2f38d45ac8</pingback:target>
      <slash:comments>19</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=17559f85-b39c-4979-902f-ef2f38d45ac8</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/08/14/Thycotic-Alpha-End-Competition-Entry.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=17559f85-b39c-4979-902f-ef2f38d45ac8</wfw:commentRss>
    </item>
    <item>
      <title>Death March</title>
      <description>&lt;style&gt;
.book {
margin-top:15px;
}
.book .image {
float:left;
height:100px;
margin-right:20px;
width:75px;
}
.book .image img {
border:1px solid #1C2A33;
height:100px;
width:75px;
}
.book .desc {
float:left;
margin-right:10px;
width:510px;
}
&lt;/style&gt;
&lt;div class="book"&gt;
&lt;div class="image"&gt;
&lt;img alt="Death March - Edward Yourdon" src="http://www.codebrain.co.uk/images/services/books/yourdon.gif"&gt;
&lt;/div&gt;
&lt;div class="desc"&gt;
&lt;a href="http://www.amazon.com/Death-March-2nd-Yourdon-Press/dp/013143635X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1238696525&amp;amp;sr=1-1" target="_blank"&gt;Death March - Edward Yourdon&lt;/a&gt;
&lt;ol style="padding:0 15px 0"&gt;
&lt;li&gt;Customer's requirements are captured in written form&lt;/li&gt;
&lt;li&gt;Requirements are transformed into further written documentation&lt;/li&gt;
&lt;li&gt;Timescales are predicted using guesswork and multiplication&lt;/li&gt;
&lt;li&gt;Invariably this process &lt;i&gt;always&lt;/i&gt; results in a bid for work&lt;/li&gt;
&lt;li&gt;Cost is calcuated as a function of timescales and resources&lt;/li&gt;
&lt;li&gt;The statement of work is drawn up to include as many get-out-of-jail-free loopholes as possible&lt;/li&gt;
&lt;li&gt;The schedule is unveiled, all hail the schedule&lt;/li&gt;
&lt;li&gt;Developer units are hired to work to the schedule&lt;/li&gt;
&lt;li&gt;Requirements and specifications are buried in word documents and spreadsheets&lt;/li&gt;
&lt;li&gt;Key knowledge held by people who are disconnected from development&lt;/li&gt;
&lt;li&gt;Distributed teams make communication difficult&lt;/li&gt;
&lt;li&gt;Development derives additional requirements during the solution process&lt;/li&gt;
&lt;li&gt;Customer changes requirements&lt;/li&gt;
&lt;li&gt;Cycles of rework begin&lt;/li&gt;
&lt;li&gt;Plan starts to slip&lt;/li&gt;
&lt;li&gt;Management become unhappy&lt;/li&gt;
&lt;li&gt;Pressure begins to mount and quality begins to suffer&lt;/li&gt;
&lt;li&gt;Developers suggest solutions, but these are stifled or trivialised&lt;/li&gt;
&lt;li&gt;Retrospectives are conducted behind closed doors&lt;/li&gt;
&lt;li&gt;A new schedule is drawn up, goto 7.&lt;/li&gt;
&lt;li&gt;Morale plummets&lt;/li&gt;
&lt;li&gt;Self-preservation begins to take over&lt;/li&gt;
&lt;li&gt;The development team starts to dissolve&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="clear:both"&gt;&lt;/div&gt;
&lt;p&gt;I wonder what the outcome will be?&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/06/15/Death-March.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/06/15/Death-March.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=c0d02fe7-efe2-4c3a-9403-d72d93b26c46</guid>
      <pubDate>Tue, 15 Jun 2010 18:00:00 +0000</pubDate>
      <category>Management</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=c0d02fe7-efe2-4c3a-9403-d72d93b26c46</pingback:target>
      <slash:comments>14</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=c0d02fe7-efe2-4c3a-9403-d72d93b26c46</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/06/15/Death-March.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=c0d02fe7-efe2-4c3a-9403-d72d93b26c46</wfw:commentRss>
    </item>
    <item>
      <title>Eric Evans DDD Presentation</title>
      <description>&lt;p&gt;Another fantastic presentation from Eric Evans which resonates strongly with me:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://domaindrivendesign.org/node/198" target="_blank"&gt;http://domaindrivendesign.org/node/198&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the presentation he talks about documenting the process he has been using over the last 6 years. You can download a copy of the draft write-up too.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://domainlanguage.com/processdraft/" target="_blank"&gt;http://domainlanguage.com/processdraft/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Is this the possible start of a new book?&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/06/12/Eric-Evans-DDD-Presentation.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/06/12/Eric-Evans-DDD-Presentation.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=63a43e63-7a11-4d94-9b45-e57f1e04c96f</guid>
      <pubDate>Sat, 12 Jun 2010 20:00:00 +0000</pubDate>
      <category>Agile</category>
      <category>DDD</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=63a43e63-7a11-4d94-9b45-e57f1e04c96f</pingback:target>
      <slash:comments>15</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=63a43e63-7a11-4d94-9b45-e57f1e04c96f</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/06/12/Eric-Evans-DDD-Presentation.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=63a43e63-7a11-4d94-9b45-e57f1e04c96f</wfw:commentRss>
    </item>
    <item>
      <title>The Others</title>
      <description>&lt;p&gt;During my 8 or so years contracting I've been fortunate enough to work with a variety of different companies, from the cautious and slow-moving banks through to dynamic and fast-paced digital agencies.&lt;/p&gt;

&lt;p&gt;Throughout my journey I've been lucky to meet and work with some truly brilliant people, great designers, developers and managers. I've also come across my fair share of 'others':&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The others aren't interested in learning.&lt;/li&gt;
&lt;li&gt;The others carry grandiose titles like 'Senior Software Architect' simply for being in the company for 10+ years.&lt;/li&gt;
&lt;li&gt;The others repeat the same mistakes over and over again.&lt;/li&gt;
&lt;li&gt;The others use seniority to quash innovation and perceived threats from the lower ranks.&lt;/li&gt;
&lt;li&gt;The others view new ideas and technologies with scepticism.&lt;/li&gt;
&lt;li&gt;The others view the 'hired help' with suspicion and contempt.&lt;/li&gt;
&lt;li&gt;The others treat their job as entitlement.&lt;/li&gt;
&lt;li&gt;The others clock-in and clock-out.&lt;/li&gt;
&lt;li&gt;The others play political games to compensate for poor performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm sure you know who the others are in your workplace.&lt;/p&gt;

&lt;p&gt;The message for this blog post is to encourage you to &lt;b&gt;be the best you can be&lt;/b&gt;; don't settle for being an 'other'.&lt;/p&gt;

&lt;div class="emp"&gt;
&lt;p&gt;Personal and professional development is the only true job security in this ever-changing world.&lt;/p&gt;
&lt;/div&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/05/25/The-Others.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/05/25/The-Others.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=deef4187-a55e-4dfd-9dbd-5c83684e2e70</guid>
      <pubDate>Tue, 25 May 2010 20:00:00 +0000</pubDate>
      <category>General</category>
      <category>Management</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=deef4187-a55e-4dfd-9dbd-5c83684e2e70</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=deef4187-a55e-4dfd-9dbd-5c83684e2e70</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/05/25/The-Others.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=deef4187-a55e-4dfd-9dbd-5c83684e2e70</wfw:commentRss>
    </item>
    <item>
      <title>Kanban Experiment</title>
      <description>&lt;h2&gt;Problem&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;What do you do when your development process is in pieces, hundreds of defects are being raised against your code, ad-hoc work requests are piling up, the developers are groaning 'if we only had the time to make these improvements life would be easier' whilst the fixed deadline is looming.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;If you find yourself in this situation the &lt;i&gt;simplest&lt;/i&gt; and &lt;i&gt;easiest&lt;/i&gt; thing to do is walk out the door.&lt;/p&gt;

&lt;p&gt;It may be that the project you are working on is so fundamentally broken that even the most talented development team in the world still has no chance of succeeding. Hundreds of decisions are made during the project inception stage and each one can affect the overall chances of success. By the time the developers arrive the problems have solidified, and given their nature (financial, contractual, resourcing, managerial) the developers are, for political reasons or otherwise, unable to tackle them. Another death march begins.&lt;/p&gt;

&lt;div class="emp"&gt;
&lt;p&gt;Adding developers to a project with fixed deadlines, fixed deliverables in a fixed price contract rarely produces &lt;i&gt;good&lt;/i&gt; software&lt;/i&gt; and in the worst case can leave the company responsible for delivery in ruins, perhaps even bankrupt.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;I've been contracting long enough to realise that &lt;b&gt;the majority of the problems I face as a software developer are not software development related, but both project management and business related&lt;/b&gt;. I'm not saying that all companies are like this, but that some companies are &lt;a href="http://my.safaribooksonline.com/9780321606433" target="_blank"&gt;more deadly than others&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Acceptance&lt;/h2&gt;

&lt;p&gt;If you find yourself on a challenged project and are courageous enough to go the extra mile you can try and introduce some order onto the chaos, patching up the major holes as best you can. A do-it-or-die attitude is required because you'll probably ruffle somebody's feathers in the process.&lt;/p&gt;

&lt;p&gt;Given the above situation, I decided go back first principles and implement a &lt;a href="http://www.infoq.com/articles/hiranabe-lean-agile-kanban" target="_blank"&gt;Kanban system&lt;/a&gt; with the help of my team, in the face of some serious project challenges.&lt;/p&gt;

&lt;h2&gt;Solution&lt;/h2&gt;

&lt;p&gt;First, you'll need a large wall space, some marker pens, coloured tape, sticky dots and post-its. If &lt;a href="http://patrickwilsonwelsh.com/?p=15" target="_blank"&gt;walls with whiteboards are in short supply&lt;/a&gt; then the back of some borrowed cupboards will suffice.&lt;/p&gt;

&lt;p&gt;We loaded the Kanban with our backlog, giving each type of work a different coloured post-it:&lt;/p&gt;

&lt;div class="empgrey"&gt;

&lt;p&gt;&lt;span style="background-color: #f69; padding: 5px;"&gt;Use Case&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A large chunk of work which needs to be broken down into smaller tasks. Many tasks go together to form a complete Use Case.&lt;/p&gt;

&lt;p&gt;&lt;span style="background-color: #f06; padding: 5px;"&gt;Task&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A task for a particular Use Case of sufficient size to be estimated and worked on by a developer(s).&lt;/p&gt;

&lt;p&gt;&lt;span style="background-color: #6f0; padding: 5px;"&gt;Improvement&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Improvements are internally generated within the development team. An example may be a largish refactoring opportunity, automated process or tools upgrade. The point here is that time spent on an improvement will increase the flow of other post-its across the board.&lt;/p&gt;

&lt;p&gt;&lt;span style="background-color: #fc0; padding: 5px;"&gt;Defect&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Raised by the test team on the current release of code. These defects are raised and entered through an external system, the post-its are placed on the Kanban to track the work in progress.&lt;/p&gt;

&lt;p&gt;&lt;span style="background-color: #66f; padding: 5px;"&gt;Ad-hoc&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Externally generated work, perhaps as a result of a customer demonstration.&lt;/p&gt;

&lt;p&gt;&lt;span style="background-color: #93c; padding: 5px;"&gt;Problem&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Can be placed on any other post-it to denote that there is an outstanding issue, complete with a description of the problem.&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;As well as colour coding each card contained the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Date the post-it arrived on the board.&lt;/li&gt;
&lt;li&gt;A description of the work item.&lt;/li&gt;
&lt;li&gt;Priority denoted with a coloured sticky dot, for defects this dot represented severity.&lt;/li&gt;
&lt;li&gt;Initials of the current owner.&lt;/li&gt;
&lt;li&gt;Time spent on the work item. We would dot all items that were in progress every half day.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Optional.&lt;/i&gt; Date the post-it needs to be completed by.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Optional.&lt;/i&gt; Identifier from the external system, e.g. Defect Id.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team were educated on the system in under half a day and by week 4 our Kanban had grown to incorporate another cupboard and many more modifications:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blog.codebrain.co.uk/image.axd?picture=2010%2f2%2fkanban-week4.jpg" alt="Kanban - Week 4" /&gt;&lt;/p&gt;

&lt;p&gt;We cleared the finished section of the board (far right) every week. The board above is telling us that we spent a lot of our time addressing &lt;a href="http://leanandkanban.wordpress.com/2009/05/24/failure-demand/" target="_blank"&gt;failure demand&lt;/a&gt; in the form of defects. The concern here is that the actual estimated and paid for work is represented by the pink post-its on the far left and they didn't move for over a month!&lt;/p&gt;

&lt;h2&gt;Retrospective&lt;/h2&gt;

&lt;h3&gt;The Good&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The teams focus was aligned to completing work.&lt;/li&gt;
&lt;li&gt;Encourages the team to recognise, record and make improvements.&lt;/li&gt;
&lt;li&gt;Anybody can write up a post-it and add to the backlog, I'd often say "don't tell me, tell the board".&lt;/li&gt;
&lt;li&gt;Single visualisation of the work backlog, work in progress and work completed.&lt;/li&gt;
&lt;li&gt;See different types of work at a glance.&lt;/li&gt;
&lt;li&gt;The team has autonomy over pulling new work, creating a sense of ownership which is lost when work is assigned.&lt;/li&gt;
&lt;li&gt;Managers can prioritise work in the backlog.&lt;/li&gt;
&lt;li&gt;Colourful and tactile, giving a sense of fun to the project.&lt;/li&gt;
&lt;li&gt;Flexible and adoptable. We altered the board as our understanding improved.&lt;/li&gt;
&lt;li&gt;Simple and cheap. The total cost of implementation was less than £30.&lt;/li&gt;
&lt;li&gt;Easy to gather metrics about how much work the team can get done.&lt;/li&gt;
&lt;li&gt;The simplicity of the solution promotes the idea that it is easy to change and customise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;The Bad&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Doesn't work with distributed development teams for obvious reasons.&lt;/li&gt;
&lt;li&gt;It's simplicity can be interpreted as amateurish which results in the idea being written off.&lt;/li&gt;
&lt;li&gt;Easy to forget to mark post-its with key information, particularly dates and owner information.&lt;/li&gt;
&lt;li&gt;Can be difficult to find a particular post-it, the problem somewhat compounded by using identifiers from external tools.&lt;/li&gt;
&lt;li&gt;No backup, although conversely it's less likely to crash and lose your data!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;The Impact&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The board showed us that there was more work that needed doing than was planned or imagined.&lt;/li&gt;
&lt;li&gt;The previous development approach had led to a lot of defects.&lt;/li&gt;
&lt;li&gt;Developers can self-organise and work honestly if they are given the chance.&lt;/li&gt;
&lt;li&gt;The role of management is to remove problems (purple post-its) and to optimise the system to improve the flow of work through it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Kanban board provided us with a greater level of insight into what was happening on our project. The visualisation of work enabled us to make better decisions about how to utilise our time. By recognising that we have a finite number of resources and a large amount of work, we can make team decisions about how best to proceed.&lt;/p&gt;

&lt;p&gt;In some ways the Kanban board affirmed what we already knew, that our project was seriously challenged, but it also gave us a framework to work within. Understanding and learning about your situation is simply the first step in escaping it, without walking through the door!&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/02/27/Kanban-Experiment.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/02/27/Kanban-Experiment.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=b80da3ff-76b4-4b50-8130-3b1767bce0d5</guid>
      <pubDate>Sat, 27 Feb 2010 16:00:00 +0000</pubDate>
      <category>Agile</category>
      <category>Management</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=b80da3ff-76b4-4b50-8130-3b1767bce0d5</pingback:target>
      <slash:comments>31</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=b80da3ff-76b4-4b50-8130-3b1767bce0d5</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/02/27/Kanban-Experiment.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=b80da3ff-76b4-4b50-8130-3b1767bce0d5</wfw:commentRss>
    </item>
    <item>
      <title>Google Android Built Using Waterfall?</title>
      <description>&lt;img src="http://blog.codebrain.co.uk/image.axd?picture=2010%2f2%2fscrum_acrimonious.jpg" alt="Scrum Teams are Acrimonious" /&gt;

&lt;p&gt;Contrary to what the predictive text suggests, the Scrum teams I have worked in have always been rather pleasant!&lt;/p&gt;</description>
      <link>http://blog.codebrain.co.uk/post/2010/02/17/Google-Android-Built-Using-The-Waterfall-Methodology.aspx</link>
      <author>stucam</author>
      <comments>http://blog.codebrain.co.uk/post/2010/02/17/Google-Android-Built-Using-The-Waterfall-Methodology.aspx#comment</comments>
      <guid>http://blog.codebrain.co.uk/post.aspx?id=41c1a044-0a7b-4827-952a-70d25c6e8468</guid>
      <pubDate>Wed, 17 Feb 2010 19:15:00 +0000</pubDate>
      <category>General</category>
      <dc:publisher>stucam</dc:publisher>
      <pingback:server>http://blog.codebrain.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://blog.codebrain.co.uk/post.aspx?id=41c1a044-0a7b-4827-952a-70d25c6e8468</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://blog.codebrain.co.uk/trackback.axd?id=41c1a044-0a7b-4827-952a-70d25c6e8468</trackback:ping>
      <wfw:comment>http://blog.codebrain.co.uk/post/2010/02/17/Google-Android-Built-Using-The-Waterfall-Methodology.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.codebrain.co.uk/syndication.axd?post=41c1a044-0a7b-4827-952a-70d25c6e8468</wfw:commentRss>
    </item>
  </channel>
</rss>