<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Zsolt Fabók]]></title>
  <link href="http://zsoltfabok.com/atom.xml" rel="self"/>
  <link href="http://zsoltfabok.com/"/>
  <updated>2015-04-27T10:42:33+02:00</updated>
  <id>http://zsoltfabok.com/</id>
  <author>
    <name><![CDATA[Zsolt]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Philosophies of Building the Workplace]]></title>
    <link href="http://zsoltfabok.com/blog/2015/04/philosophies-of-building-the-workplace/"/>
    <updated>2015-04-24T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2015/04/philosophies-of-building-the-workplace</id>
    <content type="html"><![CDATA[<p>I gave my second talk at the Budapest University of Technology and Economics to psychology students about the philosophies we use to build and improve a workplace. I covered a wide range of topics (Taylor, Kanban, staff liquidity, cynefin, etc.) and promised the students to share some references and further reading materials. Here you go, and thank you very much for coming I really appreciate it!</p>

<!-- more -->


<h3>Intro</h3>

<ul>
<li>What the goal of the organisation or workplace</li>
<li>Empowerment (<a href="http://www.libri.hu/konyv/empowerment-a-felelosseg-hatalma.html">book reference</a>)</li>
<li>Tribal leadership (<a href="http://www.triballeadership.net/book">book reference</a>)</li>
</ul>


<h3>Processes</h3>

<ul>
<li>Frederick Taylor, Henri Fayol and Max Weber</li>
<li>Taiichi Ohno and the Toyota Production System (<a href="http://www.amazon.com/Toyota-Production-System-Beyond-Large-Scale/dp/0915299143">book reference</a>)</li>
<li>Waste (<a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development/">blog post</a>)</li>
<li>Flow Efficiency, work of Niklas Modig (<a href="http://www.amazon.co.uk/This-Lean-Resolving-Efficiency-Paradox/dp/919803930X">book reference</a>) and slides from Hakan Forss (<a href="https://hakanforss.wordpress.com/2012/09/14/lean-lego-the-red-brick-cancer/">blog post</a>). More about flow efficiency: <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">how to measure it</a> and <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">when it is not so useful</a></li>
<li>The agile way of working (<a href="http://zsoltfabok.com/blog/2014/01/the-purpose-of-agile/">blog post</a>)</li>
<li>Scrum (don&#8217;t do Scrum if possible. If you want to, here are some <a href="http://zsoltfabok.com/blog/tag/scrum/">good posts</a> about it.)</li>
<li>Kanban by David Anderson (<a href="http://zsoltfabok.com/blog/2013/10/i-broke-the-wip-limit-slides/">slides</a>)</li>
<li>Value stream mapping (<a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/">blog post about how to do it</a>)</li>
<li>Staff liquidity by Chris Matts (<a href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/">blog post</a>)</li>
<li>Cynefin by Dave Snowden (<a href="http://zsoltfabok.com/blog/2013/06/cynefin-for-the-first-time/">blog post</a> and <a href="http://cognitive-edge.com/">further reading</a>)</li>
<li>Beyond Budgeting by Bjarte Bogsnes (<a href="http://zsoltfabok.com/blog/2012/05/group-punishment/">metion in a blog post</a> and <a href="http://bbrt.org/">further reading</a>)</li>
</ul>


<h3>People</h3>

<ul>
<li>Social sciences make a difference (<a href="https://speakerdeck.com/fabokzs/ace2013-social-sciences-make-a-difference">slides</a>)</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Teaser Talk about Development at the University]]></title>
    <link href="http://zsoltfabok.com/blog/2015/03/teaser-talk-about-development-at-the-university/"/>
    <updated>2015-03-02T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2015/03/teaser-talk-about-development-at-the-university</id>
    <content type="html"><![CDATA[<p>I&#8217;ve recently given a teaser talk about software development at the Budapest University of Technology and Economics. The audience was great and thank you for coming folks, I really appreciate it!</p>

<!-- more -->


<p>I wasn&#8217;t talking much about programming because nowadays a programmer or software developer is expected to know and do testing, and keep in mind two things: quality and user satisfaction.</p>

<p>Here are the slides:</p>

<div style="text-align:center">
<script async class="speakerdeck-embed" data-id="7370a39c9a2c4e039788df6c6924b8af" data-ratio="1.33333333333333" src="http://zsoltfabok.com//speakerdeck.com/assets/embed.js"></script>
</div>


<br/>


<p>I also presented this older material from <a href="http://zsoltfabok.com/speaking#xp2013">XP2013</a>:</p>

<div style="text-align:center">
<script async class="speakerdeck-embed" data-id="a6ec9040b4890130e2a5765ef1db6605" data-ratio="1.33333333333333" src="http://zsoltfabok.com//speakerdeck.com/assets/embed.js"></script>
</div>


<br/>


<p>There are some more useful links below.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2010/06/one-step-back-in-testing/">One Step Back In Testing</a></li><li><a href="http://zsoltfabok.com/blog/2011/05/narrow-down-what-to-test/">How to Narrow Down What to Test</a></li><li><a href="http://zsoltfabok.com/blog/2012/08/embedded-web-services-for-testing/">Embedded Web Services For Testing Web Applications from JUnit</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/the-purpose-of-agile/">The Purpose of Agile Software Development</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Visualize Information Flow in Value Stream Mapping]]></title>
    <link href="http://zsoltfabok.com/blog/2014/05/visualize-information-in-value-stream-mapping/"/>
    <updated>2014-05-23T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2014/05/visualize-information-in-value-stream-mapping</id>
    <content type="html"><![CDATA[<p><a href="http://zsoltfabok.com/blog/2014/05/flow-efficiency-is-not-always-useful/">When I met Mary and Tom Poppendieck</a> we not only talked about <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">flow efficiency</a> but about the entity that actually flows through the system. According to Mary it can only be a deriverable: a customer request, a feature or a product, but not a patch or a bug fix. The more I think about it and the more I look at my current and previous projects, the more certain I am that she is wrong. My point is that we cannot focus only on deliverables in case of a flow: if we do, we won&#8217;t be able to see the big picture. I still believe that a value stream mapping should contain all kinds of things that appear in the flow, and therefore <strong>I&#8217;d say that the entity that flows and shall be mapped in value stream mapping exercises is the information</strong>.</p>

<!-- more -->


<p>I added <a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/">information flow to the value stream mapping exercises</a> because a long time ago we tried to improve the flow of a certain organisation but none of our efforts was successful. The reason was that the flow of customer requests and features covered only the 30% of the whole flow. The other 70% was communication, office politics, site politics, bug fixes etc. If you think about it, these work with information - even the features and bug fixes can be seen as some kind of information -, so it make sense to add them to the value stream map. With this approach we were able to see the whole, and finally it made sense why our efforts on feature flow improvement were unsuccessful: there was insufficient communication, therefore decisions were based on assumptions.</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2012-04-17-see-the-whole-flow-exercise/second_task.png"></p>

<p>After we did the usual value stream mapping we added the information flow. It turned out that delivery management was out of the loop: no information went in and no information went out (no feedback loops). This means that they assumed certain important details just by looking at the package, and never gave feedback on it (practically, if there was an error they fixed it, but never pushed upstream). This was not visible on the usual value stream map but was immediately visible on an <strong>information stream map</strong>.</p>

<p>And this is something you can try. Do a usual value stream mapping and then add the information flow and see if the information flow follows the value (eg. features) flow. If not, or in a worst case there are information flow without feature flows you found a good place for improvements.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/">See the Whole Flow - An Exercise for Managers to Start a Transition</a></li><li><a href="http://zsoltfabok.com/blog/2013/06/cynefin-for-the-first-time/">My First Time With Cynefin</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li><li><a href="http://zsoltfabok.com/blog/2014/05/flow-efficiency-is-not-always-useful/">Flow Efficiency Based Improvements Aren&#8217;t Always Useful</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Flow Efficiency Based Improvements Aren't Always Useful]]></title>
    <link href="http://zsoltfabok.com/blog/2014/05/flow-efficiency-is-not-always-useful/"/>
    <updated>2014-05-21T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2014/05/flow-efficiency-is-not-always-useful</id>
    <content type="html"><![CDATA[<p>Yesterday, I met <a href="http://www.poppendieck.com/">Mary and Tom Poppendieck</a> and over a nice beer we were talking about various topics but we spent most of our time talking about <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">flow efficiency</a> (ratio of the value added activities to waiting). When I was riding my bicycle home I was still thinking about our conversation and presented examples. Despite the fact that I think the current right move is to favour flow efficiency over resource efficiency, <strong>I think it only works in the simple domain of <a href="https://twitter.com/snowded">Dave Snowden</a>&#8217;s <a href="http://zsoltfabok.com/blog/2013/06/cynefin-for-the-first-time/">cynefin</a> framework, where the connection between cause and effect is obvious to all</strong>. Here, simple means that the process is clear to everybody who is involved even if it is a long process.  If you think about car manufacturing from where the concept of flow efficiency originates, you can see that it&#8217;s in the simple domain: every detail of the process is well known to all workers involved. However, in knowledge work and in software development, that is not necessarily true.</p>

<!-- more -->


<p>According to Dave Snowden, most of the knowledge workers are in the complex (connection between cause and effect is clear only in retrospect) and complicated (connection between cause and effect requires expert knowledge) domains, and in these domains the flow is not as visible and controllable as in the simple domain. Without having the proper - and not expert - view on the flow it is extremely difficult to improve the flow efficiency. This is a minor thing compared to the fact that in the complex and complicated domains we don&#8217;t even know for sure the connection between cause and effect (that&#8217;s why Snowden suggests to probe and analyze) and we add flow efficiency changes on top of that.</p>

<p>For example, we see that there is a buffer between two teams (buffer means waiting time). One way to improve flow efficiency is to merge the two teams or at least make them interact more frequently. This looks like a good idea, however there is no guarantee that it is going to work. What if the teams simply cannot communicate more or they cannot work together which slows them down and the waiting time increases?</p>

<p>Nevertheless, improving the flow efficiency is a good idea but knowing in which domain of the cynefin framework we are in is crucial. I had improved the flow efficiency of various teams in the past but in retrospect they were in the simple domain. I failed with my last team because we were in the complex domain and despite the huge effort we put into flow efficiency improvement nothing has changed. We should have moved to the complicated domain first where the connection between cause and effect are clearer and do the flow efficiency improvement as an experiment that we can analyse. My point is: <strong>don&#8217;t start with the flow efficiency improvement until you understand your flow and you have control over it</strong> (having a <a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/">value stream map</a> is a good start but knowing is different from understanding).</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/">See the Whole Flow - An Exercise for Managers to Start a Transition</a></li><li><a href="http://zsoltfabok.com/blog/2013/06/cynefin-for-the-first-time/">My First Time With Cynefin</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li><li><a href="http://zsoltfabok.com/blog/2014/05/visualize-information-in-value-stream-mapping/">Visualize Information Flow in Value Stream Mapping</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Schedule Portfolio Kanban]]></title>
    <link href="http://zsoltfabok.com/blog/2014/04/schedule-portfolio-board/"/>
    <updated>2014-04-07T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2014/04/schedule-portfolio-board</id>
    <content type="html"><![CDATA[<p>As a project manager one of my current tasks is risk management, and I have to focus especially on schedule risk. Therefore I was looking for something that can show me quickly the current status of the project and this kind of risk. I started to use a portfolio Kanban board that covers the whole project, but my board is different from <a href="http://brodzinski.com/2013/08/portfolio-visualization.html">Pawel Brodzinski&#8217;s resource oriented board</a>:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-04-07-schedule-portfolio-board/schedule_portfolio_board.png"></p>

<p>I&#8217;m using an old idea from <a href="https://groups.yahoo.com/neo/groups/kanbandev/conversations/messages/10101">Chris Matts</a> - a work item is put into a column that tells us when the it is supposed to be ready -, and the idea of <a href="http://zsoltfabok.com/blog/2011/05/kanban-on-organisational-level/">organisational level Kanban boards</a>. If this is week 13, team yellow is doing fine, whereas teams red and blue are in trouble.</p>

<!-- more -->


<p>Besides the nice overview the board points to the most problematic parts of the project regarding schedule risk: the oldest item (team red&#8217;s work item in week 11) and the team with the highest number of delayed work items (team blue).</p>

<p>The completeness attribute tells me something else: a work item with a 3/5 completeness (<a href="http://zsoltfabok.com/blog/2014/01/throughput/">number of done items / number of planned items</a>) won&#8217;t be finished this week if today is Friday, however a 2/3 might be finished. Moreover, team red has started to work on something that is supposed to be ready by week 15, but they haven&#8217;t finished their week 12 commitment. Team yellow might be delayed later: so far - in 3 weeks - they finished 6 of their work items (1/1+2/2 from done, 2/3 from week 13) and they committed to deliver 8 by week 14. That is very unlikely to happen.</p>

<p>These numbers are not accurate enough but they are a good basis of a discussion. Looking at the assigned team&#8217;s <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> and <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput</a> can tell us more about the situation (more about this in a later post). Information about the completeness should automatically come from the assigned team&#8217;s board:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-04-07-schedule-portfolio-board/schedule_portfolio_board_with_team_board.png"></p>

<p>It is still early to say much more about this approach. I have two urgent things to solve. First, I cannot see <a href="http://zsoltfabok.com/blog/2013/08/visualise-and-manage-team-dependency/">dependencies between teams</a> which would be important. Second, somehow I need to gather more data from teams and show it to them on the portfolio level, such as <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a>, <a href="http://zsoltfabok.com/blog/2013/12/takt-time/">takt time</a> and <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput</a>, which would provide a good basis for predictions.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2011/05/kanban-on-organisational-level/">Kanban on Organisational Level</a></li><li><a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/">See the Whole Flow - An Exercise for Managers to Start a Transition</a></li><li><a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/">Visualize the Flow on the Highest Possible Level</a></li><li><a href="http://zsoltfabok.com/blog/2013/08/visualise-and-manage-team-dependency/">Visualize and Manage Team Dependency</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[No Attributes in Objects]]></title>
    <link href="http://zsoltfabok.com/blog/2014/03/no-attributes-in-objects/"/>
    <updated>2014-03-31T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2014/03/no-attributes-in-objects</id>
    <content type="html"><![CDATA[<p>I just realised that I rarely define attributes in my classes (the <a href="http://zsoltfabok.com/blog/tag/dependency_injection/">dependency injection</a> references are exceptions) and I&#8217;m passing everything as a parameter. So instead of this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Foo</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:list</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">do_something</span>
</span><span class='line'>    <span class="vi">@list</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="n">action_1</span>
</span><span class='line'>    <span class="n">action_2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">action1</span>
</span><span class='line'>    <span class="vi">@list</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;a&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">action_2</span>
</span><span class='line'>    <span class="vi">@list</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;b&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I have this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Foo</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">do_something</span>
</span><span class='line'>    <span class="n">list</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="n">action_1</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="n">action_2</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>  <span class="c1">#   self. means that this is a class level method (static in Java)</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">action_1</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="n">list</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;a&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">action_2</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="n">list</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;b&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Similarly to my <a href="http://zsoltfabok.com/blog/2014/03/spike-and-a-new-workflow/">spike workflow</a> I realised what I&#8217;m unintentionally doing after actually having done it. I switched to this method because of the <a href="http://www.linfo.org/unix_philosophy.html">Unix philosophy</a>: <em>&#8220;The Unix philosophy emphasizes building short, simple, clear, modular, and extendable code that can be easily maintained and repurposed by developers other than its creators.&#8221;</em></p>

<p>More precisely: I switched to this method because I was struggling with the Unix philosophy. When I&#8217;m writing code I don&#8217;t know what the shortest and simplest entity in my code is so I put everything into a class and when it is done, I may refactor it into smaller classes. This refactoring work is very hard when I have tightly coupled methods, but when I have methods that are not coupled by attributes (except dependency injection references) then it is easy. In the code above I can simply move <code>action_1</code> and <code>action_2</code> anywhere I want:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Foo</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># I have an attribute here: @actions</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">actions</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@actions</span> <span class="o">=</span> <span class="n">actions</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">do_something</span>
</span><span class='line'>    <span class="n">list</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="vi">@actions</span><span class="o">.</span><span class="n">action_1</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@actions</span><span class="o">.</span><span class="n">action_2</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ----</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Actions</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">action_1</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="n">list</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;a&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">action_2</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="n">list</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;b&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>action_1</code> and <code>action_2</code> methods are no longer class level methods (no <code>.self</code>) because it is easier to code dependency injection with object level methods.</p>

<p>I do this even if my class has an actual &#8220;state&#8221;:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Foo</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:last_element</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:list</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">do_iterate</span>
</span><span class='line'>    <span class="n">last_element</span> <span class="o">=</span> <span class="n">action_1</span><span class="p">(</span><span class="vi">@last_element</span><span class="p">,</span> <span class="vi">@list</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">action_1</span><span class="p">(</span><span class="n">last_element</span><span class="p">,</span> <span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="n">list</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;a&quot;</span>
</span><span class='line'>    <span class="n">last_element</span> <span class="o">=</span> <span class="mi">2</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">last_element</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Anyway, this is the first time a large refactoring is no longer a difficult and long process. Furthermore, there are no more surprises in my methods: I know what is going to happen just by looking at the method definition.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2011/01/the-refactoring-only-constraint/">The Refactoring only Constraint</a></li><li><a href="http://zsoltfabok.com/blog/2011/12/cucumber-jvm-more-scenarios/">Cucumber JVM: More Scenarios</a></li><li><a href="http://zsoltfabok.com/blog/2012/03/cucumber-jvm-mocking/">Cucumber JVM: Mocking</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/gemfile-path-reference/">Path Reference in Gemfile</a></li><li><a href="http://zsoltfabok.com/blog/2014/03/speed-or-accuracy/">Fast or Accurate Applications?</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Risk Kanban Board]]></title>
    <link href="http://zsoltfabok.com/blog/2014/03/risk-kanban-board/"/>
    <updated>2014-03-25T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/03/risk-kanban-board</id>
    <content type="html"><![CDATA[<p>A couple of days ago I was talking with a friend about <a href="http://zsoltfabok.com/blog/2013/10/i-broke-the-wip-limit-slides/">the talk I gave last year during the Lean Kanban Europe tour</a> and I realised that my unusual Kanban board may be able to solve my recent problem: <strong>I want to visualize and easily manage risks</strong>. The board is a horizontally sliced board with four <a href="http://zsoltfabok.com/blog/2013/09/when-not-to-use-swim-lanes/">horizontal lanes</a> and was originally designed for an operations team (note: for risk management I won&#8217;t need <a href="http://zsoltfabok.com/blog/tag/wip/">WIP limits</a>):</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-25-risk-kanban-board/risk_kanban_board.png"></p>

<!-- more -->


<p>Each lane represents a certain severity using the visualization idea from <a href="http://agileconsulting.blogspot.hu/2011/03/using-cost-of-delay-functions-to.html">Jeff Anderson</a>. <strong>The severity (risk) comes from the correlation between time and impact: the later the team handles an issue the higher the impact is.</strong> Moreover, the cost or effort to &#8220;handle&#8221; a certain level is proportional to the area under the curve:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-25-risk-kanban-board/levels_and_cost_of_delay.png"></p>

<p>Level 1 category has an &#8220;infinite impact&#8221; and an unknown cost of delay. The problem of this level is that it is completely unpredictable. The costs can be extremely low or extremely high and this high uncertainty forces us to take care of it immediately. For example, the lead developer of the project cannot come to work any more. We can gamble and say that we&#8217;ll survive without him or we try to promote somebody else and train very-very fast. <strong>Level 1 doesn&#8217;t allow us to do proper risk management and mitigation, it forces us to do something</strong>. So it is better to take actions before a risk turns into level 1, but when it is on level 1, we have to take care of it immediately.</p>

<p>Level 2 category means that at the moment we know something is going to happen and we are aware of the consequences of a late action. For example, we know that the lead developer is leaving the company and we have 30 days to find a new lead. The more we wait with the promotion or the hire, the higher the cost of delay will be; it will be inversely proportional to the insufficient domain knowledge of the new lead developer. In other words: the more we wait the higher the risk reduced quality and delays in the project because of the domain knowledge of the new lead.</p>

<p>As you can see, if a level 2 item is not taken care of in time, it will turn into a level 1 item:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-25-risk-kanban-board/level_transformation_2_1.png"></p>

<p>Level 3 is similar to level 2, but it has a free delay before turning into level 2:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-25-risk-kanban-board/level_transformation_3_2.png"></p>

<p>Which means that there is a period of time when we can ignore the risk, but we cannot do it forever. Following our example, we know that the lead developer will leave the country later this year, so finding a replacement is not an immediate issue, but will be eventually.</p>

<p>Level 4 is a collection for nice to have issues or low risk level items. As I used to say: <em>&#8220;this is the place where all the refactoring and code improvement tasks come to die&#8221;</em>.</p>

<p>Like the other boards, this one also needs daily updates (the previously mentioned operations team did it twice a day). The risks (work items) have to be reviewed from top-right to bottom-left so that the team talks about the most &#8220;painful&#8221; risk first. The rest of the risks should be revisited and checked whether they have got closer to a level transformation or need to change level:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-25-risk-kanban-board/risk_kanban_board_after_update.png"></p>

<p>And finally, when a risk is sorted out - or a work item is done -, it gets into the done column. Similarly to other Kanban systems this approach provides measures such as <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> (time needed to mitigate a risk on a certain level) and <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput</a> (number of risks mitigated) and needs to be continuously improved in order to be an <a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient/">effective system</a>.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2013/02/three-columns/">Be Aware of the Three Columns</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/">One Reason Why WIP limits Matter</a></li><li><a href="http://zsoltfabok.com/blog/2014/02/wrong-wip-limits-may-kill-your-options/">Wrong WIP Limits Will Kill Your Options</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fast or Accurate Applications?]]></title>
    <link href="http://zsoltfabok.com/blog/2014/03/speed-or-accuracy/"/>
    <updated>2014-03-24T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/03/speed-or-accuracy</id>
    <content type="html"><![CDATA[<p>It is a common topic between software developers whether an application should be fast or accurate. I&#8217;ve always chosen accuracy over speed until now, like when I was solving <a href="https://github.com/ZsoltFabok/project_euler/blob/master/lib/project_euler/problems/problem_7.rb">problem 7 on project euler</a>, which sounded very simple: find the 10001st prime number. My algorithm for finding prime numbers used <a href="http://en.wikipedia.org/wiki/Wilson's_theorem">Wilson&#8217;s theorem</a>:</p>

<figure class='code'><figcaption><span>prime.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">is_prime?</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
</span><span class='line'>  <span class="p">(</span><span class="no">Math</span><span class="o">::</span><span class="no">Factorial</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">number</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">number</span> <span class="o">==</span> <span class="mi">0</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it was just fine for <a href="https://github.com/ZsoltFabok/project_euler/blob/master/lib/project_euler/problems/problem_3.rb">problem 3</a>, where I had to find the prime factors of a certain number. There, the highest prime number I had to deal with was 6857 which is the 882nd prime number. Then I started to look for the 10001st prime, and my algorithm managed to find the 3000th after 2 hours.</p>

<!-- more -->


<p>I&#8217;ve observed before that my algorithm is not really fast, but why change something until it is not necessary, right? Wilson&#8217;s theorem is slow, because of the factorisation. Here is the factorial of 100 (100!):</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">&gt;&gt;</span> <span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">100</span><span class="p">)</span><span class="o">.</span><span class="n">to_a</span><span class="o">.</span><span class="n">inject</span><span class="p">(</span><span class="ss">:*</span><span class="p">)</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="o">-</span><span class="mi">10384284350875615835879868794784780563948700682078952346418475</span>
</span><span class='line'><span class="mi">948982003462663882896989074486814358339575949818878047438776630877</span>
</span><span class='line'><span class="mo">072</span><span class="mi">9164800000000000000000000</span>
</span><span class='line'><span class="o">&gt;&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It takes quite a long time and you can imagine how long it takes to calculate the factorial of 1000, or the factorial of the 10001st prime. So I needed something faster, and I found <a href="http://en.wikipedia.org/wiki/Fermat%27s_little_theorem">Fermat&#8217;s little theorem</a> (setting <code>a = 2</code>):</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">is_prime?</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
</span><span class='line'>   <span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
</span><span class='line'>   <span class="p">(</span><span class="n">a</span> <span class="o">**</span> <span class="p">(</span><span class="n">number</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">number</span> <span class="o">==</span> <span class="mi">0</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it was faster, way faster (~86 seconds with IO operations, because I&#8217;m storing the primes in a file cache). But, <a href="http://projecteuler.net/">Project Euler</a> didn&#8217;t accept my solution. I thought I had screwed up the indexes and had submitted the 10000th prime instead of 10001st. So, I submitted primes in the range of +/-2, but none of them was good.</p>

<p>Since it would take ages to guess the right number, I took a different approach. I downloaded the first 1000 primes from the internet and compared them to my primes and there were differences. The first was 341. As it turned out, it is a <a href="http://en.wikipedia.org/wiki/Pseudoprime">pseudoprime</a>. A pseudoprime looks like a prime according to Fermat&#8217;s little theorem, but actually it&#8217;s not: 11 * 31 = 341. The application became faster but less accurate. I didn&#8217;t go back to Wilson&#8217;s theorem, but changed the <a href="https://github.com/ZsoltFabok/project_euler/blob/master/lib/project_euler/math/prime.rb">code quite a bit</a>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">is_prime?</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
</span><span class='line'>  <span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">**</span> <span class="p">(</span><span class="n">number</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">number</span> <span class="o">==</span> <span class="mi">0</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">is_pseudoprime?</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="kp">false</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="k">return</span> <span class="kp">true</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">return</span>  <span class="kp">false</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="kp">protected</span>
</span><span class='line'><span class="k">def</span> <span class="nf">is_pseudoprime?</span><span class="p">(</span><span class="n">number</span><span class="p">)</span>
</span><span class='line'>  <span class="n">number_sqrt</span> <span class="o">=</span> <span class="no">Math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">number</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>  <span class="n">divisors</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.number_sqrt</span><span class="p">)</span><span class="o">.</span><span class="n">to_a</span><span class="o">.</span><span class="n">delete_if</span> <span class="k">do</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span>
</span><span class='line'>    <span class="n">is_composite_of?</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="o">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">11</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">divisors</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span>
</span><span class='line'>    <span class="c1"># n &gt; 1 makes sure that it works for actual primes in the recursion</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">number</span> <span class="o">%</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">1</span>
</span><span class='line'>      <span class="k">return</span> <span class="kp">true</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">false</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">is_composite_of?</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">base_primes</span><span class="p">)</span>
</span><span class='line'>  <span class="n">base_primes</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">d</span><span class="o">|</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">%</span> <span class="n">d</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">((</span><span class="n">n</span> <span class="o">/</span> <span class="n">d</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="kp">true</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="kp">false</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is a bit slower, but more accurate (~89 seconds with IO). I think, it can be made faster (and cleaner), but for the moment I have enough primes and therefore I don&#8217;t need a different solution. Nevertheless, I learned a couple of things. First of all, playing safe and going for accuracy wasn&#8217;t a good choice because I didn&#8217;t improve and learn new things. Second, faster algorithms mea faster turnover times and faster development. And third, things like pseudoprimes finally make sense after 10 years I finished the University. Nevertheless, it was fun, solving Project Euler puzzles is fun, too. Give it a try, you&#8217;ll like it.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2011/12/bdd-demonstration/">A Step by Step BDD Demonstration with Some Useful Insights</a></li><li><a href="http://zsoltfabok.com/blog/2012/04/we-need-realistic-coding-dojos/">We Need Realistic Coding Dojos</a></li><li><a href="http://zsoltfabok.com/blog/2013/03/the-empty-else-block/">The Empty Else Block</a></li><li><a href="http://zsoltfabok.com/blog/2013/08/from-cucumber-to-turnip/">Moving From Cucumber to Turnip</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/open-sourcing-emcalc/">Open Sourcing Emcalc, a Legacy Application</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Spike and a New Workflow]]></title>
    <link href="http://zsoltfabok.com/blog/2014/03/spike-and-a-new-workflow/"/>
    <updated>2014-03-19T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/03/spike-and-a-new-workflow</id>
    <content type="html"><![CDATA[<p>The other day I found myself writing a single test case the whole day without making a significant progress in the production code. It wasn&#8217;t <a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient/">efficient</a> at all and I <a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development#mura">wasted</a> the whole day on stupid test cases - so it was time to ditch <a href="http://zsoltfabok.com/blog/tag/tdd/">TDD</a> for the rest of the weekend and try something different. After calming down I asked myself why I was writing test cases when I didn&#8217;t have a clue about the next step. So, instead of writing tests I wrote a <a href="http://zsoltfabok.com/blog/tag/xp/">spike</a>. It wasn&#8217;t nice at all, but showed me which direction I should go. I wrote a test case which tested the spike and was green, and I deleted the spike afterwards. And at this very moment, the Spike Solution from XP finally made perfect sense to me.</p>

<!-- more -->


<p>According to <a href="http://www.extremeprogramming.org/rules/spike.html">extremeprogramming.org</a> a spike is a proof of concept: <em>&#8220;Create spike solutions to figure out answers to tough technical or design problems&#8221;</em>. Sounds great; it resonates well with my conclusions above (the next time it would be fantastic to find the <em>science</em> first and then the practice and not vise versa ;-)). And from now on - until I find something better - I&#8217;m going to follow this workflow in my projects:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-19-spike-and-a-new-workflow/spike_workflow.png"></p>

<p>If I know what I should do I&#8217;ll use TDD, if I don&#8217;t, I&#8217;ll write a spike. When I&#8217;m satisfied with the results, I write a test case (acceptance or unit). Next I delete the spike, and inject the new test case into the TDD cycle which will be red in that context (there is no matching code, remember: the spike is gone, so it should be red).</p>

<p>Here is an example. I have a nice algorithm that does certain things to numbers. I know the inputs and outputs of the algorithm, so it is TDD, no questions. However, an algorithm alone is worthless. Either I need an app, a command line interface, or an API. There are too many options and possibilities, so I&#8217;d make more progress by just writing spikes until I find the right solution. When I have it, I&#8217;ll write a test, delete the spike and let TDD do its magic.</p>

<p>As you can see the &#8220;spike turn&#8221; takes more time, and you should be prepared for that. If you aren&#8217;t prepared enough, you&#8217;ll do the same mistakes I did. I was writing spikes for days. From a certain point of view, there is no difference in writing spike code for a day and writing test code for a day. So my agreement with myself was that I have to sweat out at least one acceptance test in a day when I&#8217;m doing a spike.</p>

<p>After making progress with the new workflow in my project, I realised that I ended up with a nice test pyramid:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-19-spike-and-a-new-workflow/spike_workflow_and_test_pyramid.png"></p>

<p>The &#8220;spike turn&#8221; produces one acceptance test case, but the TDD produces more, because the acceptance test case kind of covers the more likely scenario, whilst the unit tests cover all the possible scenarios and outcomes.</p>

<p>This workflow is very similar to a <a href="http://zsoltfabok.com/blog/2011/12/bdd-demonstration/">BDD workflow</a>, but there are two important differences. First, BDD is a conversation tool between product and development. Second, the two parties (product and development) have an idea about how the application should behave. I&#8217;m using my main success scenario because I don&#8217;t have a clue how it should behave. Anyway, I&#8217;m happy with it, and if you give it a try, don&#8217;t forget to comment and share your experiences.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2011/12/bdd-demonstration/">A Step by Step BDD Demonstration with Some Useful Insights</a></li><li><a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development/">Waste in Software Development</a></li><li><a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient/">There is a Difference Between Effective and Efficient</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Constant WIP - CONWIP]]></title>
    <link href="http://zsoltfabok.com/blog/2014/03/conwip/"/>
    <updated>2014-03-10T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/03/conwip</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://zsoltfabok.com/images/posts/2014-03-10-conwip/conwip.png">
CONWIP stands for constant work in progress which means that the overall number of work items in the system is limited, not just a single phase or column. For example, with a CONWIP of 6 we can have at most 6 work items between &#8216;todo&#8217; and &#8216;done&#8217;. Like <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughtput</a>, <a href="http://zsoltfabok.com/blog/2013/12/takt-time/">takt time</a>, and <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">flow efficiency</a> CONWIP comes from the car manufacturing world and it was designed for a system that produces the same kind of work item over and over. The idea is the following: it is hard to control throughtput (it is a lag measure: it provides a value that applies to a period in the past) while it is relative easy to control the overall number work items (real kanban cards and pulls) in the whole system. For example, our factory produces two kinds of product &#8216;A&#8217; and &#8216;B&#8217;. At the moment the market needs more of &#8216;A&#8217; and less of &#8216;B&#8217;, we simply reduce the CONWIP of &#8216;B&#8217; and increase the CONWIP of &#8216;A&#8217; (we do product leveling). This will change the throughput. When the demand changes we change the CONWIP values accordingly. Like the previously mentioned metrics, CONWIP cannot be used as such in software development, but after putting it into context it is very helpful.</p>

<!-- more -->


<p>First, it is obvious but I have to mention that a very high CONWIP won&#8217;t cause very high throughput. There is an upper limitation of every system and if you go above this limit the overall <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> will increase and the throughput will decrease because the high CONWIP will allow <a href="http://zsoltfabok.com/blog/2014/02/aging-work-items/">aging work items</a> in the system. Second, CONWIP has really nothing to do with the WIP that is applies to the columns (or phases) on a Kanban board, except that the CONWIP cannot be lower than the highest WIP. For example, if you have a WIP limit of 5 for testing and your CONWIP is 4, you&#8217;ll never have more than 4 items in testing, so why have a WIP of 5 and/or a CONWIP of 4? And third, the sum of WIPs won&#8217;t provide the ideal CONWIP. CONWIP is in connection with a desired throughput or capability.</p>

<p>Let&#8217;s say you have 5 developers, you have one &#8216;ongoing&#8217; and one &#8216;review column&#8217;, and in order to move things forward you have a WIP limit of 2 for &#8216;review&#8217; and 5 for &#8216;ongoing&#8217;. The sum of these WIPs is 7 but the actual capacity is 5. If you set the CONWIP to 6 or 7 you&#8217;ll have at least one developer who is working on multiple things. Moreover, the team slows down because &#8216;review&#8217; will be emptied when &#8216;ongoing&#8217; reaches its WIP limit. If you go below 5 you&#8217;ll have a developer who is idle. So the best CONWIP for this team under the given circumstances is 5. If you change the WIP limits to 4 and 1 ((for &#8216;ongoing&#8217; and &#8216;review&#8217; respectively) because you want your lead developer to do only review you can do it without changing the CONWIP. Unfortunately, it will be the same as the sum of WIPs but as I showed you before it is not a working use case.</p>

<p>As I mentioned in the first chapter the CONWIP serves as a controlling function in car manufacturing and it can be used in the same way in software development. The team which owns the board below can do more and more week by week (increase in throughput), but never enough to match the demand:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-03-10-conwip/conwip-and-throughput.png"></p>

<p>So, it decides to maximize the amount of work items it can have at the same time. With this approach the team can have some time and stabilize they are in. So the team takes control over the demand (input) and throughput (output) by using CONWIP.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/takt-time/">Using Takt Time to Find Problems Earlier</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/throughput/">Throughput</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/">One Reason Why WIP limits Matter</a></li><li><a href="http://zsoltfabok.com/blog/2014/02/wrong-wip-limits-may-kill-your-options/">Wrong WIP Limits Will Kill Your Options</a></li><li><a href="http://zsoltfabok.com/blog/2014/02/aging-work-items/">Aging Work Items</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Improve your Estimations and be More Predictable]]></title>
    <link href="http://zsoltfabok.com/blog/2014/02/be-more-predictable/"/>
    <updated>2014-02-28T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/02/be-more-predictable</id>
    <content type="html"><![CDATA[<p>Planning in general - not just in software development - is not an easy thing. We have to know what to do next and have an idea when it will be ready. Although the former is harder the latter seems to be more problematic. We also struggled with it with my old team at Digital Natives. We had frequent and long planning meetings, and had rarely finished everything we had planned. So, we decided it was enough, and it was time to try something new. After about two months, we were able to give very accurate hour based predictions on spent time and delivery (lead time) with a quarter of the effort of our previous planning meetings.</p>

<!-- more -->


<p>We started a new board - not a Kanban board - where we collected the already finished work items:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-02-28-be-more-predictable/sla-board.png"></p>

<p>As you can see this board had three different columns. Each column represented a T-shirt size: &#8216;S&#8217;, &#8216;M&#8217;, and &#8216;L&#8217;. When we set up this board we put all the work items we had into these columns based on difficulty. Our smart questions were: &#8220;was this work item hard to do?&#8221; and &#8220;was it harder than these work items in this column?&#8221;. With this approach we ended up with three columns and since we weren&#8217;t able to find right titles for the them we named them T-shirt sizes. We calculated the <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> and <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">spent time</a> using <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">distribution diagrams</a> for each, and wrote them on the board (you can see them on the next picture). At the end of each week, we recalculated and put them on the board in order to use always the latest data for our predictions. When a work item was finished we put it into its proper column.</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-02-28-be-more-predictable/sla-board-highlight.png"></p>

<p>When we got a new work item, we gathered around the board, and we tried to estimate the right difficulty for the new work. Then we wrote &#8216;S&#8217;, &#8216;M&#8217;, or &#8216;L&#8217; on the card and put it on our Kanban board. During the daily meeting our product owner checked the new work items on the board. When he thought that an item would take too long - its predicted spent time based on its size was too much - he asked us to cut the work item into pieces or he reduced the scope just to let something hit the market sooner. Our <a href="http://zsoltfabok.com/blog/2014/01/throughput/">weekly inflow</a> was around 7 work items, we spent around 5 minutes on finding the right place for the card, so our planning effort was a bit more than half an hour. Before that we have never finished our planning meeting in under two hours. The other big gain was that we could get rid of Scrum sprints and could work continuously: the planning meeting wasn&#8217;t an obstacle any more.</p>

<p>After several weeks, we observed that our predictions were not as good as before. There were &#8216;M&#8217; sized items that were finished sooner, and vice versa. After a <a href="http://zsoltfabok.com/blog/tag/retrospective">retrospective</a> meeting we concluded that <strong>some of our data had expired</strong>. We were getting better at what we were doing, learned a lot about the product, and did several minor improvements in the meantime, therefore our old data was no longer useful. So we introduced lines on our board. Each line represented a week, and the latest was on the top (it took about 5 minutes to shift the whole board down each week, so it wasn&#8217;t a big effort). When we were doing the planning we considered only the last three weeks.</p>

<p><img class="right" src="http://zsoltfabok.com/images/posts/2014-02-28-be-more-predictable/post-it.png">
Of course we were wrong several times. The note on the right shows a transformation from &#8216;S&#8217; -> &#8216;M&#8217;. After a work item was finished we took it from our Kanban board and move it to the other board. When a work item took more time than we had originally predicted, we tried to find the right place for it. The work item above was predicted as &#8216;S&#8217; but actually was an &#8216;M&#8217;, so we put it into the &#8216;M&#8217; column. <strong>With this technique we kept our board up to date</strong>. Of course, if it was an &#8216;S&#8217; but we predicted an &#8216;M&#8217; we did the same routine. This &#8216;S&#8217; -> &#8216;M&#8217; marker became very helpful later. There is an inner voice that tells us &#8220;next time you&#8217;ll do better&#8221;, but this marker kept us from listening to it. If the new work item was similar to a card with &#8216;S&#8217; -> &#8216;M&#8217;, we wouldn&#8217;t mark it as &#8216;S&#8217; because we knew that we had problems with predicting similar work items before, so it became an &#8216;M&#8217;. Most of time we were right, and I&#8217;m still very happy about it, because <strong>we were making decisions based on data and not gut feeling</strong>. Moreover, we were also looking for certain keywords. For example, if a work item had the word &#8216;wizard&#8217; in its description it couldn&#8217;t get into the &#8216;S&#8217; column, ever. Even if it was a text change on the UI. We tried several times to finish a &#8216;wizard&#8217; related work within &#8216;S&#8217; scope, and we never succeeded. So, the minimum an &#8216;wizard&#8217; work item could get was an &#8216;M&#8217;. And our product owner was okay with this (I guess he valued predictability and quality over speed).</p>

<p>You may wonder about a couple of things. First, why were we tracking both the lead and spent time? We were kind of working in a TTM (time to market) fashion so it mattered how much time we spent on this project during a week or a month, so the spent time was important. On the other hand we needed the lead time to predict when a work item could be delivered. We weren&#8217;t doing continuous delivery - we did continuous deployment - so it was good to know when we can deploy.</p>

<p>Second, what has happened to the architectural decision part of a planning meeting? During a typical Scrum planning meeting, the teams kind of make architectural decisions as well. We didn&#8217;t stop doing this. We changed our process so that we did this planning for each new work item when it could get into the &#8216;analyse&#8217; phase (before implementation). So in general the time we spent on planning didn&#8217;t change much. What changed is the time we spent on a regular planning meeting, and we reduced some <a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development#mura">mura waste</a>: we planned when it was necessary, and therefore we had fewer re-planning sessions than before.</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-02-28-be-more-predictable/kanban-board.png"></p>

<p>And third, the environment. When we started to do this kind of planning we knew the domain, knew each other and our technical knowledge was kind of the same. The size of the team changed over time, but this affected only the lead time because we rarely worked on work items in pairs.</p>

<p>I really enjoyed working like this. It was stressless: no hassle around deadlines and estimations, because everything we did was predicable most of the time. <strong>Of course, when we had some performance issues we had some stress, but not because of planning and execution of plans</strong>. The pictures above were taken after four weeks of usage but we used this technique for three months until the end of the project. I can only recommend this technique, and if you are interested in the <a href="https://twitter.com/search?q=%23NoEstimates&amp;src=hash">#noEstimates</a> movement, this is a good start. You don&#8217;t need a physical board either. You can have a bit wider Done column, or a different kind of Archive board. Here is an example from Leankit:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-02-28-be-more-predictable/leankit.png"></p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">When Will It Be Done?</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/11/the-kanban-board-is-a-mirror/">The Kanban Board is a Mirror</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/throughput/">Throughput</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Aging Work Items]]></title>
    <link href="http://zsoltfabok.com/blog/2014/02/aging-work-items/"/>
    <updated>2014-02-20T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/02/aging-work-items</id>
    <content type="html"><![CDATA[<p>In my <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput post</a> I was writing about a <em>piled up inventory of work items</em> which is created when the throughput (output) is lower than the demand (input). These work items are visible, they are on the Kanban board, and we call them <strong>aging work items</strong>. I&#8217;m not sure where the name comes from but I think it relates to the fact that these work items are staying longer in the flow (manufacturing of software process) than some others, they are usually stationary, and therefore they start aging. The aging work items are quite dangerous in terms of software development and also in terms of manufacturing.</p>

<!-- more -->


<p>First, they make it really hard to know the real output of a team. If you remember the example from the <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput post</a> after a while the team had so many aging items that they couldn&#8217;t take new work items. Of course, you can throw away aging work items, but these were important once and the team invested time and effort into bringing them to where they are now. Check out the chart on the right. It shows the demand, the throughput, and the actual number of aging items. Without considering aging items we can assume that last week the team&#8217;s throughput was 7 work items, which is true, but they could only finish 5 new work items. If the team decides to take more work items in this condition, their throughput of new work items won&#8217;t change. Every week they will have at least as many aging work items as the week before, their actual speed regarding new work is 5 work items per week, so a growth in demand will only increase the number of aging items. They simply cannot work faster because of them. The solution is counterintuitive. They have to decrease the demand in order to increase throughput. In other words they need to finish the aging work items, or at least lower their number. This will lower their throughput but this throughput won&#8217;t have an invisible component.</p>

<p>Second, if you use velocity or throughput for forecasting, the aging items can make it inaccurate. If you know that you can deliver &#8216;N&#8217; items in &#8216;M&#8217; days/weeks/months you can assume that the <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> of an item is shorter or equal to &#8216;M&#8217;. For example, if you deliver 10 features a month you can assume that you need maximum one month to deliver one feature. If you know about aging work items you know that this assumption may be wrong. If you have at least one aging item among the delivered features, you have one item whose lead time is actually longer than &#8216;M&#8217;. If you draw a distribution chart of lead times (on the right) you can see that there the majority of lead times are shorter than or equal to &#8216;M&#8217;, however there are actually several examples of longer lead times. In <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">the basic forecasting post</a> I mentioned why it is more safe to use the 85%-100% range of the lead time distribution (it is more likely that you&#8217;ll deliver before the longest lead time than at the average or median lead time), and if you work under the assumption above (lead time &lt;= &#8216;M&#8217;) you may fail your commitment. So, if it is possible don&#8217;t use velocity or throughput for forecasting, use <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">lead time distribution</a>.</p>

<p>Let&#8217;s see a real example. This is a throughput diagram of the team:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-02-20-aging-work-items/throughput.png"></p>

<p>And the board:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-02-20-aging-work-items/board.png"></p>

<p>It seems that the team is improving: it outputs more and more work items. However they are in trouble now. Their current throughput is 7 work items a week, but they have 9 work items on their Kanban board. This means that they cannot take more work for at least two weeks until they get rid of all the aging items. The problem is that the team has a deadline in three weeks and their backlog has more than 10 cards.</p>

<p>Aging items aren&#8217;t unique, we all have them and will have in the future. The key is to find them and solve them one by one. An easy way to find them is to check how long the work items have been staying on the Kanban board. You are looking for those items that have been longer on the Kanban board than the length of the release cycle. Look for them at least once a week and talk to your team to figure out what to do with them.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2010/09/ageing-items-on-the-board/">Ageing Items on the Board</a></li><li><a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory/">The Hidden Inventory</a></li><li><a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">When Will It Be Done?</a></li><li><a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/">Visualize the Flow on the Highest Possible Level</a></li><li><a href="http://zsoltfabok.com/blog/2013/08/visualise-and-manage-team-dependency/">Visualize and Manage Team Dependency</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/throughput/">Throughput</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Wrong WIP Limits Will Kill Your Options]]></title>
    <link href="http://zsoltfabok.com/blog/2014/02/wrong-wip-limits-may-kill-your-options/"/>
    <updated>2014-02-10T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/02/wrong-wip-limits-may-kill-your-options</id>
    <content type="html"><![CDATA[<p>At <a href="http://zsoltfabok.com/speaking#lascot2013">Lean Agile Scotland 2013</a> <a href="https://twitter.com/PapaChrisMatts">Chris Matts</a> mentioned that &#8220;the WIP limits kill the options&#8221;. He didn&#8217;t really explain his statement in detail but I had been thinking about it and I dare to say that Chris was half right. He often talks about <a href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/">staff liquidity</a> as well, which tells us how likely our staff will be able to work on a problem or a feature. In this context it means that &#8220;the more liquid our staff&#8221; the more work items we can work on in parallel, which means that we have more options. For example, we have four people in the team, two of them are expert testers, one of them is mediocre, and the last one has no idea about it. We can say that in this team three people can do testing. If this team has a WIP limit below 3, then this limit really kills options by preventing somebody who can do testing from actually doing it.</p>

<!-- more -->


<p>I mentioned that Chris was half right because if there is no limit on WIP <a href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/">the work might not get to the next phase</a>. Imagine that the staff liquidity of the previously mentioned team for deployment is one (say it&#8217;s the member who has no idea about testing). If there is no limit on the testing phase the work can easily pile up there, which creates unnecessary pressure on the team member who does deployment, and the <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> will be unnecessarily long. So the right thing to do is to <strong>set the WIP limits based on the staff liquidity of the team</strong> and <strong>if you need more WIP in a phase, work on the staff liquidity instead</strong>. In real life it means that you train your people and help them grow. If you consider the team above, it is very risky to have only one team member who knows about deployment. Besides the risk of having a bottleneck (WIP limit 1 is a clear bottleneck) in your <a href="http://zsoltfabok.com/blog/tag/flow">flow</a>, this can negatively affect your <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> and <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput</a>. Therefore, it is in your best interest to have a higher WIP limit (more options) in deployment, so either you help your current team members to learn more about deployment, or you hire someone who can do that.</p>

<p>These are equally good choices, and they are better than artificially increasing the WIP limit. Because if you think about it, if you have low staff liquidity then even if you have higher WIP in a particular column (more options - you can see how options and WIP are interchangeable) there won&#8217;t be more persons to do the job, so the work items may stay there idle and the lead time will not change: previously they were idle in the previous phase, now they are idle in this phase. Again, do not set the WIP limit. Use the characteristics of your system (e.g. the staff liquidity) to set them, and if you need higher or lower WIP, change your system accordingly, not your WIP.</p>

<p><strong>Update:</strong> you can read Chris&#8217; response <a href="http://theitriskmanager.wordpress.com/2014/02/11/explicit-wip-limits-destroy-options/">here</a>.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/08/the-problems-of-the-capacity-utilization/">The Problems of the Capacity Utilization</a></li><li><a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">When Will It Be Done?</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/wip-limit-must-match-the-demand/">Does the WIP Limit Have to Match the Demand?</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/throughput/">Throughput</a></li><li><a href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/">One Reason Why WIP limits Matter</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[One Reason Why WIP limits Matter]]></title>
    <link href="http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter/"/>
    <updated>2014-01-30T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/01/why-wip-limits-matter</id>
    <content type="html"><![CDATA[<p>There are different reasons why limiting the work in progress (WIP limit) is a good thing, but now I would like to talk about one special case where <strong>WIP limits are helping move things forward</strong>. Let&#8217;s assume that you have a working <a href="http://zsoltfabok.com/blog/tag/pull-system/">pull system</a> which means that the team members don&#8217;t push the work on others, but others can take the work if they are capable to handle them (I&#8217;m not using the word free on purpose because what if somebody can work on two things in parallel). Check out the following setup. How many pulls do the team have to do in order to get one work item done?</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-12-31-why-wip-limits-matter/no_wip_limits.png"></p>

<!-- more -->


<p>It takes 21 pulls to have one item done: you pull each work item into each phase one by one and when you run out of pulls you start with the next phase. You can see that in this situation that the actual WIP limit always equals to the number of work items in the system. However, if you have WIP limits the situation is different. With the WIP limit of one you need only 5 pulls but you may have idle work items and idle team members. This is not good either.</p>

<p>The solution is <strong>the harmony of the better capability utilisation and the short cycles</strong>. Better capability utilisation doesn&#8217;t mean that you want all the employees to provide 100% all the time (I suggest <a href="http://zsoltfabok.com/blog/2012/08/the-problems-of-the-capacity-utilization/">lower utilisation time</a>), but you want the team members to work where they are the best or where they need to be. Unless, of course, there is a phase where your capability is low. This is where the shorter cycles kick in. In phases where the capability is low, the <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">lead time</a> will be high due to waiting or slow progress, so you may want to reconsider to make people learn new skills, and therefore be able to work in different phases. This will reduce the cycles because the capability will go up in the phase where it was low before, but it will decrease somewhere else because of the capability withdrawal.</p>

<p>In Kanban we use <a href="http://theitriskmanager.wordpress.com/2013/11/24/introducing-staff-liquidity-1-of-n/">Chris Matts&#8217; staff liquidity</a> for capability utilitisation and <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">lead time</a> for <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">checking the size of the cycles</a>. Staff liquidity is actually a matrix which tells us the skill level of team members in the different phases. Here is an example:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-12-31-why-wip-limits-matter/staff_liquidity.png"></p>

<p>As you can see the guy on the top is very good at testing (level 3), however he is not really good at development, but has an idea of how to do it (level 1). Moreover, you can see that there is another team member who is good at testing (level 2) which means that it is safe to say that the WIP limit on testing must be 2. If the limit is lower than 2, there is a chance that one person will be idle. If it is higher than 2, we have the no limit situation again: items won&#8217;t be pulled until the phase is full which actually means that there may be items that waiting more than they have to.</p>

<p>In Kanban we use <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> and <a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">flow efficiency</a> to measure the cycles. Check out this <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">lead time histogram</a>:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-12-31-why-wip-limits-matter/lead_time.png"></p>

<p>And the flow efficiency:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-12-31-why-wip-limits-matter/flow_efficiency.png"></p>

<p>It shows that the team can deliver a work item in 10 days (checkout this <a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">post</a> why), but the flow efficiency (ratio between waiting and working) is 5% which is very low: the work items are in an idle state for 95% of their livecycle which is 9.5 days in this case. So, they should figure out in which phase they are waiting the most; probably where their capability is low. And we ended up at staff liquidity again. This is a nice cycle: lead time -> staff liquidity -> lead time -> staff liquidity etc, which is implemented with WIP limits and <strong>that&#8217;s why WIP limits are important: they are tools of controlling and fine tuning your system</strong>.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/">When Will It Be Done?</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/wip-limit-must-match-the-demand/">Does the WIP Limit Have to Match the Demand?</a></li><li><a href="http://zsoltfabok.com/blog/2012/08/the-problems-of-the-capacity-utilization/">The Problems of the Capacity Utilization</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Purpose of Agile Software Development]]></title>
    <link href="http://zsoltfabok.com/blog/2014/01/the-purpose-of-agile/"/>
    <updated>2014-01-24T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/01/the-purpose-of-agile</id>
    <content type="html"><![CDATA[<p>I often think about the purpose of Agile. It is definitely not to replace the Waterfall development process, or make the life of middle managers even more difficult. I believe it is not about testing more or using new technology either. I see similarities between the purpose of Agile software development and police work. A long time ago, a British police captain said in an interview that <strong>&#8220;the purpose of the police work is preventing crime and not fighting crime&#8221;</strong>. Unfortunately, they spend too much time fighting it, because according him they didn&#8217;t care much about prevention (limited resources, less knowledge etc). &#8220;Preventing crime versus fighting crime&#8221;. For example, if the police knows that there is a certain area that may attract thieves, they can put up warning signs for those who don&#8217;t live there, and by patrolling they can actually discourage thieves to operate in the area. It is cheaper and more effective than to chase thieves and try to find the stolen merchandise. I&#8217;m simplifying the situation, but I think you get the idea. As usual, the metaphor cannot be applied in software development as it is, but if we take the crime out of the previous statement we get &#8220;preventing vs fighting&#8221; and that can be applied in software development.</p>

<!-- more -->


<p>When I don&#8217;t know what to do, or I&#8217;m unsure about the next step, I ask myself the question &#8220;are we preventing something from happening, or are we fighting against something?&#8221; This question helps me orient myself and think about the next move. If the answer is &#8220;fighting&#8221; that is an immediate sign of doing something in the wrong way - not in an Agile way. A good example is the situation when we have to balance between bug fixes and features. This is a classic fighting situation because we are &#8220;fighting&#8221; with the bugs, but we don&#8217;t do anything in order to reduce their numbers. Or, we don&#8217;t know what the next step is, and we call for a planning meeting because that&#8217;s what the book suggests. This is not Agile according to me. We are going with the flow, but with the wrong one, and we don&#8217;t do anything to get out of this flow and make a difference in our lives. We are &#8220;fighting&#8221;.</p>

<p>You can guess where I&#8217;m going with this: <strong>Agile is the prevention of known problems from happening</strong>. This requires us to <strong>know about future problems, and be able to react in time</strong>. Going back to the police metaphor, the policemen really know about future problems but due to high volume in crime and their limited resources they cannot react in time. This is a reason why I think that Waterfall is not a good choice anymore: the model doesn&#8217;t allow us to react faster to known problems. In the beginning of my career I was working in Waterfall, and I enjoyed it. But when we were doing not so good it was always because of the reaction time. We never managed to react to situations in time.</p>

<p>Even if you can react in time, what if your knowledge of future problems is obsolete? Let&#8217;s say you are doing Scrum and you do iteration after iteration, but release to the customer after ten iterations. Are you Agile? I would say no. The iterations help you to react faster but your backlog can be obsolete, so you react to the wrong thing and that is not different from not reacting at all. Translating this to the police metaphor: the thieves found another area, while the police is still putting up warning signs in the old area.</p>

<p>My advice is to ask yourself or your team several times a week: &#8220;are we preventing crime or are we fighting crime&#8221;, and see the answers. If you do all the Agile practices and yet you do more &#8220;fighting&#8221; than &#8220;preventing&#8221;, you are not Agile.</p>

<h4>A related post you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2013/01/parkinsons-law/">Parkinson&#8217;s Law of Triviality</a></li></ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Throughput]]></title>
    <link href="http://zsoltfabok.com/blog/2014/01/throughput/"/>
    <updated>2014-01-16T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/01/throughput</id>
    <content type="html"><![CDATA[<p>When I started to use the Kanban method there were two measures: <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> and throughput. I&#8217;ve already written about lead time in a <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">previous post</a> so let me talk about throughput now: it tells us how many work items we finished in a given time frame. For example, 10 work items a week, or 34 features a year. I had been measuring both for a while but about a year ago I changed my approach regarding throughput. First, it wasn&#8217;t really helpful. <strong>I knew how many work items we did in a week but that didn&#8217;t tell us much about how the team was actually performing.</strong> An increase in throughput doesn&#8217;t necessarily mean that the team is improving (can do more work in the same time frame). It can also mean that they are under lower or no pressure and they can finally finish the work items they piled up in their <a href="http://zsoltfabok.com/blog/tag/inventory">inventory</a>. So, they appear to be performing better, but in fact they aren&#8217;t. Second, the demand in software development is not quantitative like in car manufacturing where throughput originates from. If the market demands 10000 cars a year the factory has to have a throughput that is equal or slightly larger than 10000 cars per year. In software development we have to deliver the feature or the functionality the customer can use, so delivering 100 features doesn&#8217;t make sense to me. So, I decided to call throughput a <em>secondary measure</em> and use it differently than before.</p>

<!-- more -->


<p>I cannot really do anything with my issue of quantitative demand because that is not natural in software development unless you are paid by the number of delivered features. However, <strong>I can use the throughput to see how a team is doing by simply showing the demand (input) next to the throughput (output)</strong>. The demand can come from outside and inside of the team. Outside is when the team gets the work from somebody else, inside is when the team plans the work themselves.</p>

<p><img class="right" src="http://zsoltfabok.com/images/posts/2014-01-16-throughput/throughput.png"></p>

<p>Let&#8217;s take as an example a team planning one week ahead. The chart on the right shows how they are performing week by week. As you can see they finish more and more work items (increase in throughput) week by week but they never manage to satisfy the demand that they are creating themselves by planning. This team needs a break and re-evaluate their planning process. It is clearly visible that they cannot deliver the amount they are planning, and most probably they have a huge internal backlog somewhere where the planned but never delivered work items are staying. What they should do is clean up this inventory and during the next planning session they should stop at the number of cards that equals to the throughput of the previous week. When their throughput exceeds above the demand several times in a row they can change this approach and take more work items, but as soon as the demand exceeds higher than the throughput they should check their planning process again.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory/">The Hidden Inventory</a></li><li><a href="http://zsoltfabok.com/blog/2012/11/liquidity-for-kanban-systems/">Liquidity for Kanban Systems, My First Look</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/wip-limit-must-match-the-demand/">Does the WIP Limit Have to Match the Demand?</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Open Sourcing Emcalc, a Legacy Application]]></title>
    <link href="http://zsoltfabok.com/blog/2014/01/open-sourcing-emcalc/"/>
    <updated>2014-01-09T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2014/01/open-sourcing-emcalc</id>
    <content type="html"><![CDATA[<p>In 2004 my friend asked me to write him an application - called emcalc - that used his results from his thesis work that he can use in his new job. The application was able to tell the gas emission of different boilers that was common in the households in our neighbourhood at that time. I forgot about this application until I found its jar file on an old hard drive. At <a href="http://zsoltfabok.com/speaking#xp2013">xp2013</a> I used a part of this application to show some technique on <a href="https://speakerdeck.com/fabokzs/xp2013-narrow-down-what-to-test">how to test and start to work on legacy code</a>. When <a href="https://twitter.com/emilybache">Emily Bache</a> saw it, she asked me if it was possible to make it open source so that people could practice <a href="https://github.com/ZsoltFabok/emcalc">refactoring</a> on a legacy code that was actually used by people. I talked to my friend and he agreed to make it open source, so here is the <a href="https://github.com/ZsoltFabok/emcalc">repository to emcalc</a> under <a href="https://github.com/ZsoltFabok/emcalc/blob/master/LICENSE.md">the 3-clause BSD license</a>:</p>

<blockquote><p>https://github.com/ZsoltFabok/emcalc</p></blockquote>

<!-- more -->


<p>You should know that I lost the source code so the repository contains the reverse engineered code (I used <a href="http://en.wikipedia.org/wiki/JAD_(JAva_Decompiler)">jad</a>). I&#8217;ll keep the master branch untouched so that you start working on the code right away and changes will go to the <a href="https://github.com/ZsoltFabok/emcalc/tree/work">work</a> branch. There is another catch: the application is in Hungarian and Emily mentioned that it was not important to translate it, because this made the task even more exciting. Nevertheless, here is a quick overview of the interface:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-01-09-emcalc/emcalc.png"></p>

<p>And here is the way of opening new config files that fills out the parameters on the UI:</p>

<p><img class="center" src="http://zsoltfabok.com/images/posts/2014-01-09-emcalc/emcalc2.png"></p>

<p>Example configuration files can be found in the <a href="https://github.com/ZsoltFabok/emcalc/blob/master/data">data</a> folder.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Path Reference in Gemfile]]></title>
    <link href="http://zsoltfabok.com/blog/2013/12/gemfile-path-reference/"/>
    <updated>2013-12-30T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/12/gemfile-path-reference</id>
    <content type="html"><![CDATA[<p><code>Gemfiles</code> (the configuration file for <code>bundler</code>, a dependency manager for <code>ruby</code>) have a nice feature that allows for specifying the location of a dependency:</p>

<figure class='code'><figcaption><span>Gemfile </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>source "https://rubygems.org"
</span><span class='line'> # ...
</span><span class='line'>    # bundler will take the specified version from the source repository:
</span><span class='line'>   gem 'rake', '~> 0.9.2'
</span><span class='line'>
</span><span class='line'>   # bundler takes this gem from the filesystem:
</span><span class='line'>   gem 'mygem', :path => '/Users/home/.../gems/mygem'
</span><span class='line'> # ...</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>When the <code>:path</code> attribute is used, <code>bundler</code> goes to the filesystem and takes the gem from the specified location (without the <code>:path</code> attribute, it goes to the source - in this case <em>https://rubygems.org</em>). If the specified gem doesn&#8217;t have a proper <code>.gemspec</code> file, <code>bundler</code> won&#8217;t download its dependencies, and if you haven&#8217;t downloaded them before, your gem won&#8217;t work.</p>

<p>This a nice feature if you want to check how your gem works with your other gems that depend on it before commit.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/06/ror-migration-status/">Ruby on Rails: Migration Status</a></li><li><a href="http://zsoltfabok.com/blog/2012/07/ror-sandboxed-console/">Ruby on Rails: Sandboxed Console</a></li><li><a href="http://zsoltfabok.com/blog/2013/03/the-empty-else-block/">The Empty Else Block</a></li><li><a href="http://zsoltfabok.com/blog/2013/08/from-cucumber-to-turnip/">Moving From Cucumber to Turnip</a></li></ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Takt Time to Find Problems Earlier]]></title>
    <link href="http://zsoltfabok.com/blog/2013/12/takt-time/"/>
    <updated>2013-12-23T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/12/takt-time</id>
    <content type="html"><![CDATA[<p>The idea of takt time comes from car manufacturing. It shows the elapsed time between two completely assembled cars leaving the factory floor. If the takt time is 2 hours, it means that the factory produces 12 cars a day (24h/2h = 12). With the use of takt time people in car manufacturing can detect problems in production earlier. Let&#8217;s imagine that the factory has to deliver 150 cars in 2 weeks. The measured <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput</a> is 84 cars a week (and the takt time is 2 hours), so the factory can deliver because based on the throughput it will deliver 168 cars until the end of the second week. Changes in the takt time can tell the engineers if they will be able to deliver or not. For example, if the takt time increases to 3 hours at the beginning of the second week, they can assume that they won&#8217;t be able to deliver: they have already produced 84 cars in the first week, but with a takt time of 3 hours they&#8217;ll produce only 56 cars during the second week and that is 140 cars in two weeks. So they have to do something. It is a good and useful measure in car manufacturing, but software development is not car manufacturing.</p>

<!-- more -->


<p>Car manufacturers are producing the same kind of car over and over again, whereas software houses rarely do exactly the same software twice. Even on the smallest possible level there are only similar tasks, but not the same tasks. Moreover, in software development we don&#8217;t have to deliver 10 features in a week (unless the organisational bonus system is based on the number of delivered features), we have to deliver the one feature the customer needs/asked for. Therefore <strong>the takt time in its original form - throughput prediction - is useless in software development</strong>. However, this doesn&#8217;t mean that we cannot have it, but we need to adapt it. <strong>If the takt time - frequency of finishing tasks - drops or increases that is an indicator of <a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development#mura">mura</a></strong> (inconsistency, unevenness or unbalanced demand situations in the system) <strong>or poor planning</strong>. If the takt time is inconsistent or has pikes in your Kanban system that is an indication that something is going on that requires your attention.</p>

<p>When I&#8217;m talking about Kanban and Lean in workshops and talks, I always emphasise that <strong>we shouldn&#8217;t take practices from car manufacturing and apply them unchanged to software development</strong>. Using takt time in its original form would drive us towards increasing the number of completed features and that is very dangerous. I&#8217;m pretty sure that any organisation can increase the number of delivered features (throughput), but delivering the right features is a completely different story. However, finding process issues earlier is a good thing, and takt time is one of the things that can help do that.</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development/">Waste in Software Development</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/wip-limit-must-match-the-demand/">Does the WIP Limit Have to Match the Demand?</a></li><li><a href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/">Flow Efficiency</a></li></ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Flow Efficiency]]></title>
    <link href="http://zsoltfabok.com/blog/2013/12/flow-efficiency/"/>
    <updated>2013-12-15T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/12/flow-efficiency</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://zsoltfabok.com/images/posts/2013-12-15-flow-efficiency/flow_efficiency.png">
Last year in the <a href="https://speakerdeck.com/fabokzs/dare2013-measure-and-manage-flow">Lean Kanban University conference series</a> I was talking about flow efficiency and how we measured and used it with one of my old teams. My friend <a href="https://twitter.com/chrisvmcd">Chris McDermott</a> asked me to write a post about it, so here it comes. Like other metrics such as <a href="http://zsoltfabok.com/blog/tag/cycle-time">cycle time</a>, <a href="http://zsoltfabok.com/blog/2013/12/takt-time/">takt time</a>, and <a href="http://zsoltfabok.com/blog/2014/01/throughput/">throughput</a>, flow efficiency comes from car manufacturing. It shows the time in working time/lead time in progress percentage for a given work item (check out the equation on the right). So a 100% flow efficiency means that the work item is never idle during processing. If a work item was done in 60 minutes and its flow efficiency was 5% means that one worked only 3 minutes on that particular item. In a factory it must be fairly easy to calculate flow efficiency because the flow is semi- or completely automatic, and therefore the machines that move the work items around can log the pickup and delivery times and that makes it easy to calculate the working time itself. In software development such logging would increase the time spent on administrative tasks, and the current electronic Kanban tools don&#8217;t know when a work item is idle or is one is working on it. It is not a lost cause, because we know the overall time we spent on a work item, and we also know the <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a>.</p>

<!-- more -->


<p>With the team I mentioned before, we used a physical Kanban board and <a href="http://redmine.org/">redmine</a> for issue (later work) tracking. At the end of each day we added the spent time to each work item we had been working on. When a work item was done, we&#8217;d get the data out of redmine, get the <a href="http://zsoltfabok.com/blog/2013/07/lead-time/">lead time</a> from the post-it note which after a simple division gives us the flow efficiency of that item. Of course, you don&#8217;t have to use redmine, there are other options as well. You can write spent time on the post-it, or add it into the description of a work item in case you are using an electronic Kanban board. <strong>The goal is to know the time you&#8217;ve actually spent on a work item</strong> (I&#8217;m assuming that you know your lead time).</p>

<p>There was a time when we had a very low flow efficiency: it was around 5% and that was kind of scary and unacceptable. So we did a <a href="http://zsoltfabok.com/blog/tag/retrospective">retrospective</a> where it turned out that our work items were waiting unnecessarily for days in a particular column. After a long discussion, we <a href="http://zsoltfabok.com/blog/2013/11/the-kanban-board-is-a-mirror/">changed our process</a> and introduced a daily deployment to staging (pre-production) reducing the days to maximum one day and that helped us reduce the lead time from 9 days to 5 days. Flow efficiency actually helped us find a flaw in our process.</p>

<p>Flow efficiency is a tricky measure. First, <strong>you cannot determine the desired percentage in advance because it has a certain lag</strong>: you&#8217;ll only know the lead time and working time when you are done with the item. Second, <strong>software development is not car manufacturing</strong>. We don&#8217;t do the same work in the same environment all the time. We have very high uncertainty, options, changes, multitasking and humans in the process. I don&#8217;t want to talk about all these things except multitasking. We see it as a wrong thing, but if you think about it it&#8217;s that something we have that car manufacturers don&#8217;t. In their case if the flow efficiency is low it means that the factory doesn&#8217;t actually do anything. On the other hand, in our world it means that we are working on other things as well. We can actually wait and work on something else, maybe something more important. That is not possible in car manufacturing. Among other things that&#8217;s why <a href="http://djaa.com/">David J. Anderson</a> told us at various conferences that having a flow efficiency above 15% is normal, and above 40% is good.</p>

<p>And third, <strong>the context really matters</strong>. We had 5% which is below normal according to David, but it was fine for us. As far as I remember we were close to the end of that project and what we really needed (as it turned out later) is a lead time that is shorter than a working week (for planning purposes), and we achieved it. Our managers were happy with our results and we had other things to sort out, so we actually never checked flow efficiency again. We learned how to work with lead time instead. But this wouldn&#8217;t have happened without checking out the flow efficiency.</p>

<p>I hope that this post will help you to fine tune your Kanban system and get the flow efficiency from it. Don&#8217;t forget the points I mentioned earlier: collect your spent time, do not aim for a specific flow efficiency number, know the difference between car manufacturing and software development, and know your context. A couple of months ago David wrote a <a href="http://www.djaa.com/low-flow-efficiency-resist-temptation-design-out-waste/">nice post</a> about flow efficiency that can provide you more details. Happy tuning ;-)</p>

<h4>Related posts you may find also interesting:</h4>


<ul><li><a href="http://zsoltfabok.com/blog/2012/05/local-optimization/">When Local Optimization Won&#8217;t Make a Difference</a></li><li><a href="http://zsoltfabok.com/blog/2013/07/lead-time/">The Lead Time Is The Time The Customer Must Wait to Get What She Asked For</a></li><li><a href="http://zsoltfabok.com/blog/2013/11/the-kanban-board-is-a-mirror/">The Kanban Board is a Mirror</a></li></ul>



]]></content>
  </entry>
  
</feed>
