<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Joshua Lewis&#039;s Blog</title>
	<atom:link href="http://joshilewis.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://joshilewis.wordpress.com</link>
	<description>Half-baked, stream-of-consciousness musings on software development philosophy</description>
	<lastBuildDate>Wed, 25 Jan 2012 09:16:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='joshilewis.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Joshua Lewis&#039;s Blog</title>
		<link>http://joshilewis.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://joshilewis.wordpress.com/osd.xml" title="Joshua Lewis&#039;s Blog" />
	<atom:link rel='hub' href='http://joshilewis.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Creating a local Nuget cache/repository</title>
		<link>http://joshilewis.wordpress.com/2012/01/13/creating-a-local-nuget-cacherepository/</link>
		<comments>http://joshilewis.wordpress.com/2012/01/13/creating-a-local-nuget-cacherepository/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 08:11:06 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[nuget]]></category>
		<category><![CDATA[package management]]></category>
		<category><![CDATA[package manager]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=102</guid>
		<description><![CDATA[Nuget took a long time coming. Maven has already been around for years, and the .Net space needed a package management solution. Now that it is here, I use it extensively. I find the VS integration quite polished and enjoyable to use. There are however several friction points I dislike. The most major of these [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=102&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nuget took a long time coming. Maven has already been around for years, and the .Net space needed a package management solution. Now that it is here, I use it extensively. I find the VS integration quite polished and enjoyable to use. There are however several friction points I dislike. The most major of these is that there is no local cache or repository of packages created for you. I.e. when you download a package, it gets added to the particular solution only. When you remove the package from a project, the package gets deleted from your hard disk. The current workflow (with the VS plugin) requires you to re-download a package every time you add it in a new solution. This is a bit silly considering you may use the same package in many different projects and  solutions at the same time.</p>
<p><strong>Update:</strong> in the comments below, Riaan reminded me of other reasons I wanted to have a local repository. Firstly, the package manager&#8217;s connection model is terrible. For slow or occasional connections (like mobile connections), it just isn&#8217;t feasible to download the same package multiple times for different projects/solutions. Secondly, the package manager dialog is modal, so you can&#8217;t use Visual Studio at all while you&#8217;re downloading packages (a real pain with a slow connection). [end update]</p>
<p>What I require, (and which Maven does by default), is to download the packages to an isolated repository on my own machine, and then install packages into projects/solutions from the local repository . It turns out this is pretty easy to achieve. All you need is a one or two Powershell commands, and some minor fiddling with the VS package manager.</p>
<p>First off, create a new folder on your drive for your repository. I put mine in D:\Work\Nuget, but it doesn&#8217;t matter where it is.  You&#8217;ll need the Nuget.exe, either from Nuget 1.6 or from the <a href="http://nuget.org/packages/nuget.commandline">Nuget Command Line package</a>, and to make it easy the path to the executable should be on your path. When you want to download a Nuget package, fire up a new Powershell shell, navigate to your repository folder and issue the command:<a href="http://joshilewis.files.wordpress.com/2012/01/ps-screenshot.png"><img src="http://joshilewis.files.wordpress.com/2012/01/ps-screenshot.png?w=300&#038;h=162" alt="Powershell screenshot" title="PS screenshot" width="300" height="162" class="alignright size-medium wp-image-104" /></a></p>
<blockquote><p>nuget install &lt;package name&gt;</p></blockquote>
<p>for example:</p>
<blockquote><p>nuget install MassTransit</p></blockquote>
<p>Nuget will then download the package and its dependencies. There will be a folder per package.</p>
<p>The next step is to set up the VS package manager so it knows where to look. In VS, go to Tools -&gt; Library Packet Manager -&gt; Packet Manager Settings</p>
<p><a href="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-navigating-to-settings.png"><img class="aligncenter size-medium wp-image-105" title="VS screenshot - navigating to settings" src="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-navigating-to-settings.png?w=300&#038;h=180" alt="" width="300" height="180" /></a></p>
<p>Navigate to Package Manager -&gt; Package Sources. Fill in the two boxes with the details of your repository. I&#8217;ve named mine Local, and it can be found at D:\Work\Nuget.</p>
<p><a href="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-package-source-details.png"><img class="aligncenter size-medium wp-image-106" title="VS screenshot - package source details" src="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-package-source-details.png?w=300&#038;h=174" alt="" width="300" height="174" /></a></p>
<p>Then click Add. You should now be able to install packages into projects from your local repository. To check, open the Library Package Manager in VS. The Online section on the left hand should now contain both &#8216;Nuget official package source&#8217; and &#8216;Local&#8217;. Click on Local and you&#8217;ll see the list of locally installed packages.</p>
<p><a href="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-packet-manager.png"><img class="aligncenter size-medium wp-image-107" title="VS screenshot - packet manager" src="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-packet-manager.png?w=300&#038;h=200" alt="" width="300" height="200" /></a></p>
<p>You now need download each package only once, and can install to any project.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/102/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=102&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2012/01/13/creating-a-local-nuget-cacherepository/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>

		<media:content url="http://joshilewis.files.wordpress.com/2012/01/ps-screenshot.png?w=300" medium="image">
			<media:title type="html">PS screenshot</media:title>
		</media:content>

		<media:content url="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-navigating-to-settings.png?w=300" medium="image">
			<media:title type="html">VS screenshot - navigating to settings</media:title>
		</media:content>

		<media:content url="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-package-source-details.png?w=300" medium="image">
			<media:title type="html">VS screenshot - package source details</media:title>
		</media:content>

		<media:content url="http://joshilewis.files.wordpress.com/2012/01/vs-screenshot-packet-manager.png?w=300" medium="image">
			<media:title type="html">VS screenshot - packet manager</media:title>
		</media:content>
	</item>
		<item>
		<title>Magic logging with interception (StructureMap, log4net and DynamicProxy)</title>
		<link>http://joshilewis.wordpress.com/2012/01/12/magic-logging-with-interception-structuremap-log4net-and-dynamicproxy/</link>
		<comments>http://joshilewis.wordpress.com/2012/01/12/magic-logging-with-interception-structuremap-log4net-and-dynamicproxy/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 15:49:34 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[automatic logging]]></category>
		<category><![CDATA[log4net StructureMap Castle DynamicProxy Interceptor logging]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=89</guid>
		<description><![CDATA[A technical post for a change! For a while I&#8217;ve been intrigued at the possibilities that things like DI and AOP provide. I finally managed to implement one of my nebulous ideas: that of automatic logging. I achieved this with a simple StructureMap interceptor, and a Castle.DynamixProxy Interceptor. My solution is cobbled together from various [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=89&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A technical post for a change! For a while I&#8217;ve been intrigued at the possibilities that things like DI and AOP provide. I finally managed to implement one of my nebulous ideas: that of automatic logging. I achieved this with a simple StructureMap interceptor, and a Castle.DynamixProxy Interceptor. My solution is cobbled together from various pieces, most notable <a href="http://ayende.com/blog/3474/logging-the-aop-way">Ayende&#8217;s post</a>, and this <a href="http://groups.google.com/group/structuremap-users/browse_thread/thread/fbadf4c2779ab8ed/cc8a010fc00d743e?#cc8a010fc00d743e">StructureMap Google Group conversation</a>.</p>
<p>Herewith the code:</p>
<p><pre class="brush: csharp;">
public class LogTypeInterceptor : StructureMap.Interceptors.TypeInterceptor
{
private readonly ProxyGenerator proxyGenerator = new ProxyGenerator();

public bool MatchesType(Type type)
{
if (type.IsSealed)
return false;

if (!type.Namespace.Contains(&quot;&lt;root-namespace&gt;&quot;))
return false;

if (type.Namespace.Contains(&quot;Infrastructure&quot;))
return false;

return true;
}

public object Process(object target, IContext context)
{
return proxyGenerator.CreateInterfaceProxyWithTargetInterface(
target.GetType().GetInterfaces().First(),
target.GetType().GetInterfaces(),
target, new LogInterceptor());
}
}
</pre></p>
<p>The LogInterceptor class referenced above is lifted verbatim from <a href="http://ayende.com/blog/3474/logging-the-aop-way">Ayende&#8217;s post</a> (his class is named LoggingInterceptor).</p>
<p>The last piece of the puzzle is to register the Interceptor with StructureMap:</p>
<p><pre class="brush: csharp;">

RegisterInterceptor(new LogTypeInterceptor());

</pre></p>
<p>Now, all types registered with the container will be &#8216;wrapped&#8217; with the LogInterceptor (by being proxied). A log statement will be emitted each time any interface or virtual method is called on any registered type.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/89/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=89&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2012/01/12/magic-logging-with-interception-structuremap-log4net-and-dynamicproxy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>A truth: The goal of a software development team</title>
		<link>http://joshilewis.wordpress.com/2011/10/17/a-truth-the-goal-of-a-software-development-team/</link>
		<comments>http://joshilewis.wordpress.com/2011/10/17/a-truth-the-goal-of-a-software-development-team/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:12:22 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[JCSE]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[truths]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=82</guid>
		<description><![CDATA[I am doing a presentation on The Kanban Method for Software Development for the Jo&#8217;burg Centre for Software Engineering&#8217;s (JCSE) Agile Forum in the coming month. In preparation, I&#8217;m blogging on some of the ideas I&#8217;ll be presenting. I&#8217;ll start off with some concepts I like to think of as truths of software development. The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=82&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I am doing a presentation on <a href="http://jcse.org.za/events/agile-forum-the-kanban-method-for-software-development" target="_blank">The Kanban Method for Software Development</a> for the<a href="http://jcse.org.za/" target="_blank"> Jo&#8217;burg Centre for Software Engineering&#8217;s (JCSE)</a> Agile Forum in the coming month. In preparation, I&#8217;m blogging on some of the ideas I&#8217;ll be presenting. I&#8217;ll start off with some concepts I like to think of as truths of software development. The first truth is concerned with the answer to the question &#8216;what is the goal of a software development team?&#8217;</p>
<p>One of the first questions I ask colleagues and clients when talking about improving a software development organisation is &#8216;what is the goal of a software development team?&#8217; It may be obvious that my thinking around this question is heavily influenced by Goldratt&#8217;s <a href="http://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884270610" target="_blank">The Goal</a> and <a href="http://en.wikipedia.org/wiki/Theory_of_Constraints" target="_blank">Theory of Constraints</a>. For me, this is the most important question (and answer) one can ask when trying to improve, for various reasons. The first being that unless one knows what one&#8217;s goals are, one is lost, there is no direction and no way to measure progress. The second, is that in software development specifically, I believe the goal is so misunderstood that people implement silly and needless processes which actually prevent them from achieving what they should be. Think about how you would answer it before continuing.</p>
<p>The goal of a software development team is to <strong>deliver</strong> software. Not to develop, test or specify software, but to deliver it. Of course we need to add some qualifiers, such as &#8216;at the right time, of the appropriate quality&#8217; etc. The fundamental reason for this is that one can&#8217;t generate revenue or a return on investment except through working software. Another reason is that without some form of working software, it can be exceedingly difficult to refine a customer&#8217;s vision for a product, or get customer feedback about the product. The easiest analogy in this case is ordering a pizza. There is no value delivered by the pizza maker until the pizza is delivered to the customer.</p>
<p>This concept of the goal being delivery of software resonates with the statement in the <a href="http://agilemanifesto.org/" target="_blank">Agile Manifesto</a> that we value working software over comprehensive documentation.  I would go so far as to say that without working software, any other artefacts are without value. How many people have made money selling functional specifications, technical documentation or test plans?</p>
<p>The most important thing for our customers is a solution to their problems, and for teams involved in software development, this takes the form of working software. The quicker this software can be delivered, the better, from the customer&#8217;s point of view.  Thus any framework for software development must optimise for delivery: the quicker we can get this stuff out the door, the better.</p>
<p>I harp on this point, because I believe introduce many sub-optimisations, and introduce many obstacles to delivering working software because they misunderstand this. I won&#8217;t go into too much detail here, but things like siloed management, big upfront processes, and certain types of non-instant-availability constraints all detract from delivering software, and all are introduced with the best of intentions.</p>
<p>Do you agree? Do you have other (primary) goals for your software development team?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=82&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2011/10/17/a-truth-the-goal-of-a-software-development-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>Interview Techniques &#8211; Technical Questions</title>
		<link>http://joshilewis.wordpress.com/2010/03/03/interview-techniques-technical-questions/</link>
		<comments>http://joshilewis.wordpress.com/2010/03/03/interview-techniques-technical-questions/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 12:46:46 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[Interview Techniques]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[interview]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=75</guid>
		<description><![CDATA[One of my interests is the &#8216;art&#8217; of coming up with questions and problems to use when interviewing software developers. It should be evident that the questions you ask in an interview will be based on what you think are important characteristics and traits for good developers to have. Therefore, trying to come up with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=75&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of my interests is the &#8216;art&#8217; of coming up with questions and problems to use when interviewing software developers. It should be evident that the questions you ask in an interview will be based on what you think are important characteristics and traits for good developers to have. Therefore, trying to come up with good interview questions is effectively asking &#8216;what do I think is important for a developer to do/have/be?&#8217; Once we know what we expect from a good developer, we can progress in certain ways, like improving university courses etc.</p>
<p>I plan to have a series of interview techniques posts, of which this is the first. This post focusses on purely technical questions to ask a developer in an interview.</p>
<p>By &#8216;technical knowledge and understanding&#8217;, I mean things like OO theory, relational theory, use of UML etc, and not things like which C# namespace to use in a particular case. I consider such knowledge to be necessary but not sufficient for a good developer. A developer cannot write code without understanding these concepts, and conversely somone who understands these concepts is not necessarily a good developer. I feel that these technical questions should be the first questions asked in an interview, but certainly not the only questions. They are just the beginning.</p>
<p>I also want to make clear that often candidates are given automated tests that test things like whether the candidate knows which namespace to use for a task. I don&#8217;t consider these tests useful, because a. this knowledge can be easily looked up in a just-in-time manner, and b. just because you understand how engines and gearboxes work doesn&#8217;t mean you can drive a car.</p>
<p>I have built up this list over a number of months, while interviewing candidates, and discussing with colleagues what kind of knowledge we&#8217;d like fellow developers to have. The list is graded, so that certain questions follow on from earlier questions, and shouldn&#8217;t be asked if the candidate does not give a satisfactory answer to the earlier question &#8211; if the candidate doesn&#8217;t know what generics are, there&#8217;s no point asking about the difference between IEnumerable&lt;&gt; and ICollection&lt;&gt;.</p>
<p>So, forthwith, my list is below. Please comment if you have any suggestions.</p>
<p>Interview Questions</p>
<ul>
<li>OO Programming
<ul>
<li>Describe object oriented programming.</li>
<li>Contrast it to another paradigm (aspect-oriented, functional etc)</li>
<li>Explanations of:
<ul>
<li>Encapsulation</li>
<li> Inheritance</li>
<li> Polymorphism</li>
</ul>
</li>
</ul>
<ul>
<li> Design patterns
<ul>
<li>Singleton</li>
<li>Observer</li>
<li>Visitor</li>
</ul>
</li>
</ul>
</li>
<li>.Net:
<ul>
<li> Value and reference types</li>
<li>Classes and Structs</li>
<li> Casting and boxing</li>
<li> Access modifiers (public, protected etc)</li>
<li> Abstract, virtual</li>
<li> Interfaces</li>
<li> Difference between an interface and abstract class</li>
<li> Generics
<ul>
<li> IEnumerable&lt;&gt; vs ICollection&lt;&gt; vs IList&lt;&gt;</li>
</ul>
</li>
<li> Nullable types</li>
<li> Delegates
<ul>
<li> Anonymous delegates</li>
</ul>
</li>
<li> WCF</li>
</ul>
</li>
<li>Web services
<ul>
<li> Inter-operability</li>
<li> Discovery</li>
<li> WSDL, SOAP</li>
</ul>
</li>
<li>Databases
<ul>
<li> Relational Theory
<ul>
<li> Design</li>
<li> Normalisation</li>
</ul>
</li>
<li> Object-relation impedance mismatch and O/RM</li>
<li> If used ADO.Net, ask about how to translate between DataSet etc to objects and vice versa</li>
</ul>
</li>
<li>MVC
<ul>
<li>Describe MVC</li>
<li>Compare with other architecture (Winforms, MVP etc)</li>
</ul>
</li>
<li>UML</li>
<li>Version Control
<ul>
<li>Why use version control</li>
<li>Which systems used</li>
<li>Different locking models</li>
<li>Branching &amp; merging</li>
</ul>
</li>
<li>Unit testing
<ul>
<li> What is unit testing</li>
<li>Unit test systems used before</li>
<li>Unit and integration testing</li>
<li> TDD
<ul>
<li>BDD</li>
<li>Mocking</li>
<li>Difference between stubs and mocks</li>
</ul>
</li>
</ul>
</li>
<li>SDLC
<ul>
<li> Waterfall</li>
<li> Agile</li>
<li> Lean</li>
</ul>
</li>
<li>Card shuffling algorithm design
<ul>
<li> Object orientation</li>
</ul>
</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/75/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/75/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/75/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=75&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2010/03/03/interview-techniques-technical-questions/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>Branch-per-version Workflow in TFS</title>
		<link>http://joshilewis.wordpress.com/2010/02/03/branch-per-version-workflow-in-tfs/</link>
		<comments>http://joshilewis.wordpress.com/2010/02/03/branch-per-version-workflow-in-tfs/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 06:41:59 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[tfs]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=63</guid>
		<description><![CDATA[This is cross-posted from here. Hi, I am having trouble with the workflows involved in a branch-per-version (release) scenario. I have a Subversion background, so my understanding of how TFS works may be &#8216;biased&#8217; towards Subversion. Our policy involves branching-per-version and branching-per-feature. Typically, changes will be developed in a feature branch (whether new features, bugs [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=63&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is cross-posted from <a href="http://tfsbranchingguideii.codeplex.com/Thread/View.aspx?ThreadId=82971">here</a>.</p>
<div id="ctl00_ctl00_MasterContent_Content_PostRepeater_ctl00_BodyDiv">
<p>Hi, I am having trouble with the workflows involved in a branch-per-version (release) scenario. I have a Subversion background, so my understanding of how TFS works may be &#8216;biased&#8217; towards Subversion.</p>
<p>Our policy involves branching-per-version and branching-per-feature. Typically, changes will be developed in a feature branch (whether new features, bugs etc). Once complete, these feature branches will be merged into trunk (mainline) and the branch deleted. For a deployment, the changes made in each branch will be merged onto the last deployed version. This &#8216;patched&#8217; version will then be branched as the new version. This requires that the new version branch be created from the workspace, and not from a latest version in the repository. When we try perform a branch from the workspace version, the opposite of what we expect occurs.</p>
<p>Let&#8217;s assume that I have a release branch version-1.0.0. A production bug is reported, and the bug is fixed in mainline as changeset 25. I now want to apply changeset to version 1.0.0 to create version 1.0.1. So I open my workspace copy of the version-1.0.0 branch and perform a merge of mainline changeset 25 onto the branch. Now, the change is correctly applied to my workspace copy, and the relvant files have been changed and are checked out. Then, in the source control explorer, I branch the version-1.0.0 branch to a new branch caleld version-1.0.1, and I choose to branch it from the workspace. When I check this change in, what happens is that changeset 25 is applied to the version-1.0.0 branch, and NOT to the version-1.0.1 branch as expected. That is, version-1.0.1 looks like version-1.0.0 before the change, and version-1.0.0 contains the change.</p>
<p>The same happens if I create a label from the merged workspace copy.</p>
<p>Effectively what we&#8217;re trying to achieve is simulate a &#8216;tag&#8217; in Subversion (which are just branches anyway with some extra semantics).</p>
<p>I&#8217;d like some guidance on how to apply &#8216;hotfixes&#8217; to a version branch to create a new version branch, and not change the &#8216;original&#8217; or baseline version.</p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/63/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=63&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2010/02/03/branch-per-version-workflow-in-tfs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>TFS and SVN Documentation</title>
		<link>http://joshilewis.wordpress.com/2009/12/04/tfs-and-svn-documentation/</link>
		<comments>http://joshilewis.wordpress.com/2009/12/04/tfs-and-svn-documentation/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 12:23:22 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=48</guid>
		<description><![CDATA[Full disclosure: I have been working with Subversion for a number of years. I&#8217;d consider myself a Subversion evangelist. I often have an aversion to how Microsoft approach things. I&#8217;ve recently been looking in to Team Foundation Version Control, since we&#8217;re adopting it in my organisation. Some other teams in the organisation are already using [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=48&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Full disclosure: I have been working with Subversion for a number of years. I&#8217;d consider myself a Subversion evangelist. I often have an aversion to how Microsoft approach things.</p>
<p>I&#8217;ve recently been looking in to Team Foundation Version Control, since we&#8217;re adopting it in my organisation. Some other teams in the organisation are already using it, but the team I am in is not.  In the past, at previous positions, I have been responsible for synthesizing usage policies and best practices for lots of tools, including Subversion. I have also trained other team members (and sometimes superiors) in tool usage. This included things like forcing commit messages, to understanding branching and merging. My current role includes these responsibilities (including a lot more process-oriented guidance).</p>
<p>I am astounded at the lack of usage documentation there is for TFVC available on the Internet (i.e. not in books, since I haven&#8217;t had the chance to read any). The <a href="http://svnbook.red-bean.com/">Subversion book</a> must rank as one of the best pieces of documentation for an open source product around. It really does contain a wealth of well-written information on not only how to administer Subversion (I&#8217;ve seen plenty of guides on installing TFS), but how to <em>use</em> it &#8211; especially the &#8216;Daily usage guide&#8217;.  Things like how to set up working copies, committing, updating, resolving conflicts, branching and merging. The corresp0nding MSDN documentation is very very thin in this regard.</p>
<p>Has anyone else had this issue?</p>
<p>Can you recommend some resources for me?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=48&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2009/12/04/tfs-and-svn-documentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>Pull promotes quality</title>
		<link>http://joshilewis.wordpress.com/2009/11/22/pull-promotes-quality/</link>
		<comments>http://joshilewis.wordpress.com/2009/11/22/pull-promotes-quality/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:09:15 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[pull]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=44</guid>
		<description><![CDATA[In this post I contend that pull systems enable and promote working at a higher level of quality than is allowed by working according to a push system. In traditional software development scenarios, project plans and timelines are imposed on development work. In addition, work is pre-assigned to specific developers. It is fact that any [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=44&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In this post I contend that pull systems enable and promote working at a higher level of quality than is allowed by working according to a push system.</p>
<p>In traditional software development scenarios, project plans and timelines are imposed on development work. In addition, work is pre-assigned to specific developers. It is fact that any type of worker can only do so much work per hour, and there are so many hours in a day. When timelines (and a set number of human resources) are imposed on a creative, innovative process like software development, either the quality of the work decreases, or the amount of work decreases (if quality is kept constant).</p>
<p>If you give Michaelangelo 10 days to paint the Sistine Chapel, he will either paint only a corner of the ceiling to the desired quality (which is why you hired him in the first place), or he will paint the entire ceiling but it will look like rubbish.</p>
<p>This is a push system. The deadline is pushed onto the work. Work items are pushed onto specific developers.</p>
<p>However, if you don&#8217;t impose a deadline, and you don&#8217;t pre-allocate tasks to developers, the developer has the time available to him to &#8216;do a proper job&#8217;, i.e. complete the task to the level of quality required by the system. He is not under pressure to cut corners in either scope or quality. He is also not inclined to optimise to the incentive.</p>
<p>The challenge of these systems then becomes managing the uncertainties around such a project, like &#8216;when will it be complete&#8217;, &#8216;how much will it cost etc&#8217;. But in general, the quality of the finished product should be higher.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=44&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2009/11/22/pull-promotes-quality/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>TDD is a pull system</title>
		<link>http://joshilewis.wordpress.com/2009/11/22/tdd-is-a-pull-system/</link>
		<comments>http://joshilewis.wordpress.com/2009/11/22/tdd-is-a-pull-system/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 12:43:17 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[pull]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=39</guid>
		<description><![CDATA[In my previous post, I described how pull systems work. I made the statement that work is only done in a stage in a pipeline when there is a request from the downstream stage. I.e. I only develop some code when QA has asked me for some artifacts to test. I also made the statement [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=39&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In my previous post, I described how pull systems work. I made the statement that work is only done in a stage in a pipeline when there is a request from the downstream stage. I.e. I only develop some code when QA has asked me for some artifacts to test. I also made the statement that if there is a request from a downstream stage, and no work needs to be done to fulfil that request, then the &#8216;conversation&#8217; should &#8216;return&#8217; immediately.</p>
<p>I contend that test-driven development (TDD) is a pull system. I make a request, and I then fulfill that request. I write a test as a specification of what I want to achieve, and I then write code to fulfill that request.</p>
<p>According to TDD best practice, I write code only when I have a failing test. This is indicative of a pull system. I write the code only when I need to. This need is represented by a failing test.</p>
<p>TDD ensures that you don&#8217;t waste time writing unneeded code. All code written must be justified by the &#8216;failing test&#8217; rule. Otherwise it is considered superfluous, and does not contribute to satisfying the request from the downstream process.</p>
<p>If you write more code after all your tests have passed, you are not adding value and you are being wasteful.</p>
<p>Think of TDD according to this example: instead of producing an engine and then trying to fit it into a car (a set of requirements), rather start off with the car, and have the test &#8216;does my car go?&#8217; You only need an engine to make a car go. If the car goes without an engine (highly unlikely), you don&#8217;t need the engine. Production of the engine can be justified (ie represent value) only when there is an explicit need for an engine. Code is only needed when you have a failing test.</p>
<p>You may refine your test to include economy and performance requirements etc: &#8220;My car needs a certain maximum speed. To achieve that, I need an engine which produces 100kW. Does my engine produce 100kW?&#8221; If your car needs an engine that produces a maximum of 100kW, it is wasteful to design an engine that produces 120kW. When designing the engine, you have explicit requirements  you need to satisfy. Producing more than what is required is wasteful, and is not &#8216;pull&#8217;. If your tests aren&#8217;t failing, don&#8217;t write more code.</p>
<p>Similarly, if you are designing a new car that needs an engine that produces 100kW and  you already have one sitting on the shelf, don&#8217;t design another one &#8211; if you add a test which passes without any new code, don&#8217;t write more code.</p>
<p>TDD simply provides a philosophy for specifying your requirements, and a mechanism for evaluating whether you have satisfied those requirements (i.e. does my engine satisfy all my requirements?). It provides a means for simulating requests that the code&#8217;s production clients will expect to be satisfied (e.g. drive-train and throttle interfaces). TDD makes those requirements explicit and measurable.</p>
<p>To conclude, TDD is a pull system. When practicing TDD correctly, code is only written when there is a failing test, signifying an explicit need for some work to take place. There should be direct traceability from each line of code to a TDD test, from each TDD test to a user story/MMF/BDD test etc, and so on up the line. The value stream then becomes explicit. Any code which can&#8217;t be traced back to a test (requirement) can then be considered waste and should be eliminated. (Obviously there will be some infrastructure code etc).</p>
<p>Some more notes on TDD as a pull system:</p>
<p>- A failing test is usually signified by &#8216;red&#8217;. This red serves as a visual trigger for action: we need to write some code. &#8216;Red&#8217; is therefore a Kanban.</p>
<p>- The ideas discussed here don&#8217;t address the problem of how to arrive at TDD tests. In the car example, the tests are put forth as natural langauge: &#8220;Does my car go&#8221;?, &#8220;Does my engine make at least 100kW?&#8221; In reality, it is often difficult to translate user requirements into low-level unit tests required for TDD. Techniques like Doman Driven Design (DDD)&#8217;s ubiquitous language and Behaviour-Driven Design (BDD) can help towards this.</p>
<p>If we&#8217;re talking about engines, unless we can agree what &#8217;100kW&#8217; means and how we measure it, we can never be sure that we&#8217;re actually satisfying our requirements, and we will fail only when we try put the engine in the car and drive away. At this point, it becomes very costly to try change the engine or the car.</p>
<p>- We are lucky that we can use these self-same tests for automated regression testing.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=39&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2009/11/22/tdd-is-a-pull-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>Kanban Board and Pull</title>
		<link>http://joshilewis.wordpress.com/2009/11/22/kanban-board-and-pull/</link>
		<comments>http://joshilewis.wordpress.com/2009/11/22/kanban-board-and-pull/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 12:09:48 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[pull]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=36</guid>
		<description><![CDATA[These are my thoughts on Lean systems from a pull perspective, and how Kanban Boards can be used to facilitate a pull instead of a push system in software development. I don&#8217;t go into the pros and cons of pull systems in software development. Imaging you want to order a  new from Toyota. In a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=36&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>These are my thoughts on Lean systems from a pull perspective, and how Kanban Boards can be used to facilitate a pull instead of a push system in software development. I don&#8217;t go into the pros and cons of pull systems in software development.</p>
<p>Imaging you want to order a  new from Toyota. In a push system, Toyota would try anticipate customer demand, and would produce a certain number of cars per period. These cars would then sit in a lot somewhere until they&#8217;re sold. This is wasteful. In the ideal, what should happen is that your order gets passed down the line, through successive levels in the business until the order is fulfilled. It should look something like this: The sales person passes on the order to the manufacturing plant;  the order is directed to the appropriate manufacturing line (car model) etc etc until it gets to the person making the wheels, doors etc for the car (including the suppliers).</p>
<p>This can be illustrated by the following conversations:</p>
<blockquote><p>Me: &#8220;Salesperson, I want a 1.6 liter Corolla!&#8221;<br />
Saleperson: &#8220;Factory, we need a new Corolla for this customer!&#8221;<br />
Factory foreman: &#8220;Corolla line, we need a car with these specs for this customer!&#8221;<br />
Corolla Line Manager: &#8220;Engine supplier, we need a new 1.6 liter engine for this car!&#8221;<br />
&#8230;<br />
Engine Supplier: &#8220;Corolla Line Manager, here&#8217;s that engine you asked for!&#8221;<br />
Corolla Line Manager: &#8220;Factory foreman, here&#8217;s that car  you asked for!&#8221;<br />
Factory Foreman: &#8220;Salesperson, here&#8217;s that Corolla you asked for!&#8221;<br />
Salesperson: &#8220;Customer, here&#8217;s your car!&#8221;</p></blockquote>
<p>Each lower level in the process is only asked for something when there is a need. It is obvious that the conversation at a specific level cannot be &#8216;returned&#8217; until it is satisfied. That is, a car cannot be produced without an engine. Note also the symmetrical nature of this series of  conversations, it starts and ends with the customer.</p>
<p>What does not happen is that there is a pile of engines, gearboxes, doors etc waiting around to be used when an order comes through. (Obviously there may be lead times associated with each part, but this can be handled with Kanban and order points). The process to create each item is triggered or initiated only when there is a firm requirement for that part to be made. Parts are created just-in-time (JIT), only created when they are needed (and delivered to where they are needed).</p>
<p>The same process should be followed in software development. The conversation might be something like this:</p>
<blockquote><p>Business (our customer): &#8220;Deployment team, give me this feature I want!&#8221;<br />
Deployment team: &#8220;Quality assurance team, give me this feature to deploy!&#8221;<br />
QA team: &#8220;Development, give me this feature to test!&#8221;<br />
Development: &#8220;Business analysts, specify this feature for me to develop!&#8221;<br />
BAs: &#8220;Business, explain this feature to me so I can specify it!&#8221;<br />
Business thinks about it then, Business: &#8220;BAs, it needs to do this and this and  that!&#8221;<br />
BAs specify it then, BAs: &#8220;Development, here is your specification to develop off of!&#8221;<br />
Development develops the feature then: &#8220;QA, here is the feature to test!&#8221;<br />
QA test then, QA: &#8220;Deployment team, here is the artifact to deploy!&#8221;<br />
Deployment deployes then, Deployment: &#8220;Business, here is your feature in the live system!&#8221;</p></blockquote>
<p>Each team in the process only does work if there is a request from the downstream team. The downstream team is notified when the work item is ready for their attention. If there is no request from the downstream team, no work happens. If there is a request from a downstream team, and no work needs to be done to fulfil this request, then it is simply moved downstream, and started on its return conversation journey. (If this case seems cryptic, I will explain it more in a later post.)</p>
<p>The term &#8216;Kanban&#8217; has become invested with the meaning of a &#8216;visual trigger for action&#8217;. A task board becomes a Kanban board only when task cards signify some action, otherwise it serves only the purpose of tracking where in the process a task is. The typical trigger for action is the return path in the conversation above, something like: &#8220;QA, here is that feature for you to test!&#8221;. This is manifest by a developer moving a task card into the &#8216;Done&#8217; or &#8216;Waiting for QA&#8217; column on the task board. This is a visual trigger for someone in the QA team to pull this task into their personal queue. This can further be improved by imposing work-in-progress limits for each resource at each stage in the process.</p>
<p>The following occurred to me while writing this post:</p>
<p>At the moment, I don&#8217;t know if the forward conversation should be represented on a Kanban board, and if so, how. Perhaps with a different coloured card. I think it might add value to track this forward conversation, since it could still serve as a trigger for action. As in the case with the car and engine, a QA engineer can test a feature until it has been developed by a developers. Similarly, a developer cannot begin development on a feature until it has been specified by a BA. Perhaps it is necessary to represent this on the Kanban board. I.e. a visual trigger to a BA that he needs to do some work.</p>
<p>This could be achieved by having a &#8216;reverse&#8217; stream on a Kanban board, representing the forward conversation. Thus, when QA is asked to present a feature to give to the deployment team to deploy, QA should put a card in the &#8216;waiting for development&#8217; column on the board. This card is then passed upstream in the process until the first stage in the process (business in our case) fulfils it, then starts passing it back downstream. This could be used to discover bottlenecks in the upstream direction. I.e. our developers are sitting idle because the BAs cannot develop specification fast enough.</p>
<p>This can be discovered on a &#8216;normal&#8217; Kanban board by the &#8216;to do&#8217; column for development remaining empty for some time. Perhaps then the absence of work items in the &#8216;to do&#8217; column for any stage indicates a bottleneck in the stage before.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=36&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2009/11/22/kanban-board-and-pull/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
		<item>
		<title>Jidoka and Multi-tasking</title>
		<link>http://joshilewis.wordpress.com/2009/11/16/jidoka-and-multi-tasking/</link>
		<comments>http://joshilewis.wordpress.com/2009/11/16/jidoka-and-multi-tasking/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 21:24:50 +0000</pubDate>
		<dc:creator>joshilewis</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[jidoka]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://joshilewis.wordpress.com/?p=26</guid>
		<description><![CDATA[I&#8217;ve recently done a fair amount of research into the application of lean manufacturing techniques to software development. Its mentioned in a lot of places that the Toyota Production System is based on JIT and Jidoka. (Personally I think Kaizen should fit in here as well, as a governing philosophy.) Essentially, jidoka means: automatically stopping [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=26&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently done a fair amount of research into the application of lean manufacturing techniques to software development. Its mentioned in a lot of places that the Toyota Production System is based on JIT and Jidoka. (Personally I think Kaizen should fit in here as well, as a governing philosophy.)</p>
<p>Essentially, jidoka means:</p>
<ul>
<li> automatically stopping the line when a defect is detected</li>
<li>fixing the defect</li>
<li>instituting counter-measures to prevent further defects (implies root-cause analysis)</li>
</ul>
<p>By instituting these counter-measures in the system immediately, you&#8217;re building quality into the system.</p>
<p>In my opinion, jidoka resonates with the &#8216;Boy-Scout Principle&#8217; (leave it better than when you found it) and the Pragmatic Programmers&#8217; &#8216;Don&#8217;t Live with Broken Windows&#8217;.</p>
<p>From my interpretation, jidoka means that when you find a defect in your software development process, you stop it there and then, and fix it. Broadly this would include bugs, &#8216;bad&#8217; or flawed code, broken builds etc. (Please challenge me on these in the comments, I&#8217;m not 100% sure if all of these fit in.)</p>
<p>If I extrapolate a bit, this implies that if I&#8217;m doing a code review of one of my report&#8217;s work and I find some badly written or designed code, I should immediately pull all the developers in my team off of what they&#8217;re doing, fix the bad code, and have a session on why the code is bad and how it should be written in future (the counter-measure).</p>
<p>This is where my difficulty begins. It is now relatively well documented that multitasking causes delays in inefficiencies in the process. I know from personal experience that the context switch involved in changing tasks, at any granularity, is expensive and disruptive.</p>
<p>Then, given that interrupting all the members in my team will cause a major context switch, how do I satisfy the demands of jidoka?</p>
<p>If a bug is reported by the QA team or by an end-user, does the developer (or pair) who originally worked on that feature/code stop what he&#8217;s doing right now and fix the bug?</p>
<p>Maybe jidoka is less applicable to software development as it is to manufacturing: how much context is involved in the case of a worker attending an assembly line? (I don&#8217;t know, I haven&#8217;t worked as one before.)</p>
<p>I am led to another (off-topic) question: in the case of a bug report, which causes less of a context switch:</p>
<ul>
<li>the developer moving to work on the bug right away, while the context of his original work on the code is still fresh at the expense of the context of the current task</li>
<li>the developer moving to work on the bug only once his current task is complete, thereby retaining the context of the current task, but losing context of the buggy code</li>
</ul>
<p>How does one achieve a good balance between satisfying jidoka and disrupting the team as little as possible?</p>
<p>When should the knowledge created by the bug fix be disseminated across the team?</p>
<p>Should teams have a scheduled weekly or fortnightly code review/knowledge dissemination session?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joshilewis.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joshilewis.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joshilewis.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joshilewis.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joshilewis.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joshilewis.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joshilewis.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joshilewis.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joshilewis.wordpress.com&amp;blog=6101101&amp;post=26&amp;subd=joshilewis&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joshilewis.wordpress.com/2009/11/16/jidoka-and-multi-tasking/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6a0bbe0b72b841cce9ecf63df660d4cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">joshilewis</media:title>
		</media:content>
	</item>
	</channel>
</rss>
