<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Zsolt Fabók]]></title>
  
  <link href="http://zsoltfabok.com/" />
  <updated>2013-05-18T13:53:30+02:00</updated>
  <id>http://zsoltfabok.com/</id>
  <author>
    <name><![CDATA[Zsolt]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/zsoltfabok" /><feedburner:info uri="zsoltfabok" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Context and Perspective is Everything]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/_Y6bTsLkZUI/" />
    <updated>2013-05-14T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2013/05/context-and-perspective</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-05-14-context-and-perspective/cube.png"&gt;
Have a look at that shape. Take your time, there is no need to hurry. Which side of that shape is in the front? Is it the one which top left corner is the as the top left corner of the shape? Or, is it the one, which bottom right corner is the same as the bottom right corner of the shape?&lt;/p&gt;

&lt;p&gt;Did you move your head to see the shape from a different perspective so that you can see the different sides? Did it work? Do you have a more suitable answer now than a minute before? Most probably not, but here is an interesting idea: what if I tell you that the shape is not a cube.&lt;/p&gt;

&lt;p&gt;You were thinking about a cube, weren&amp;#8217;t you? But it can be a two dimensional shape with lines, triangles, rectangles and other shapes. I didn&amp;#8217;t tell you that it was a cube.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;That simple shape - I&amp;#8217;ll call it a shape, because we don&amp;#8217;t know whether it is a cube or not - teaches us an important lesson about context and perspective, how important they are, and how bad we are at interpreting them. They fill in the gap between appearance and meaning.&lt;/p&gt;

&lt;p&gt;The brain is a complex, but efficient organ. It must be efficient, because our life can depend on the speed of the decision making, and we&amp;#8217;d rather make a fast, but wrong decision than a slow, but right. It is the basics of the survival. Or, was for a long time, but nowadays the situation is different: we need to slow down and be effective, and not just efficient.&lt;/p&gt;

&lt;p&gt;So, when you were reading the first paragraph for the first time, in order to be &lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient/"&gt;efficient&lt;/a&gt; you - or more precisely your brain - used a well known context, in which a shape like that was always a cube. Therefore it was a cube. The questions about the sides justified your belief about the &amp;#8220;cubeness&amp;#8221;, the only thing you failed to accomplished is to answer the questions about the sides. The idea that is it not a cube at all, changed this context and now you most probably looked at the picture differently. You needed an external help to see the problem in a different context.&lt;/p&gt;

&lt;p&gt;The changing in perspective didn&amp;#8217;t happen automatically either. Without bringing up the sides the shape was an ordinary cube that orientation didn&amp;#8217;t matter at all. But after the side related questions, it became the most important thing about the cube.&lt;/p&gt;

&lt;p&gt;If you think about the picture, it doesn&amp;#8217;t matter whether it is a shape, a cube or a sheep drawn by a very avant-garde artist, because it is just a picture. However, when you see something on the street or at the workplace and you decide to act the context and perspective does matter. Simply because you&amp;#8217;ll act and the result depends on the amount of information you have.&lt;/p&gt;

&lt;p&gt;Here is an example. Let&amp;#8217;s say that I have to solve a problem at my job, and the fastest way to do it, is to ask for help from a senior co-worker. She says no, and I&amp;#8217;m about to escalate the situation to my boss, because I want my problem to be solved and I don&amp;#8217;t take no for an answer. Is there something missing from this story? Do I know anything about the context and perspective? Not really. What if the senior co-worker has something more important to do? I didn&amp;#8217;t ask her about it. I just assumed that she is there to answer my questions - wrong context. Did I try to understand her point of view? Not really - unknown perspective. Practically, I don&amp;#8217;t know anything, and yet I&amp;#8217;m about to escalate to the boss, because I want my problem solved, but most probably I&amp;#8217;m making a huge mistake.&lt;/p&gt;

&lt;p&gt;Not everything is as simple as the shape that started this article, but the principle it teaches us is general: &lt;strong&gt;context and perspective matters&lt;/strong&gt;. We should slow down and learn as much as possible about the context, and see things from different perspective, because at the first look, the appearance and meaning may differ.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/_Y6bTsLkZUI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/05/context-and-perspective/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[About Flows and Infinite Queues]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/yY6ACYxXsMg/" />
    <updated>2013-04-30T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2013/04/infinite-queue</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-04-30-infinite-queue/infinite_queue.png"&gt;
An infinite queue is a column on the Kanban board somewhere between the &lt;em&gt;Queue&lt;/em&gt; and &lt;em&gt;Live&lt;/em&gt; columns, one that doesn&amp;#8217;t have a WIP limit and into which one can put many work items as one wants. A column without a WIP limit sounds like a bad practice, because if there is no WIP limit what will ensure that the work items are moving - being pulled - forward? Nothing really, so having infinite queues may not be a good idea after all. However, there are situations when we need them, &lt;strong&gt;because they have an important purpose: they connect &lt;a href="http://zsoltfabok.com/blog/tag/flow/"&gt;flows&lt;/a&gt;&lt;/strong&gt;. It was said before that an infinite queue cuts the flow into two pieces, but I argue that it connects the two pieces rather than cuts them.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;Wait a minute. Until now in the previous &lt;a href="http://zsoltfabok.com/blog/tag/kanban/"&gt;kanban related posts&lt;/a&gt;, I have been talking about the flow (singular), and now I&amp;#8217;m talking about flows (plural). What has changed? Nothing has changed, but until now, I&amp;#8217;ve been talking about &lt;a href="http://zsoltfabok.com/blog/tag/flow/"&gt;the flow on the meta level&lt;/a&gt; - it was easier, don&amp;#8217;t hold it against me -, however that meta flow may consist of other sub-flows. It is not ideal, but this is how it is in the real world. &lt;strong&gt;One goal of the Kanban method is to find these sub-flows, merge them, and then &lt;a href="http://zsoltfabok.com/blog/2011/05/kanban-on-organisational-level/"&gt;optimize the whole&lt;/a&gt; by using incremental and evolutionary change.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is easy to find the contact point of two flows. &lt;strong&gt;The first contact point is where the work items are handed over.&lt;/strong&gt; Do you remember the times when the developers had to hand over the features to the test team so that they could do the testing? Of course you do. In this case we were talking about the development flow and the test flow. We don&amp;#8217;t talk about handovers between developers and testers any more, but this doesn&amp;#8217;t mean that we don&amp;#8217;t have this phenomenon: we still hand over work between departments within an organisation. The problem is that the work items tend to disappear during these handovers. Actually, they don&amp;#8217;t disappear, they end up in a &lt;strong&gt;&lt;a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory/"&gt;hidden inventory&lt;/a&gt;, which is actually an invisible infinite queue&lt;/strong&gt;. In this case, the first step is to make that queue (inventory) visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second contact point is where the expectations are changing.&lt;/strong&gt; For example, most of the teams I know are expected to deliver features continuously, but the customers or release managers expect the deliveries to happen on demand or periodically. In this case we are talking about the development flow and deployment flow. This setup is common in the software domain, for example one can observe the same phenomenon between design and development. In both cases the queue is visible, which is good, but the problem of how the work items are getting out it is still unsolved.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-04-30-infinite-queue/changing_wip.png"&gt;
The ultimate and best solution is to introduce the WIP limit, because it makes sure that the work items are moving forward (it is not that simple, but good enough for now). However, it is a large step (&lt;a href="http://zsoltfabok.com/blog/tag/kaikaku/"&gt;kaikaku&lt;/a&gt;) and we believe in small continuous - evolutionary - steps (&lt;a href="http://zsoltfabok.com/blog/tag/kaizen/"&gt;kaizen&lt;/a&gt;). One can ask &lt;em&gt;&amp;#8220;why is the WIP limit a large step in the context of infinite queues?&amp;#8221;&lt;/em&gt; Before answering the question, let me share a story with you. Quite recently, we had a WIP limit of 2 on our deploy column, but our process didn&amp;#8217;t allow us to deploy continuously, so we had to wait until it was allowed. Because of the WIP limit the work stopped after several days, which we couldn&amp;#8217;t afford, so we increased the WIP limit. We could increase the WIP limit every day until the date of the deploy, so having it became pointless, and eventually we removed it from the column completely. Our deploy column became a visible infinite queue. The mistake we made was that we applied a WIP limit on a flow that we didn&amp;#8217;t fully understand and wasn&amp;#8217;t under our control. The conclusion here is that &lt;strong&gt;one cannot control (set a WIP limit on) something that one doesn&amp;#8217;t understand and has no control over&lt;/strong&gt;. Answering the question above: understanding and controlling the flow is clearly not a small step, therefore we cannot use it in this context.&lt;/p&gt;

&lt;p&gt;We know so far that an infinite queue doesn&amp;#8217;t have a WIP limit, so it is not clear what is actually going to happen to the work items in there and how they are getting out. If the flows have different owners, the absence of the WIP limit is not a big problem: the work must come from somewhere so the people working with the next flow pull from it. The work flows, but there is some &lt;a href="http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety/"&gt;uncertainty&lt;/a&gt; concerning relevance, importance and effectiveness. On the other hand, when the two flows have the same owner, the work can actually stop. It is a counter-intuitive statement, but think about it. Developers love to develop code, and they feed the work items into the limitless infinite queue of deployment, but they don&amp;#8217;t bother emptying it, so the work items are staying in a &amp;#8220;ready to deploy&amp;#8221; state until somebody tells them to do the deployment and empty the queue.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-04-30-infinite-queue/date_as_wip.png"&gt;
If the WIP limit isn&amp;#8217;t the best choice to get work items out of the infinite queue, what is? For example, we can use the 4th practice of the Kanban method: &lt;strong&gt;make process policies explicit&lt;/strong&gt;. If you think about it, it can solve both situations from above. &lt;strong&gt;It is more &lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient/"&gt;effective&lt;/a&gt; to set a policy than a hard limit.&lt;/strong&gt; Let&amp;#8217;s say that the policy states that the queue must be inspected once a month or emptied every two weeks. Sure, these policies are less strict, but in contrast to the WIP limit, they are achievable, and more importantly, they can be improved step by step. Don&amp;#8217;t forget that we are in the context of infinite queues - at the connection point of two different flows -, and we have to understand this context step by step (kaizen over kaikaku). So, for example, now we empty the deploy column every two weeks, and when we know more about the process, we&amp;#8217;ll improve it, and we&amp;#8217;ll use a one week policy.&lt;/p&gt;

&lt;p&gt;This is exactly what we did with our deploy column if you still remember the example from above. We have a date instead of the WIP limit and we empty the column (the infinite queue) on the specified day (see the image above). We agreed that next time we&amp;#8217;d have a closer date and when we have full understanding and control over the two flows (development and deployment) we&amp;#8217;d re-introduce the WIP limit, and that time it would work properly. As you can see the infinite queue is actually helping us understand our process and get control over our flow. And that feels good.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2011/05/kanban-on-organisational-level/"&gt;Kanban on Organisational Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory/"&gt;The Hidden Inventory&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/"&gt;See the Whole Flow - An Exercise for Managers to Start a Transition&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/05/local-optimization/"&gt;When Local Optimization Won&amp;#8217;t Make a Difference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety/"&gt;Only Variety Can Absorb Variety&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/yY6ACYxXsMg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/04/infinite-queue/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Public Speaking Events in Spring]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/pDFzV5aQE2g/" />
    <updated>2013-03-31T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/03/public-speaking-events-in-spring</id>
    <content type="html">&lt;p&gt;I&amp;#8217;m going to speak at two conferences this spring: on the 10th and 11st of April at &lt;a href="http://accu.org/index.php/conferences/accu_conference_2013/accu2013_schedule"&gt;ACCU 2013&lt;/a&gt; and on the 15th of April at &lt;a href="http://aceconf.com/"&gt;ACE! 2013&lt;/a&gt;. At &lt;em&gt;ACCU&lt;/em&gt;, I&amp;#8217;m going to talk about &lt;strong&gt;how to narrow down what to test&lt;/strong&gt; and &lt;strong&gt;how to measure and manage flow&lt;/strong&gt;:&lt;/p&gt;

&lt;!-- more --&gt;




&lt;div style="overflow:hidden;margin:0 auto 30px auto;width:650px;"&gt;
&lt;div style="width:300px;margin-right:30px;float:left"&gt;
&lt;script async class="speakerdeck-embed" data-id="fcdea310856f0130166c1231381d854a" data-ratio="1.33333333333333" src="http://zsoltfabok.com//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;div style="width:300px;overflow:hidden;"&gt;
&lt;script async class="speakerdeck-embed" data-id="20eff97085720130272922000a1f8622" data-ratio="1.33333333333333" src="http://zsoltfabok.com//speakerdeck.com/assets/embed.js"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I&amp;#8217;ve already given these talks at various conferences like Agile Cambridge 2012 (&lt;a href="http://www.infoq.com/presentations/select-code-test"&gt;video on infoq&lt;/a&gt;), Software Passion Summit 2012, Lean Agile Scotland 2012 (&lt;a href="http://vimeo.com/54441627"&gt;video on vimeo&lt;/a&gt;), and Lean Kanban France 2012, but as always I&amp;#8217;m preparing an updated version of these talks.&lt;/p&gt;

&lt;p&gt;At ACE!, I&amp;#8217;m given a new talk about &lt;strong&gt;social sicenses and the difference one can make by applying them at the workplace.&lt;/strong&gt; Until I&amp;#8217;m finished with the screenplay and slides of the talk, here is the abstact:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The pure intention of this talk is to introduce interesting phenomena and fascinating experiments from the social sciences to the audience. These experiments have been around for a while, but we rarely apply their findings in our life. The talk won&amp;#8217;t just explain a phenomenon like the &amp;#8220;Learned Helplessness&amp;#8221; or an experiment like the &amp;#8220;Hawthorne experiment&amp;#8221;, but will show how to use its findings for your benefit.&lt;/p&gt;

&lt;p&gt;Being aware of the state of our minds and our environment is very important not only for Agile teams, but for any team. Let&amp;#8217;s say that you have made up your mind about what you are going to do and are about to execute your plan. There may be several courses of action for you to take at this point, and in my experience the best way is to examine the situation, look for social science studies that match the problem at hand, pick one, and carefully apply its recommendations. The more studies and experiments you know the better your chances are to pick the right one, and make a positive difference.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I&amp;#8217;ve also got accepted to &lt;a href="http://xp2013.org"&gt;XP2013&lt;/a&gt;, but the organisers have offered some unexpected and unusal speaker deal that made me considering to revoke my proposals. But this topic is still under discussion, so there is a chance that I&amp;#8217;ll be there.&lt;/p&gt;

&lt;p&gt;See you there!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/pDFzV5aQE2g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/03/public-speaking-events-in-spring/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The Empty Else Block]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/UzZNEAoF77U/" />
    <updated>2013-03-27T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/03/the-empty-else-block</id>
    <content type="html">&lt;p&gt;I was adding a new functionality to one of my applications when I realised that I wrote this piece of code:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;condition2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# do what is necessary&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# I don&amp;#39;t if when this will happen and what to do&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;# send me a mail anyway&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;!-- more --&gt;


&lt;p&gt;I had no idea if that &lt;code&gt;else&lt;/code&gt; block was going to be executed, and if yes, how often, or what to do if it happened. So I left it empty and let the application send me an email in case it is reached. If the number of emails is starting to be annoying, I&amp;#8217;ll figure out what to do with it. This is something &lt;strong&gt;real options&lt;/strong&gt; and  &lt;strong&gt;validated learning from lean startup&lt;/strong&gt; taught me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Real options&lt;/em&gt; suggests not to commit to anything until I don&amp;#8217;t have all the relevant information and I actually have to commit to do something. If I don&amp;#8217;t know what shall be in that &lt;code&gt;else&lt;/code&gt; block, I won&amp;#8217;t put anything there. However, I have to know if that &lt;code&gt;else&lt;/code&gt; block covers an (important) use case. So I had to learn somehow if the users wanted to use that block. This approach comes from &lt;em&gt;lean startup&lt;/em&gt;. It&amp;#8217;s been days since the application has been running and I only received a single email. It seems that I have to start thinking about that block, because a use case has been executed which I don’t fully understand at the moment. Nevertheless I&amp;#8217;m happy, because instead of releasing something I have no idea about, I&amp;#8217;ve learned that it is used, and now I have to figure out how exactly.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/UzZNEAoF77U" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/03/the-empty-else-block/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The Optimal Batch Size]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/zIjBWjxYJms/" />
    <updated>2013-03-24T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/03/the-optimal-batch-size</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-03-23-optimal-batch-size/u_curve.png"&gt;
If you have read the &lt;a href="http://zsoltfabok.com/blog/2013/03/coin-game"&gt;coin game post&lt;/a&gt; (in case you haven&amp;#8217;t, click &lt;a href="http://zsoltfabok.com/blog/2013/03/coin-game"&gt;here&lt;/a&gt;, read it - it is a quick and good read by the way -, and come back), you may wonder why the batch size of 6 produced the shortest completion time in the example game. Let&amp;#8217;s find out. If we have a look at the flow of the game, we can find two major components: turning over the coins and moving them around (transfer). If you think about it, the time the players need to turn over all the coins is almost the same in each round. This action is so simple and we get so used to it that improving it during the game - in the given time frame - is nearly impossible. So, it is safe to state that the time spent on this component is constant during the game. However, if it is the case that the group finishes one round in 1 minute and 10 seconds, and another in 1 minute and 40 seconds, &lt;strong&gt;the variable must be the other component, which is the transfer time&lt;/strong&gt;. It seems that &lt;strong&gt;there is a connection between the batch size and the time we need to move the batches around&lt;/strong&gt;. Fortunately, &lt;a href="http://www.reinertsenassociates.com/"&gt;Donald G. Reinertsen&lt;/a&gt; can explain this connection, and show us why the batch size of 6 produced the shortest transfer time and not 1 or 50.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-03-23-optimal-batch-size/the-principles-of-product-development-flow.png"&gt;
He explains this phenomenon in his book &lt;a href="http://amzn.to/ZkW6xr"&gt;The Principles of Product Development Flow&lt;/a&gt; with the &lt;em&gt;U-Curve&lt;/em&gt;, but before getting into that, let me go back to the analysis of the turnover time and transfer time components for a while. If you have a bit closer look at the flow of the game, you&amp;#8217;ll see three important things, not just two: the time required to turn over the coins, the time required to move the coins (both unturned and overturned), and the time a coin needs to go through all the players (lead time). I&amp;#8217;ve already talked about the &lt;em&gt;turnover part&lt;/em&gt;, so let&amp;#8217;s focus on the other two. Similarly to the turnover action, I don&amp;#8217;t see if one can improve the moving action significantly during the game. It is a simple straightforward thing: pick up the coins, push them or pull them. That is it. However, the batch size determines how often one should perform this action and that is not constant at all. The effort of picking and moving the coins multiplied by the frequency gives the &lt;strong&gt;transaction cost&lt;/strong&gt; that actually depends on the size of the batch.&lt;/p&gt;

&lt;p&gt;The last thing is the lead time. It has two parts: a turnover part and a waiting part. Let&amp;#8217;s say that a player is turning over one coin and has one coin waiting. A coin is said to be waiting when the player is in possession that coin, but is turning over other coins. The wait can happen after the turnover or before depending on the group&amp;#8217;s strategy (pull or push). The longer the waiting time, the longer the lead time. The connection between the size of the batch and the waiting time is linear: for a batch size of 10 the next batch has to wait 10 times as long as the time a player needs to turn over a coin. For a batch size of 5, it is only 5 times as long. This waiting has a certain cost to the group - longer overall completion time - , and it is called &lt;a href="http://zsoltfabok.com/blog/tag/inventory"&gt;inventory&lt;/a&gt; or &lt;strong&gt;holding cost&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-03-23-optimal-batch-size/optimal_batch_size.png"&gt;
Don Reinertsen&amp;#8217;s genius was to realize that there was a connection between the transaction and holding costs. Have a look at the diagram on the right. You can see how the transaction cost changes by the size of the batch. The more items I &lt;em&gt;transfer&lt;/em&gt; at once the lower the overall transaction cost is. On the other hand, the more items I have in a batch the larger my inventories are, which increases the holding cost. &lt;strong&gt;The optimal batch size is at the minimum of the aggregation of transformation and holding costs.&lt;/strong&gt; The aggregated values form a kind of &lt;em&gt;U-shape&lt;/em&gt;, hence the name: &lt;em&gt;U-Curve optimisation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here is an example: let&amp;#8217;s say I&amp;#8217;m using wood for heating my house. If I buy all the wood at once for the whole heating season, my transaction cost will be low, because I have to pay the cost of the fuel and time only once, but I&amp;#8217;ll need a place where I can store that huge amount of wood. So I have to build and maintain a storage shed, therefore the holding cost will be high. On the other hand, if I&amp;#8217;m taking as much wood as I can use - let&amp;#8217;s say - in two days, the holding costs are going to be low, but the transaction costs manifested in fuel and time are going be high. In order to reduce cost I have to find the optimal batch size. There is an important lesson here: &lt;strong&gt;the smallest batch size is not always the best batch size&lt;/strong&gt;. &lt;strong&gt;We tend to forget about the transaction and holding costs, but it can hurt our business&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s get back to the coin game. Unfortunately, I don&amp;#8217;t recall all the details about the example game, and therefore I&amp;#8217;m unable to show you how to calculate the optimal batch size for that particular game, but here is another example:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2013-03-23-optimal-batch-size/example.png"&gt;&lt;/p&gt;

&lt;p&gt;The calculation is not that straightforward in software development, but remember: the group that played the coin came had no idea about the optimal batch size concept, and still managed to find it by &lt;strong&gt;experimenting&lt;/strong&gt;. Nevertheless, the idea that &lt;strong&gt;the transformation and holding costs can help you find the optimal batch size&lt;/strong&gt; is extremely helpful. For example: the smaller the batches, the more frequently you have to run your test cases, but you have to do less merging: high transaction cost, low holding cost. While increasing the batch size the test running time decreases, but the merge time increases. The task is given: find the batch size that produces the optimal test running and merging times.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2011/09/expand-and-collapse-got-beaten/"&gt;When Expand and Collapse Got Beaten&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development/"&gt;Waste in Software Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2013/03/coin-game/"&gt;The Coin Game&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/zIjBWjxYJms" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/03/the-optimal-batch-size/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The Coin Game]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/OQRnHserBPs/" />
    <updated>2013-03-15T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/03/coin-game</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-03-15-coin-game/coins.jpg"&gt;
Today&amp;#8217;s post is about the &lt;strong&gt;Coin Game&lt;/strong&gt;. It is a repetitive group game in which the players have to move a heap of coins from one part of the table to another by passing the coins to each other. Additionally, when a player receives a coin, she has to turn it over once. The aim of the game is to have the coins lay heads up after the last player has finished. Each round starts with a quick discussion about the group&amp;#8217;s strategy: how many coins can be passed at once (batching), how many coins can be at a player at a time (WIP and inventory handling), and whether the players give the coins to the next player (push system), or the next player has to take it (pull system). They measure the time they need to move the coins and the game ends when the group finds the best strategy which leads to the shortest completion time. This game is really great to highlight the benefits of the &lt;a href="http://zsoltfabok.com/blog/tag/pull_system"&gt;pull system&lt;/a&gt; and to allow participants to practice the deliberate and data based &lt;a href="http://zsoltfabok.com/blog/tag/batch_size"&gt;batch size&lt;/a&gt; setting and &lt;a href="http://zsoltfabok.com/blog/tag/inventory"&gt;inventory&lt;/a&gt; handling.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;The game starts with the setup: the players sit or stand around a table and lay a certain amount of coins on the table to the right side of one of the players. Some of the coins lay heads up, others tails up. The game goes clockwise: the coins arrive at a player from her right and leave at her left side. The newly arrived coins are at the right side, the middle is the &lt;em&gt;working area&lt;/em&gt; where the player turns over the coins, and the left side is where the &lt;em&gt;overturned&lt;/em&gt; coins are kept. These are the inventories of a player. If the group is using a &lt;em&gt;push strategy&lt;/em&gt;, the player puts the &lt;em&gt;overturned&lt;/em&gt; coins into the right inventory of the next player, in case of a &lt;em&gt;pull strategy&lt;/em&gt;, the player takes the coins from the left inventory of the previous player. All the coins in an inventory should face the same direction. If this is not the case, the player must throw back the coins to the right inventory of the previous player.&lt;/p&gt;

&lt;p&gt;The role of the first player is special. The coins in her right inventory aren&amp;#8217;t facing the same direction, so she won&amp;#8217;t turn over each coin, however she should figure out which direction the coins should face in her left inventory so that they will face heads up in the left inventory of the last player.&lt;/p&gt;

&lt;p&gt;We played the coin game at the &lt;a href="http://www.meetup.com/Bp-Lean-and-Kanban-Meetup/"&gt;first event&lt;/a&gt; of the Budapest Lean and Kanban Meetup (now &lt;a href="http://limitedwipsociety.hu"&gt;limitedwipsociety.hu&lt;/a&gt;). The first round started rather quickly and the group decided to move all the pieces together. Their lead time was 2 minutes and 40 seconds. The group wasn&amp;#8217;t satisfied with this result and had a long discussion about what went wrong. They learned that while one station was very busy - especially the last one - the rest of the group was idle, and that put &lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development#mura"&gt;too much pressure&lt;/a&gt; (mura) on that specific station, and errors were made: not all the coins were flipped and they had to be moved back. So they realised that they needed a different batch size.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://zsoltfabok.com/images/posts/2013-03-15-coin-game/playing_the_game.jpg"&gt;
The conclusion was a bit surprising, because most of the groups would have chosen 1 as the batch size, but this group chose 2. The result spoke for itself: 1 minute and 26 seconds. The group got more engaged in the game, and started experimenting with different batch sizes. The next candidate was 6 (unfortunately I don&amp;#8217;t recall why). With this setting the lead time was a surprising 1 minute and 10 seconds. &lt;strong&gt;It was interesting that a larger batch size actually decreased the lead time&lt;/strong&gt;. One of the group members argued that the batch size had less effect on the lead time. According to him, the group learned how to play the game and gained more experience, and that was the reason of the shorter lead time.&lt;/p&gt;

&lt;p&gt; In order to validate his hypothesis, the team did another two rounds with the same batch size of 6 and with a batch size of 1. In the first case the lead time was almost the same as in the previous round - 1 minute and 11 seconds -, however, with a batch size of 1 it was 1 minute and 40 seconds. The hypothesis had been refuted: regardless of the batch size more experience should have decreased the lead time which didn&amp;#8217;t happen. That member accepted the fact that the batch size matters more than the experience. It seems that &lt;strong&gt;data can really change opinions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I can only recommend this game, because it is fast and it teaches &lt;strong&gt;the basics of the Kanban method: the pull system, the batch and inventory handling, and improving the flow with continuous improvements and experiments&lt;/strong&gt;. You can see from the example above that a round was quite quick and the discussion about the next strategy was never longer than 5 minutes. Of course the game is an excellent opportunity to learn how to handle WIP limits and inventories. If you would like to do that, just add a constraint to the game: the size of the batch must be 1. Happy gaming!&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/"&gt;Visualize the Flow on the Highest Possible Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development/"&gt;Waste in Software Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/08/the-problems-of-the-capacity-utilization/"&gt;The Problems of the Capacity Utilization&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/OQRnHserBPs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/03/coin-game/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[When Will It Be Done?]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/xWJXt8L_85I/" />
    <updated>2013-02-28T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/02/when-will-it-be-done</id>
    <content type="html">&lt;p&gt;I recently had to have my watch repaired. I brought it to the watch shop where it turned out that it could not be fixed, because a main part needed to be completely replaced, but they didn&amp;#8217;t have any spare parts. The lady behind the counter told me that she had no idea how much time it would take to get it. It could be one week, two weeks, one month or even two months. She told me that she would give me a call when it was there. I got upset: how hard could it be to know the time they needed to bring something from A to B? Most probably they had ordered something similar before. I didn&amp;#8217;t want to make a scene, so I let it go and asked her to order the spare part.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-02-28-when-will-it-be-done/lead_time_distribution_small.png"&gt;
 After one and a half months, she finally called me, and when I was in the shop, the watchmaker told me that he would need 20 minutes to change the broken part with the ordered one. I was happier than the last time I was there, but he told me his estimation rather promptly and it was too accurate, so I got suspicious. I was watching him the whole time - so he couldn&amp;#8217;t cheat -, and he did it in 19 minutes, so it was a good estimate. How was he able to do this? I didn&amp;#8217;t know, so I asked him. He said that he had done this kind of task before, he had known all the possible problems, and in the worst case scenario he would have needed about 20 minutes. That&amp;#8217;s something I&amp;#8217;ve seen before. &lt;strong&gt;This is exactly what we do with our lead time distribution diagrams&lt;/strong&gt;. So there are people out there outside of my domain using the same technique effectively - without the fancy tools we like to use.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;I brought up this story, because last week I read &lt;a href="http://morgsterious.wordpress.com/"&gt;Morgan Ahlström&lt;/a&gt;&amp;#8217;s post titled &lt;em&gt;&lt;a href="http://morgsterious.wordpress.com/2013/02/15/why-your-estimates-dont-matter/"&gt;Why my estimates don&amp;#8217;t matter&lt;/a&gt;&lt;/em&gt;, where he concluded:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&amp;#8230;So if predictability is what you&amp;#8217;re looking for, don&amp;#8217;t invest much in your estimates, instead you should make sure that your capacity is known and that quality (internal as well as external) is well understood. And that&amp;#8217;s why your estimates don&amp;#8217;t really matter.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If one is a service provider that might be true, but in most cases we work for somebody else, and &lt;strong&gt;that person, who is on the other side of the &lt;a href="http://zsoltfabok.com/blog/tag/flow"&gt;flow&lt;/a&gt;, wants to know when the work will be done&lt;/strong&gt;. If I don&amp;#8217;t or cannot tell her, I won&amp;#8217;t get the job. She is not interested in my capacity planning or internal issues, she is not interested in half results or iterations, she wants to know when I can deliver the &lt;em&gt;whole&lt;/em&gt; package. So people (like myself in the watch shop) want to know when they can get what they asked for, regardless of the reason why they need to know it. Therefore we cannot just stop doing estimations, because we think that they don&amp;#8217;t matter. It matters to somebody, and &lt;strong&gt;it is part of the job to provide them accurately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I assume that Morgan meant &lt;em&gt;guessing&lt;/em&gt; instead of estimation. If this assumption is true, then he is right. &lt;strong&gt;What doesn&amp;#8217;t matter is the guessing work that we tend to do under the name of estimation&lt;/strong&gt;, because it is inaccurate. The watchmaker from my story didn&amp;#8217;t guess. He used his current knowledge and his past experience to give me a rather accurate estimation.&lt;/p&gt;

&lt;p&gt;There can be several explanations why we&amp;#8217;re guessing instead of using our past experiences. Most of the cases, the &lt;em&gt;&amp;#8220;past experiences&amp;#8221;&lt;/em&gt; simply don&amp;#8217;t exist. Nobody collects them properly - or at all -, therefore people try to remember them, but unfortunately they all remember differently. After a long discussion they can find something that they remember similarly, but it seems so small, irrelevant, or useless that the guessing seems to be a better alternative.&lt;/p&gt;

&lt;p&gt;So, if we collect data about the past, we&amp;#8217;ll be able to provide better estimations. The best way I know to do this starts with the creation of the &lt;strong&gt;lead time distribution&lt;/strong&gt; diagram:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2013-02-28-when-will-it-be-done/lead_time_distribution_1.png"&gt;&lt;/p&gt;

&lt;p&gt;The diagram above shows the number of finished work items (the height of the bars) with their lead times. The rightmost lead time is the best estimate for your upcoming work items based on the &lt;em&gt;&amp;#8220;past experiences&amp;#8221;&lt;/em&gt;. Based on the diagram above, you can decide to go with 2 days lead time, because in most of the cases the work has been done in 2 days. However, the evidence shows that there were work items with longer lead times, so taking 2 has higher risk in being late than the rightmost 16. So if you don’t want to be late, it is wise to give that time as an estimation or prediction. Sometimes that time seems unrealistic so you&amp;#8217;d rather pick the second from the right. Before doing this, consider that &lt;strong&gt;this kind of data has an expiration date&lt;/strong&gt;. The more you learn about a domain and about the technology, the less time you&amp;#8217;ll need to finish. So instead of taking the second column from the right, filter out the old data from your diagram and take the rightmost column.&lt;/p&gt;

&lt;p&gt;Filtering can also be applied when you are looking for the lead time for a specific kind of work item. If you know that the work item is similar to a group of already finished work items, you don&amp;#8217;t have to work with a global distribution diagram. Simply filter out everything else and you&amp;#8217;ll see the lead time distribution for that specific group:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2013-02-28-when-will-it-be-done/lead_time_distribution_2.png"&gt;&lt;/p&gt;

&lt;p&gt;The planning meetings with my previous team took only minutes, because we were looking for these specific groups. When a new work item arrived at the horizon, we figured out which group it belonged to, and took the lead time distribution diagram of that group and picked the rightmost lead time. In order to keep our predictions accurate, in every two weeks we filtered out the old data. There was no guessing, no lengthy and exhausting planning meetings. It was highly &lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient"&gt;efficient&lt;/a&gt;. If you want to learn more about our approach, have a look at the talk I gave at &lt;a href="http://zsoltfabok.com/speaking#lascot2012"&gt;Lean Agile Scotland in 2012&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2011/05/kanban-on-organisational-level/"&gt;Kanban on Organisational Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/"&gt;Visualize the Flow on the Highest Possible Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/05/local-optimization/"&gt;When Local Optimization Won&amp;#8217;t Make a Difference&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/xWJXt8L_85I" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/02/when-will-it-be-done/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Be Aware of the Three Columns]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/tk-ZAZWheu8/" />
    <updated>2013-02-26T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/02/three-columns</id>
    <content type="html">&lt;p&gt;You most probably have seen the simplest Kanban board with three columns: &lt;em&gt;New&lt;/em&gt;, &lt;em&gt;Ongoing&lt;/em&gt; and &lt;em&gt;Done&lt;/em&gt;. This setup is great for learning most of the basics of the Kanban method. I overheard someone saying that this setup was also great for teams to start their transformation using the Kanban method. Personally, I see this approach as a mistake. Although I believe that &lt;em&gt;&amp;#8220;learning on the job&amp;#8221;&lt;/em&gt; is one of the best ways to learn more about a domain, I see the Kanban board as an exception.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;Contrary to the popular belief, &lt;strong&gt;the Kanban board is for identifying areas of improvement and not for reporting status&lt;/strong&gt;. In this context, the &lt;em&gt;three columns&lt;/em&gt; can tell you only two things: the amount of work remaining, and the amount of work the team is doing at the moment. The first one holds some information, but the second doesn&amp;#8217;t, so if you would like to know more - for example where the &lt;a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory"&gt;hidden inventories&lt;/a&gt; are -, you&amp;#8217;ll eventually break down the &lt;em&gt;Ongoing&lt;/em&gt; column into more columns, but by then you&amp;#8217;ll have wasted a lot of time with the three columns and didn&amp;#8217;t learn too much about the Kanban method, or your process.&lt;/p&gt;

&lt;p&gt;There are two ways to figure out what kind of columns your organisation needs. The first one starts with &lt;a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/"&gt;value stream mapping&lt;/a&gt; in order to have a proper understanding of the flow:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-04-17-see-the-whole-flow-exercise/third_task.png"&gt;&lt;/p&gt;

&lt;p&gt;The image above shows the result of the &lt;em&gt;value stream mapping&lt;/em&gt;, and how it is turned into columns. Using those columns will show you precisely where your problems are, there is no need for further breakdown. By using this method you&amp;#8217;ll also know more about your process. Not like with the &lt;em&gt;three columns&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The second way puts emphasis on the &lt;strong&gt;wanted position&lt;/strong&gt;. When you draw your columns &lt;strong&gt;you don&amp;#8217;t care much about where you are, but where you want to be&lt;/strong&gt;. For example, you want to introduce testing in your organisation: you add a &lt;em&gt;Testing&lt;/em&gt; column to your Kanban board to the place where you want it to be, and try to figure out a way to get your work items there. The risk here is quite obvious: you must be 100% sure about your wanted position. Otherwise, you are wasting money, time and resources. However, if you are sure, the change and learning happen faster than with the first approach.&lt;/p&gt;

&lt;p&gt;When you are about to use only the three mentioned columns - and you are not about to start with Personal Kanban -, I&amp;#8217;m asking you to stop and consider my arguments from above. &lt;strong&gt;The whole point of the Kanban method is to improve your process and in order to do so you have to know it from the beginning&lt;/strong&gt;. The &lt;em&gt;three columns&lt;/em&gt; don&amp;#8217;t provide too much information about it. They are excellent for learning, something like the training wheels on a bicycle. They are important to learn how to ride a bicycle, but no one enters the traffic with them, because it is hard and unsafe to use them there. Think about it and share your view in the comment section.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory/"&gt;The Hidden Inventory&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/"&gt;See the Whole Flow - An Exercise for Managers to Start a Transition&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/tk-ZAZWheu8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/02/three-columns/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Parkinson's Law of Triviality]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/gKj9hu_2wuA/" />
    <updated>2013-01-25T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/01/parkinsons-law</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-01-25-parkinsons-law/book_cover.jpg"&gt;
The famous Juan Manuel Fangio had a very good year in 1957, because he won the Formula One Championship, which was his 5th win - the 4th in a row -, and with the age of 46 he became the oldest world champion. This is really impressive, however, 1957 was also the year when &lt;a href="http://en.wikipedia.org/wiki/C._Northcote_Parkinson"&gt;C. Northcote Parkinson&lt;/a&gt;, a British naval historian wrote a masterpiece about how organizations in his age were operating. In his book, &lt;a href="http://www.amazon.com/Parkinsons-Law-C-Northcote-Parkinson/dp/1568490151/ref=sr_1_1?ie=UTF8&amp;amp;qid=1358799355&amp;amp;sr=8-1&amp;amp;keywords=parkinson%27s+law"&gt;Parkinson&amp;#8217;s Law&lt;/a&gt;, he caricatures bureaucracy and how decisions were made in the public sector at that time. It is one of the best books I&amp;#8217;ve ever read, but it is also one of the books that scares me the most. &lt;strong&gt;After 56 years, most of the chapters still apply&lt;/strong&gt;, suggesting that there is really nothing new under the sun.&lt;/p&gt;

&lt;p&gt;There is one particular chapter that became very famous and has been referenced since: &lt;strong&gt;High Finance, or the Point of Vanishing Interest&lt;/strong&gt;. If this doesn&amp;#8217;t ring a bell, maybe &lt;strong&gt;Parkinson&amp;#8217;s law of triviality&lt;/strong&gt;, or the &lt;strong&gt;bicycle shed discussion&lt;/strong&gt; does. Nevertheless, the law states that &lt;em&gt;&amp;#8220;the time spent on any item of the agenda will be in inverse proportion to the sum involved&amp;#8221;&lt;/em&gt;. Wait a minute! Does this &lt;em&gt;&amp;#8220;Law&amp;#8221;&lt;/em&gt; really state that it is easier to decide what kind of flat to buy, than to decide which carpet will look the best there? Actually, it does, and here comes the explanation.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h3&gt;The scene&lt;/h3&gt;

&lt;p&gt;The chapter is a transcript of a meeting of a finance committee. The participants are about to discuss the last three items on their agenda: the budget for building an atomic reactor, building a bicycle shed for the use of the clerical staff, and finally the refreshments supplied at meetings of the Joint Welfare Committee.&lt;/p&gt;

&lt;h3&gt;The participants&lt;/h3&gt;

&lt;p&gt;According to Parkinson there are two kinds of people: those who have vast fortunes of their own, and those who have nothing at all. The members of the first group know what a million pounds looks like and what it represents. A very small part of the second group, the mathematicians and economics professors, might have never seen a million pounds, but they know what it represents, and they can make a difference between a million and a thousand pounds. The larger part of the second group, has seen a thousand pounds, but has no idea about a million, but they think it is like a thousand, and they handle it accordingly. According to Parkinson, those who are making high finance decisions unfortunately mostly come from this part of the group. And the committee, whose next item on the agenda is to set the budget for an atomic reactor, consists of these people.&lt;/p&gt;

&lt;h3&gt;Let&amp;#8217;s build an atomic reactor&lt;/h3&gt;

&lt;p&gt;The treasurer presents the 9th item on their agenda: &lt;em&gt;approve the ten million pounds budget for building an atomic reactor&lt;/em&gt;. He distributes the plans and the related documents, and shares the concerns of the consultant engineers who previously stated that the reactor could not be finished before the deadline the sub-contractor signed for that there were details that were overlooked during the planning. The chairman thanks the treasurer for the detailed introduction and asks whether anyone has any questions. The committee has eleven members, and out of these eleven members, four - including the chairman - have no idea what a reactor is. Three don&amp;#8217;t know what its purpose is. There are only two persons from the rest, who vaguely know how much it costs to build a reactor. Fortunately, both of them can speak up. So the first member suggests giving the assignment to another sub-contractor - a more reliable one - and involving other consultants.&lt;/p&gt;

&lt;p&gt;The chairman thanks him for speaking up, but he says that it is too late to involve others in this project, and a significant amount of money has already been paid for the plans. If the committee decides to re-do the whole planning phase, it will cost a lot. Several members of the committee nod. Finally, the chairman asks the other person - you remember, the one who vaguely knows how much it costs to build a reactor - to speak up.&lt;/p&gt;

&lt;p&gt;As it turns out, he is the only one who really knows something about building an atomic reactor, and not just vaguely. He also knows that the actual sub-contractor cannot be trusted, the ten million pounds is very strange, and has no idea how it was actually calculated. But he knows something else: the other members. He knows that it would take him a lot of time and effort to teach them the basics of nuclear physics so that they have a basic understanding of how atomic reactors work and what it takes to build one. So instead of speaking up and making this effort he simply says that he has nothing to add.&lt;/p&gt;

&lt;p&gt;Since nobody disagrees, the chairman signs the document and moves to the next item on the agenda. The discussion of the 9th item took &lt;strong&gt;almost 3 minutes&lt;/strong&gt; which doesn&amp;#8217;t include the time that was necessary for distributing the documents. They are on schedule.&lt;/p&gt;

&lt;h3&gt;The bicycle shed&lt;/h3&gt;

&lt;p&gt;The next item is the budget for building a &lt;em&gt;bicycle shed for the use of the clerical staff&lt;/em&gt;. But before the chairman delineates it, some of the members feel bad. &lt;strong&gt;They are not sure that they have made a good decision, and they promise themselves that they&amp;#8217;ll prove later in the meeting that they are valuable members of the committee.&lt;/strong&gt; The cost of building the bicycle shed is 350 pounds.&lt;/p&gt;

&lt;p&gt;One of the members thinks that the price is too high, and suggests building the roof of shed from asbestos instead of aluminum. The other &lt;em&gt;&amp;#8220;roof experts&amp;#8221;&lt;/em&gt; jump in, and one of them even suggests cancelling the project, because the staff doesn&amp;#8217;t deserve a new shed.&lt;/p&gt;

&lt;p&gt;The debate continues, because most of the members are able to understand what 350 pounds represents, and almost every one of them has seen a bicycle shed before. The whole debate takes &lt;strong&gt;45 minutes&lt;/strong&gt; with the prospective result of saving about 50 pounds. Now, everybody is happy, because they feel that they did something important, something that also provided results.&lt;/p&gt;

&lt;h3&gt;Refreshments supplied at meetings&lt;/h3&gt;

&lt;p&gt;The last item on the agenda is the &lt;em&gt;refreshments supplied at meetings of the Joint Welfare Committee&lt;/em&gt;, which cost about 35 schillings a month, which is about 4 pounds a year. Luckily all of them know something about beverages, and can imagine 4 pounds, so everyone jumps in. The whole discussion takes about 75 minutes, but there is no result, because they need more information on the subject, so they adjourn the meeting and make the clerk do more research.&lt;/p&gt;

&lt;h3&gt;Parkinson&amp;#8217;s Law&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;&amp;#8220;The time spent on any item of the agenda will be in inverse proportion to the sum involved&amp;#8221;&lt;/em&gt;. It is spot on Mr. Parkinson, it is spot on indeed. Although, the scenario above is a complete fiction written about 60 years ago, I keep seeing it happen more and more nowadays. I&amp;#8217;d love to know &lt;strong&gt;where the equilibrium between the time spent on a decision and the sum involved is&lt;/strong&gt; and &lt;strong&gt;where is the point is when the interest vanishes&lt;/strong&gt;. I hope that scientists are working on these problems, but until they solve them, I&amp;#8217;ll try to keep myself away from meetings like this.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/gKj9hu_2wuA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/01/parkinsons-law/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Even if it is not right, it is possible...]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/CrgfikDsz1o/" />
    <updated>2013-01-16T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2013/01/even-it-is-not-right-it-is-possible</id>
    <content type="html">&lt;p&gt;I&amp;#8217;ve quite recently had a discussion with one of my friends, Tom, who has been working for a large company - not a telecommunication one -, about the behaviour of one of his new colleagues, Jeff. Tom didn&amp;#8217;t understand why Jeff wasn&amp;#8217;t doing his utmost to be a valuable member of the team during his probation period. I told Tom that there might be a good explanation, and it was possible that Jeff could finish his probation period with his non-cooperative attitude. &lt;strong&gt;I wasn&amp;#8217;t saying that what he was doing was right, but it was possible&lt;/strong&gt;. I think &lt;strong&gt;one should consider &lt;a href="http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety"&gt;the possible scenarios&lt;/a&gt; even if they look less possible in the given context&lt;/strong&gt;, and in this case Tom had to do something about the problem, because he was the only one who had first hand information about what was going on.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-01-16-it-is-not-right-but-it-is-possible/payoff_matrix_before.png"&gt;
For the sake of the example, let&amp;#8217;s assume that Jeff&amp;#8217;s attitude is part of a strategy. Have a look at the payoff matrix on the right, which shows the possible outputs from the perspective of the company. (Please note that the matrix and following chapters contain numbers &lt;strong&gt;I made up&lt;/strong&gt; in order to show a version of Jeff&amp;#8217;s strategy.) Being cooperative means doing his utmost to help move the company forward, &lt;strong&gt;being non-cooperative means to do a minimum and take advantage of the helpfulness of others&lt;/strong&gt;. When both are cooperating, Tom can add 0.75 to the output, because he uses 0.25 for helping Jeff getting around, and Jeff can add 0.25, so they generate 1. When Jeff doesn&amp;#8217;t cooperate, but Tom does, the output is 0.75, because Tom is the only one who contributes. His other 0.25 is wasted on Jeff as a &lt;em&gt;teaching effort&lt;/em&gt;. The bottom left corner of the matrix shows 0.6. Tom adds 0.5 as a minimum in order to avoid attention to his poor performance. Since Tom is not helping, Jeff couldn&amp;#8217;t add too much, but let&amp;#8217;s say he could come up with an extraordinary 0.1. The last corner shows 0.5 which comes from Tom as his minimum.&lt;/p&gt;

&lt;p&gt;According to the matrix it is the best interest of both to be cooperative, however &lt;strong&gt;Jeff can secretly choose a strategy where he doesn&amp;#8217;t cooperate, because this strategy also provides results&lt;/strong&gt;. A manager may say that a new employee will be productive after six months, and a drop in the output can be accepted, because teaching takes time and effort. So, if Jeff&amp;#8217;s strategy is not revealed until the probation period is over, he will survive just fine. He may look like an average employee, which is not bad for someone who is not cooperating at all, while the responsibility is on Tom.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2013-01-16-it-is-not-right-but-it-is-possible/payoff_matrix_after.png"&gt;
Let&amp;#8217;s say that after the end of the probation period, the cooperation from any of them adds 1 to the output, and non-cooperation adds only 0.5, because none of them wants to lose their job. Interestingly, &lt;strong&gt;the game doesn&amp;#8217;t have to change after the end of his probation period&lt;/strong&gt;, because &lt;strong&gt;neither Tom nor Jeff is interested in changing their strategies&lt;/strong&gt;. There are two reasons.&lt;/p&gt;

&lt;p&gt;First, have a look at the top right corner of the next payoff matrix, which shows the output when Tom cooperates, but Jeff doesn&amp;#8217;t. It&amp;#8217;s not exactly 1.5. It is about 1.65, because Tom may want to save the situation and add an extra 0.15 (or more). It is more than double of the previous 0.75, and it is also more than the output of a good and an average employee working together: 1 + 0.5. Even without the extra 0.15 it looks acceptable in a large enterprise context.&lt;/p&gt;

&lt;p&gt;Second, Jeff&amp;#8217;s behaviour will attract some attention eventually, but his position is good. He won&amp;#8217;t just be fired - you need a very good reason for this in many countries -, so he can temporarily cooperate until things quiet down. However, Tom&amp;#8217;s position is worse: he cannot add more - he has already been performing at 115% -, and his stopping cooperating will also attract some unwanted attention. From another perspective, the change in Jeff&amp;#8217;s strategy will have a positive effect: &lt;em&gt;he is improving&lt;/em&gt;, whilst the change in Tom&amp;#8217;s strategy will have a negative effect: &lt;em&gt;he is doing below expectation&lt;/em&gt;. So, none of them is interested in changing strategies.&lt;/p&gt;

&lt;p&gt;However, what Jeff is doing is morally questionable, and Tom is the one who can do something about it. Now, still within the probation period, Tom feels that something is going on, but he is afraid to talk to Jeff, or ask for help from his manager (this has a different root cause, but that doesn&amp;#8217;t matter now). Tom is still convinced that one always cooperates during probation, and everything is going be to fine. I&amp;#8217;m not saying that there are people with evil agendas out there, but &lt;strong&gt;considering other aspects won&amp;#8217;t do any harm&lt;/strong&gt;, and talking to Jeff is a must, no matter what Tom thinks. Maybe he is not as good as he looked during the interview, or there is something else going on.&lt;/p&gt;

&lt;h4&gt;A related post you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety/"&gt;Only Variety Can Absorb Variety&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/CrgfikDsz1o" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2013/01/even-it-is-not-right-it-is-possible/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[I Love the Smell of Outlook in the Morning]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/q8fJvqtbOc0/" />
    <updated>2012-12-11T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/12/love-the-smell-of-the-outlook-in-the-morning</id>
    <content type="html">&lt;p&gt;My workplace (actually two of them) used to be in the middle of a large landscape, and when I was walking to my desk and saw colleagues reading and writing emails in the morning, I used to smile, take a large breath through my nose, and whisper &lt;em&gt;&amp;#8220;I love the smell of Outlook in the morning!&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of the people around me do a lot of things that I&amp;#8217;ll never understand - most probably this feeling is mutual -, and reading emails in the morning is one of them. I saw a guy once who had been sitting in his coat for 3 hours reading emails, because he didn&amp;#8217;t have a chance to take it off. What interesting or important things could he have been reading about that made him sit there for that long?&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;I can think of two possible explanations. First, nowadays working times are flexible, therefore everyone can start and end their work at different times on a given day. When they come in in the morning they are curious about what others did while they were away. Second, they usually save some discussions from yesterday and plan to read them while having coffee in the morning. Both sound reasonable, but &lt;strong&gt;a mail application is like the television: we cannot really turn it off after we turned it on, because there is always something new to watch&lt;/strong&gt;, which is in our case reading and writing emails.&lt;/p&gt;

&lt;p&gt; Every new email is like a new show or a new channel on &lt;em&gt;&amp;#8220;television&amp;#8221;&lt;/em&gt;: it is either interesting, thought provoking, entertaining or frustrating, so we keep listening to it. When it becomes too much, we simply let it go into the background, but when we hear something worth listening to, we immediately turn our attention to it. I&amp;#8217;m pretty sure that you&amp;#8217;ve also reached a point when you&amp;#8217;ve had enough and closed your email application, but when the &lt;em&gt;&amp;#8220;new email&amp;#8221;&lt;/em&gt; notification popped up, you opened it immediately. No matter what, the email application is there, and it has our divided attention, which makes people say: &lt;em&gt;&amp;#8220;I haven&amp;#8217;t done anything valuable today, because I was reading and answering emails the whole day.&amp;#8221;&lt;/em&gt; There was a time when we called this phenomenon &lt;em&gt;&amp;#8220;Outlook Driven Development&amp;#8221;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Banning the television from our home is hard but achievable, however, we are certain that we cannot ignore our emails. I was interested in this topic, so I did a personal experiment, and stopped reading and writing emails. At that time the size of my team was rather small (below 7), and I managed to do my job and be a part of the team, while the number of incoming emails reduced drastically: the others learned that there was no use sending me stuff, because I won&amp;#8217;t read and answer them anyway. The other interesting result was that this didn&amp;#8217;t cause any changes in the personal or phone based interruptions. This meant that most of the emails I was reading and answering were never that important.&lt;/p&gt;

&lt;p&gt;I was curious if this could work for somebody else as well, so I asked a friend to join the experiment. He was a member of a larger team and several other groups. As far as I remember, he managed to do this for a day or so. It wasn&amp;#8217;t a complete failure though. We concluded that &lt;strong&gt;ignoring emails won&amp;#8217;t work when one is a member of a larger team and/or several groups, because he will be left out from the information flow&lt;/strong&gt;. In theory the solution would be for everybody to stop reading and sending emails at the very same time, which sounds a bit futuristic.&lt;/p&gt;

&lt;p&gt;We didn&amp;#8217;t give up and tried out a different approach. The &amp;#8220;emails first, work second&amp;#8221; order was a habit, and as such, it was changeable. We agreed that &lt;strong&gt;we would change the order, and we wouldn&amp;#8217;t open our email application until we did something valuable that day&lt;/strong&gt;. The first day was interesting for both of us: I needed about 7 hours to finish what I had planned, and my friend reported similar results. The next day was like before, but after several attempts we somehow managed to change our email reading and writing habits: we try to do something valuable during the morning, and when it is done, we open our email application. It is not perfect yet, but we can achieve something valuable during the day, and we can be an effective member of the email readers&amp;#8217; and writers&amp;#8217; society.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/q8fJvqtbOc0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/12/love-the-smell-of-the-outlook-in-the-morning/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The Walnut]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/E4wvH-YxrLQ/" />
    <updated>2012-12-03T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/12/walnut</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-12-03-walnut/walnuts.jpg"&gt;
The current weather in Finland reminds me of the nice autumns we used to have back in Hungary when I was a kid (Hungary used to have four seasons, but thanks to the climate change, nowadays there are only two seasons: Summer and Winter).
I especially remember the evenings about 15 years ago, when I was cracking walnuts with my grandmother in her kitchen. I remember telling her that we had to have more walnut trees so we could make a fortune selling walnuts. One kilo of peeled walnuts cost about 700 HUF at that time, when one earned about 560 HUF with manual labour a day. We had one tree, which produced about 20 kilos of walnuts a year, and we peeled this amount in 3-4 days (mainly during the afternoon and the evening), so we made about 14000 HUF in three days. A manual labourer had to do hard work for this kind of money for more than half of a month.
The people to whom we sold the peeled walnuts always wanted more (there was a demand), so it was a great business opportunity. Unfortunately, my family didn&amp;#8217;t value this kind of business at that time, because according to them, a decent man should have a decent job and this walnut thing is not it. It was just something to gain some extra money from for Christmas.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;A couple of weeks ago, I was watching an interview with György Klapka - a Hungarian entrepreneur -, who actually built a business based on walnuts. He is a divisive figure in Hungary, who has always been looking for better and better business opportunities (maybe that&amp;#8217;s why half of the country doesn&amp;#8217;t like him). About 13 years ago - what a coincidence - when he was about 70 years old (!) he was looking for mid-term investments, because he wanted to support his children after he was gone. He had some land and decided to grow something. His imaginary time frame didn&amp;#8217;t give him too much choice, so he started to look for something with a low investment cost, and high profit in the mid-term. During his research he read about cherries. It really fit into the equation and there was a demand, but the cherry business was really weather-sensitive: a lot of rain could damage the goods, which made them impossible to sell.&lt;/p&gt;

&lt;p&gt;The second best thing he read about was walnuts. The possible profit margin was lower than that of the cherries, but the walnuts are more resistant to rain and other weather damages, so he decided to plant walnut trees on his property. A walnut tree produces its first crop after 3-4 years after planting, lives for approximately 80-100 years and doesn&amp;#8217;t require too much care. The only thing one should take care of is a fast harvest. After the walnut has fallen down, the surrounding green casket needs to be removed very soon, otherwise it will start to create a certain black fluid, which colours the kernel, which makes it really hard to sell: it looks bad and tastes awful.&lt;/p&gt;

&lt;p&gt;Back to the present, he has been running different kinds of businesses since then, but according to the mentioned interview the walnut business is his most profitable and steady one. I haven&amp;#8217;t found any evidence that he is a lean or systems thinker, but his enterprise is very efficient and well organized. He had a road built, because the vehicles couldn&amp;#8217;t easily reach the facilities, he bought the best available equipment so that the harvest was going as efficiently as possible, and automated almost everything, but only those parts which were necessary. For example, almost the whole harvest and processing is done with machines, however the peeling is semi-automated. The machine doesn&amp;#8217;t peel the walnut it just cracks it so that the internal part is still in one piece, then the walnut gets transferred to the local prison where the inmates peel it for some money. His business isn&amp;#8217;t built on the peeled walnut - like my idea was -, but it is a part of it. He distributes the walnut in Hungary and in Europe, and since the quality and quantity is very good, he has no problem selling the crop. This is not bad from a 83 year old man. I should have pushed my family a bit harder at that time :-)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/E4wvH-YxrLQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/12/walnut/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Liquidity for Kanban Systems, My First Look]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/jJ3ei3icZBo/" />
    <updated>2012-11-25T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/11/liquidity-for-kanban-systems</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/david_anderson.png"&gt;
In his &lt;a href="http://www.lean-kanban.eu/sessions/anderson/"&gt;keynote&lt;/a&gt; at the &lt;a href="http://www.lean-kanban.eu/"&gt;Lean Kanban Central Europe 2012&lt;/a&gt; conference &lt;a href="http://djaa.com"&gt;David J. Anderson&lt;/a&gt; proposed a new metric for Kanban Systems, which is supposed to provide an answer to the big organizational governance question: &lt;em&gt;&amp;#8220;How do you choose where to place a piece of work or project?&amp;#8221;&lt;/em&gt; &lt;strong&gt;The idea is to measure the pull transactions per volume (persons or units of currency) in a Kanban System, which shall tell us how liquid it actually is&lt;/strong&gt;. There is an analogy to the liquidity of the markets from the investment banking domain: the more liquid a market is the higher the trust is. According to David:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&amp;#8230;Measuring and reporting system liquidity is important to building trust to enable a probabilistic approach to management of knowledge work and hence elimination of wasteful economic overheads facilitating the comfort mechanisms inherent in the existing pseudo-deterministic approach to management. System liquidity provides an important indicator, solving the governance challenge of selecting the best vendor or department to process a work order&amp;#8230;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;In layman&amp;#8217;s terms, the probability of getting desired outcome is higher if I work with the team with the highest liquidity.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h3&gt;Liquidity for Kanban Systems&lt;/h3&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/board.png"&gt;&lt;/p&gt;

&lt;p&gt; Imagine the Kanban System as a market where the transactions are the pulls. In this context &lt;strong&gt;the liquidity of a Kanban System is the number of pull transactions in a given time period&lt;/strong&gt; (which is three in the example above). There is a normalized form in which the number of pull transactions is divided by the number of team members (or currency) in a given time period. I&amp;#8217;m going to use the normalized form in the rest of this post, but will leave out the word &amp;#8220;normalized&amp;#8221; when referring to it for simplicity.&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/challenge-accepted.png"&gt;&lt;/p&gt;

&lt;p&gt;At the end of his talk, David challenged the Kanban community to measure the liquidity in their organizations and collect as much information as possible to see how the idea works in practice. I was curious about it, so I took the data from my &lt;a href="https://speakerdeck.com/fabokzs/measure-and-manage-flow-in-practice"&gt;&amp;#8220;Measure and Manage Flow in Practice&amp;#8221; talk&lt;/a&gt; (&lt;a href="#note1"&gt;[1]&lt;/a&gt;) and &lt;em&gt;calculated&lt;/em&gt; the liquidity of an old team of mine (&lt;a href="#note2"&gt;[2]&lt;/a&gt;). &lt;strong&gt;I use the word &lt;em&gt;&amp;#8220;calculated&amp;#8221;&lt;/em&gt; and not &lt;em&gt;&amp;#8220;measured&amp;#8221;&lt;/em&gt; on purpose&lt;/strong&gt;: my results weren’t entirely measured so they’re not solid enough. Back then I was collecting data for a different purpose and therefore I was missing some details which I had to figure out by using calculations, and this is not the way to do accurate measurements. Additionally, I didn&amp;#8217;t remember the entire context, which made it hard to explain the data. Nevertheless, I think the result of my calculations is good enough to start with, so here is it:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/liquidity-days-weeks.png"&gt;&lt;/p&gt;

&lt;p&gt;The matching CFD chart:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/cfd.png"&gt;&lt;/p&gt;

&lt;p&gt;Towards the end the CFD shows some stability, however the liquidity is still moves up and down. I don&amp;#8217;t have a good explanation, so I&amp;#8217;d rather wait for the real measurements to provide more details about this phenomenon.&lt;/p&gt;

&lt;h3&gt;Unclear relationship between liquidity, lead time and throughput&lt;/h3&gt;

&lt;p&gt;At the moment I dare to state that &lt;strong&gt;the connection between liquidity, lead time and throughput is not clear yet&lt;/strong&gt;. I cannot say that a team with higher liquidity will deliver faster or deliver more. For example, there was another team where we had a separate column for code review. After long discussions we decided to merge the code review and development columns and made the code review a part of the definition of done. I clearly remember that the lead time and the throughput did not change, however if I had calculated the liquidity I would have ended up with a lower number, because fewer columns on the board means fewer pull transactions.&lt;/p&gt;

&lt;p&gt;This statement isn&amp;#8217;t one hundred percent accurate either, because pull transactions won&amp;#8217;t necessarily happen linearly, by pull after pull. Pull transactions can happen in parallel, completely unrelated to each other. Imagine that you have to do a work item and you have five columns on your board. This means that your liquidity will be five if you work only on that work item and finish it within the given time period (the number of pull transactions to get a task done is equal to the number of columns you have on your board). If you take away a column, your liquidity will be four if you follow this linear thinking. However, with fewer columns you can reduce the &lt;a href="http://zsoltfabok.com/blog/tag/inventory"&gt;inventories&lt;/a&gt; and waiting times, so you may find some time to pull another item somewhere else on the board, so you might have a liquidity of five again. This works the other way around as well: if you need an extra column (like when we had to create verification and validation columns instead of a single testing column) you may increase your liquidity, but you may need more time to pull work items forward, so time-wise you won&amp;#8217;t gain that extra in your liquidity.&lt;/p&gt;

&lt;p&gt;Concerning throughput, have a look at the following charts:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/liquidity-vs-throughput.png"&gt;&lt;/p&gt;

&lt;p&gt;They are quite the same, but not really. There is a noticeable gap in throughput although there were multiple pulls at the very same time. Since my data comes from calculations I don&amp;#8217;t know too much about the context, but an infinite queue on the board can explain the difference (an &lt;em&gt;infinite queue&lt;/em&gt; is a specific column which has no WIP limit and works as an unlimited &lt;a href="http://zsoltfabok.com/blog/tag/inventory"&gt;inventory&lt;/a&gt;): the team pushed work items into that queue more frequently than they pulled form it. &lt;strong&gt;In this case the liquidity will be high because of the frequent pushes, but the throughput will be low because of the rare pulls&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;What liquidity is telling me at the moment&lt;/h3&gt;

&lt;p&gt;&lt;img class="left" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/pattern.png"&gt;&lt;/p&gt;

&lt;p&gt;At the moment &lt;strong&gt;I see liquidity as an energy level indicator&lt;/strong&gt;. &lt;strong&gt;In order to keep this level relatively high, the team needs to continuously improve itself&lt;/strong&gt; (this is the fuel which is necessary to create energy). When liquidity drops or increases we know something is happening. For example, you can spot a recurring pattern (the chart on the left) in the first daily chart. There is a calmer period, which is followed by a spike and then a drop. A little bit later, there is an almost equally large spike and a calm period again. First I thought that this phenomenon happened around the dates when we had deliveries, but as far as I remember we rarely worked that much before deliveries (high number of pull transactions may indicate high workload, too). However, we had an infinite queue after implementation - I remember that clearly -, which we emptied (first spike) when we were physically unable to put more work items into it. After that we put the implemented work items into the empty queue and pulled them forward (second spike) so that we could continue the implementation (the longer calm periods) with a clean sheet.&lt;/p&gt;

&lt;h3&gt;Calculation and measurement issues&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;ve already written about the problems that &lt;em&gt;infinite queues&lt;/em&gt; in the middle of the flow can cause, but there are more gotchas, which may make the measurements hard to perform.&lt;/p&gt;

&lt;p&gt;The first issue is with &lt;strong&gt;&lt;a href="http://zsoltfabok.com/blog/2011/09/expand-and-collapse-got-beaten"&gt;the expand and collapse method&lt;/a&gt;&lt;/strong&gt;: a couple of times, we broke down a large work item into smaller pieces and worked only with those, but at the validation phase we merged them back together. My common sense would dictate to use the pull transactions of the broken down work items, but the breakdown process is really team-specific, which may make the comparison of teams (this is the purpose of the liquidity measurements) less possible or accurate. On the other hand, &lt;strong&gt;if a team can break down work items in an efficient way, then that team may be better than other teams&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The second issue appears when &lt;strong&gt;the team rejects work items and moves them back on the board&lt;/strong&gt;. In this case the number of pull transactions on those work items can be easily doubled if they moved back to the beginning of the board.&lt;/p&gt;

&lt;p&gt;The last issue has nothing to do with measurements (or calculations) directly, but may cause some trouble later: &lt;strong&gt;the changing number of the columns and the people in the team&lt;/strong&gt;. I&amp;#8217;ve already written about the issues with the number of columns, and my pessimistic half has already visualized teams arguing about having more columns just to have the chance of achieving a higher liquidity instead of improving their ways of working. Additionally, the number of columns and the number of team members were changing frequently in the observed time period (for example in my case I calculated about five column changes and six changes in the number of persons in the team), and I don&amp;#8217;t know how this change will affect the liquidity-based comparisons in the future.&lt;/p&gt;

&lt;h3&gt;Liquidity by work item size&lt;/h3&gt;

&lt;p&gt;Finally, I was curious how the liquidity by work item size chart looked like:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/sizes.png"&gt;&lt;/p&gt;

&lt;p&gt;It seems that the smaller the items are, the more pull transactions are in the system, but this needs to be investigated further. I&amp;#8217;ve already written about &lt;em&gt;expand and collapse&lt;/em&gt; and I&amp;#8217;m wondering if there are any connections here. In theory there is one, but I&amp;#8217;d rather wait for some evidence from measurements before jumping to any conclusions.&lt;/p&gt;

&lt;h3&gt;The first comparison&lt;/h3&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-25-liquidity-for-kanban-systems/teams.png"&gt;&lt;/p&gt;

&lt;p&gt;I managed to find a picture of another team, calculated their liquidity and compared it to ours (check out the chart on the right, which covers two weeks). As you can see, their liquidity was way lower than ours, but they were more trusted inside the whole organization. This might be important in the future: &lt;strong&gt;the measured data or scientific proof such as liquidity won&amp;#8217;t change cognitive biases automatically&lt;/strong&gt;. I&amp;#8217;m certain that no matter what our team would have done, the other team had been in favor. Nevertheless, I see a great potential in liquidity for Kanban Systems, because besides the potential in comparison, liquidity provides more details about the internal affairs of a team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; you can find David&amp;#8217;s own post about liquidity on his &lt;a href="http://agilemanagement.net/index.php/Blog/thoughts_on_the_value_of_liquidity_as_metric/"&gt;blog&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Notes&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a id="note1"&gt;&lt;/a&gt;&lt;em&gt;I used the data behind the CFD (Cumulative Flow Diagram) and some pictures from the material of the talk&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a id="note2"&gt;&lt;/a&gt;&lt;em&gt;The pictures provided the number of columns of our boards at the time when they had been taken. I used this information to calculate the number of pull transactions, because the number of pull transactions of a finished work item was equal to the number of columns when the work item had been done. I used the lead time (done - started) to figure out when the pull transactions had happened: I evenly distributed the number of pull transactions along the working period&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2011/05/kanban-on-organisational-level/"&gt;Kanban on Organisational Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/"&gt;Visualize the Flow on the Highest Possible Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/04/see-the-whole-flow-exercise/"&gt;See the Whole Flow - An Exercise for Managers to Start a Transition&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/10/hidden-inventory/"&gt;The Hidden Inventory&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/jJ3ei3icZBo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/11/liquidity-for-kanban-systems/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Chrome Remote Desktop Plugin]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/QfouoLYAxP8/" />
    <updated>2012-11-22T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/11/remote-desktop-plugin</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-22-remote-desktop-plugin/icon.png"&gt;
I remember the good old times when if one of my relatives or friends had some problems with his or her computer, I simply went over and solved it. I was never good at phone support, because I’ve always had to see a problem in order to solve it. Nowadays, almost everybody I know has an internet connection, so I no longer have to go over, because there are tools like SSH, Skype screen sharing or Windows Remote Desktop Connection (RDC), which make it possible to provide valuable remote assistance. But it is not always that straightforward.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;For example, it is not easy for a regular user to allow SSH or RDC access, and even if she manages to do it, the fact that almost everybody is behind a firewall and/or NAT, makes direct connection almost impossible. There is the screen sharing option of Skype, but it has rarely worked for us, so I had to look for an alternative which was easy to use and provided basic features such as screen sharing and remote control.&lt;/p&gt;

&lt;p&gt;As usual, Google Chrome comes to the rescue. There is a plugin called &lt;a href="https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp"&gt;Chrome Remote Desktop&lt;/a&gt;, which allows access to a remote machine regardless of its place in the network (behind firewalls and/or NAT) or its operating system. Here is a screenshot of my Chrome instance, where I&amp;#8217;m upgrading some packages on my mother&amp;#8217;s computer:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-11-22-remote-desktop-plugin/screenshot.png"&gt;&lt;/p&gt;

&lt;p&gt;The tool works just fine. I was able to do everything I needed to do, and I didn&amp;#8217;t have to explain several times how to use it. The installation and the first usage required some preparation and chatting, but the second time we needed it, my mother just sent me the login details and I was in and out in 5 minutes. I can only recommend this plugin.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/QfouoLYAxP8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/11/remote-desktop-plugin/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[A Zeno Paradox at the Workplace: Achilles and the Tortoise]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/wjvNnFEPds8/" />
    <updated>2012-11-15T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/11/achilles-and-the-tortoise</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-15-achilles-and-the-tortoise/bus_window.jpg"&gt;
A good friend of mine and I were chatting about why teams considered as suppliers (back office) work noticeably more than those working with or for the front office. We didn&amp;#8217;t jump to any conclusions, and we started to talk about something else, but it kept bugging me, &lt;a href="http://www.psychwiki.com/wiki/Zeigarnik_Effect"&gt;which is never a good sign&lt;/a&gt;. I knew that I wouldn&amp;#8217;t go to those teams and ask them questions (which would have been a better way to put an end to this issue), and it wasn&amp;#8217;t really that important either, so I tried to figure it out by myself during a longer bus ride. As my current theory goes, &lt;strong&gt;the back office has the false belief that they don&amp;#8217;t know enough about the domain, therefore they spend a huge amount of work on filling in the imaginary gap in their competence, but despite every effort they won’t be able to succeed&lt;/strong&gt;. Their approach is wrong, and here is why.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;I&amp;#8217;m sure that there are cases when this phenomenon is explained by the fact that the managers of the back office are afraid that if the managers of the front office won&amp;#8217;t see a 100% percent utilization they are going to look for another supplier. It can also be a simple cultural difference. I was generous to myself and I simplified the scenario by eliminating these and similar &lt;a href="http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety"&gt;variations&lt;/a&gt;, and said that &lt;strong&gt;the front office looked at the back office as equal&lt;/strong&gt;, most of the decisions were made together, and &lt;strong&gt;they considered the back office as a long term strategic partner&lt;/strong&gt;. This was the case in the situations my friend I were talking about before. But even under these circumstances I spotted the phenomenon.&lt;/p&gt;

&lt;p&gt;When the front office cannot do more work and needs help, it looks for a back office that can provide the necessary workforce (for significantly lesser money of course). At the beginning of their relationship, the front office owns &lt;strong&gt;the domain know-how&lt;/strong&gt;, which is its most important asset. Both offices need this know-how in order to be effective and valuable partners in this relationship, so the back office starts to learn as much as possible about the domain. When it reaches the desired level of knowledge and sees itself as equal, comes the surprise: the front office is ahead again. &lt;strong&gt;While the back office was learning the old things, the front office used the same amount of time to come up with new things&lt;/strong&gt;, and now it has an advantage over the back office again. The back office wants to be equal, the front office wants the back office to be equal, so the catching up starts again. This time the learning period is shorter, but they still aren&amp;#8217;t equal, because of the very same reason as before. And this goes on and on. The situation is similar to &lt;strong&gt;one of Zeno&amp;#8217;s paradoxes of motion: Achilles and the Tortoise&lt;/strong&gt;. Here is the short description of the paradox from &lt;a href="http://en.wikipedia.org/wiki/Zeno_paradox#Achilles_and_the_tortoise"&gt;Wikipedia&lt;/a&gt; (&lt;a href="http://ratenumone.blogspot.com/2010/05/11-brain-twisting-paradoxes.html"&gt;image source&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-15-achilles-and-the-tortoise/achilles_and_the_tortoise.png"&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In the paradox of Achilles and the Tortoise, Achilles is in a footrace with the tortoise. Achilles allows the tortoise a head start of 100 metres, for example. If we suppose that each racer starts running at some constant speed (one very fast and one very slow), then after some finite time, Achilles will have run 100 metres, bringing him to the tortoise&amp;#8217;s starting point. During this time, the tortoise has run a much shorter distance, say, 10 metres. It will then take Achilles some further time to run that distance, by which time the tortoise will have advanced farther; and then more time still to reach this third point, while the tortoise moves ahead. Thus, whenever Achilles reaches somewhere the tortoise has been, he still has farther to go. Therefore, because there are an infinite number of points Achilles must reach where the tortoise has already been, he can never overtake the tortoise.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Although I enjoy having philosophical conversations, let me stop here and bring psychology to the table, because the fact that the back office (Achilles) won&amp;#8217;t give up or do something else in a deteriorating situation like this, can be explained.&lt;/p&gt;

&lt;p&gt;In school we learned that with diligence it was possible to get a good score or even the highest score, but it seems that this doesn&amp;#8217;t apply here. I see the problem in the difference of the contexts: at school &lt;strong&gt;the target was fixed&lt;/strong&gt; (the knowledge we had to present at exams) and &lt;strong&gt;the iterations were also fixed&lt;/strong&gt; (the number of grade levels), but &lt;strong&gt;at the workplace the target is moving, and there is an infinite number of iterations&lt;/strong&gt; (like in the case of &lt;em&gt;Achilles and the Tortoise&lt;/em&gt;). Despite of the difference in contexts, the back office still tries to apply this &lt;em&gt;&amp;#8220;well proven and working&amp;#8221;&lt;/em&gt; method to catch a moving target.&lt;/p&gt;

&lt;p&gt;&lt;img class="left" src="http://zsoltfabok.com/images/posts/2012-11-15-achilles-and-the-tortoise/therapy.jpg"&gt;
Chasing a moving target is hard, although when there are interim positive results and feedbacks, it is manageable, and sometimes there is some satisfaction during the chase. However, I&amp;#8217;ve never seen satisfaction at the back office. I&amp;#8217;ve seen frustration and dissatisfaction instead, because the interim positive results were missing. The brain doesn&amp;#8217;t like to be in a state like this, so it tries to do something about it by using inherited (surviving) or learned skills. Usually, it picks the proper approach, but in this case it tends to make the wrong choice, because &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Endowment_effect"&gt;humans are loss-averse&lt;/a&gt;&lt;/strong&gt; (another nice feature of our brain): they try to avoid losing things, which is the effort put into the catching-up in this case. Instead of giving up and trying a new way, &lt;strong&gt;our brain tells us to prevent this loss, so we keep doing the catching-up&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are no best practices or world changing advices here. Wiser men have been trying to solve paradoxes for a long time with &lt;a href="http://en.wikipedia.org/wiki/Zeno_paradox#Proposed_solutions"&gt;little success&lt;/a&gt;. Psychologists have built a very large and successful business on accepting loss and coping with it (called therapy sessions). Another friend said &amp;#8220;Why do you care? It&amp;#8217;s their business not yours.&amp;#8221; He might be right, I don&amp;#8217;t know, but I know one thing for sure: &lt;strong&gt;doing overtime to catch up&lt;/strong&gt; - it&amp;#8217;s like Achilles is cheating - &lt;strong&gt;won&amp;#8217;t do any good&lt;/strong&gt;. We did it once, managed to catch-up, but most of us got exhausted, others had family issues which caused a slowdown in our life, and we found ourselves right were started: behind the front office.&lt;/p&gt;

&lt;p&gt;Well done Mr. Tortoise, you&amp;#8217;ve won. Dear Reader, don&amp;#8217;t take this post too seriously, since it is just a theory dumped from my brain after a long bus ride ;-)&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;P.S.: if you have a major in psychology and/or philosophy and you happen to know that this is not the way things work, please correct me in the comments, and I&amp;#8217;ll update the post).&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/wjvNnFEPds8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/11/achilles-and-the-tortoise/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Only Variety Can Absorb Variety]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/EgVMqElBggE/" />
    <updated>2012-11-11T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2012-11-11-variety-absorbs-variety/ashby.jpg"&gt;
I recently read the expression &lt;em&gt;&amp;#8220;only variety can absorb variety&amp;#8221;&lt;/em&gt;, but I had no idea what it meant. It took me some time, but I figured it out. It is a short version of the &lt;strong&gt;Law of the Requisite Variety&lt;/strong&gt; by &lt;a href="http://en.wikipedia.org/wiki/William_Ross_Ashby"&gt;William Ross Ashby&lt;/a&gt; (on the right), a pioneer in &lt;a href="http://en.wikipedia.org/wiki/Cybernetics"&gt;Cybernetics&lt;/a&gt;: &lt;em&gt;&amp;#8220;The larger the variety of actions available to a control system, the larger the variety of perturbations it is able to compensate.&amp;#8221;&lt;/em&gt; (source: &lt;a href="http://pespmc1.vub.ac.be/REQVAR.html"&gt;Principia Cybernetica&lt;/a&gt;). In layman&amp;#8217;s terms it means &lt;em&gt;the more flexible a system is, the better the chances that it is &lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient"&gt;effectively&lt;/a&gt; able to react to change&lt;/em&gt;. For example, the more languages I know, the better my chances are to find my way in a foreign country.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;h3&gt;Ashby&amp;#8217;s Law&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;Law of the Requisite Variety&lt;/em&gt; is often referred to as &lt;em&gt;Ashby&amp;#8217;s Law&lt;/em&gt;. &lt;a href="http://pespmc1.vub.ac.be/ASC/LAW_VARIE.html"&gt;Ashby once said&lt;/a&gt;: &lt;em&gt;&amp;#8220;Only variety (in the regulator) can destroy variety (in the system being regulated)&amp;#8221;&lt;/em&gt;, which sounds like quite the opposite of what I was talking about before. This discrepancy comes from the fact that there are two ways to deal with variety: either by &lt;strong&gt;change - absorbing more variety -&lt;/strong&gt;, or &lt;strong&gt;regulation - controlling the input as much as possible&lt;/strong&gt;. Ashby&amp;#8217;s quote refers to regulation, whilst the definitions from the first paragraph are referring to change, which is more popular nowadays. Nevertheless, Ashby&amp;#8217;s quote helps understand the context where the &lt;em&gt;Law of Requisite Variety&lt;/em&gt; can be applied: there are at least two systems, they both have a certain level of variety, and they are communicating.&lt;/p&gt;

&lt;h3&gt;Understanding variety&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;ve been writing about &lt;em&gt;variety&lt;/em&gt;, but never really defined what it is. According to the &lt;a href="http://pespmc1.vub.ac.be/VARIETY.html"&gt;Principia Cybernetica&lt;/a&gt;: &lt;em&gt;&amp;#8220;Variety is a measure of the number of distinct states a system can be in&amp;#8221;&lt;/em&gt;. Although it is a result of measurement, it is usually hard to quantify precisely, but in most of the cases an uncountable adjective does the trick. For example, the variety in our team is high.&lt;/p&gt;

&lt;p&gt;However, in my language example above it is easy to provide the variety as a number: it is the number of the languages I speak. If I speak two different languages, then the variety of my system in the context of spoken languages is two. If my friend joins me, who speaks three different languages, one of which I don&amp;#8217;t speak, then our system&amp;#8217;s variety in this context is three.&lt;/p&gt;

&lt;h3&gt;Communication between systems&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://pespmc1.vub.ac.be/VARIETY.html"&gt;Charles E. Osgood talks about communication between systems&lt;/a&gt;: &lt;em&gt;&amp;#8220;the amount of output from a system is limited by the variety possible within the system and/or the variety of input to the system. The number of possible alternative communications between the two systems is limited by that system having the fewest output alternatives and/or the fewest input alternatives.&lt;/em&gt;&amp;#8221;&lt;/p&gt;

&lt;p&gt;If my friend and I are visiting a country where at least one of the languages we speak is spoken, then most probably we&amp;#8217;ll find our way (the number of alternatives are greater or equal to one). If we move to a part of this country where there is a strong dialect, we might have communication problems (the number of alternatives are zero).&lt;/p&gt;

&lt;p&gt;In order to be able to continue our journey we need a new member to the group (system), who understands both that dialect and us. So, we have to increase the variety of our system. This is what the phrase &lt;em&gt;&amp;#8220;only variety can absorb variety&amp;#8221;&lt;/em&gt; means: we cannot really respond to a new context or a change without increasing the variety of our system.&lt;/p&gt;

&lt;h3&gt;Absorbing variety&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Absorbing variety is one way to respond to change&lt;/strong&gt;. Let&amp;#8217;s say I&amp;#8217;m the leader of a team. I tell them what they have to do, and if they do something else, I&amp;#8217;ll punish them. It is a classical command and control approach. If a change happens, according to Ashby&amp;#8217;s Law, I have to increase variety in my organization (the system) in order to be able to respond. Since I&amp;#8217;m keeping the whole team under my control, the only way to do this is by increasing the variety in myself. However, that is very expensive, and even if I&amp;#8217;m a super human I cannot keep up with the pace of the change for a long time, so I need a different approach.&lt;/p&gt;

&lt;p&gt;By giving up the command and control approach and &lt;strong&gt;introducing empowerment&lt;/strong&gt;, I can open up the potential in the team and use the variety from their background, knowledge, etc. to absorb the necessary variety.&lt;/p&gt;

&lt;p&gt;Ashby&amp;#8217;s Law can be applied to business scenarios, too. In the next example, I&amp;#8217;m running a hot-dog stand and the business is going well. I have more and more customers, but I reached a state where I cannot create the hot-dogs any faster. Due to the longer waiting time in the queue, certain customers stop coming back. The current number of customers is satisfactory, but it could be more, so I hire an employee to help me out.&lt;/p&gt;

&lt;h3&gt;Regulating variety&lt;/h3&gt;

&lt;p&gt;I mentioned before that there are two ways to deal with variety, and &lt;strong&gt;regulation is also an option&lt;/strong&gt;. Let&amp;#8217;s see the previous situation from a different angle: I&amp;#8217;m satisfied how business is going. I&amp;#8217;m very uncertain about the future, and I don&amp;#8217;t know how the market will look like in three months. So, instead of hiring a new employee, I &lt;strong&gt;control the variety&lt;/strong&gt; by continuing the business alone.&lt;/p&gt;

&lt;p&gt;Depending on the context, regulation can be achieved by &lt;strong&gt;specialization&lt;/strong&gt; as well. My customers are asking me whether I plan to sell beverages. I say no because of the previously discussed uncertainty, and keep being specialized in selling hot-dogs only, but I recommend a friend&amp;#8217;s store where they can buy beverages.&lt;/p&gt;

&lt;h3&gt;Cost of response&lt;/h3&gt;

&lt;p&gt;It is important to know that even if the input of our system is regulated, &lt;strong&gt;the other system&amp;#8217;s unmatched variety is still there&lt;/strong&gt;, and it will be the input to another system. What if the customers, who were asking for beverages, find another hot-dog stand in the neighborhood, which sells canned sodas? Unless my hot-dog is extraordinary, they&amp;#8217;ll buy hot-dogs from that stand and I&amp;#8217;ll lose money.&lt;/p&gt;

&lt;p&gt;As always, &lt;strong&gt;the response (absorb or regulate) depends on the cost or the risk I&amp;#8217;m willing to take&lt;/strong&gt;. Absorbing variety can be very expensive, but usually can lead to a better outcome. On the other hand, regulation seems to be a better option in the short term, but may have more disadvantages in the long term (note: I haven&amp;#8217;t found any scientific evidence to back these statements, but somehow they sound obvious to me).&lt;/p&gt;

&lt;h3&gt;System overload&lt;/h3&gt;

&lt;p&gt;Until this point I was writing about the stage when the required level of variety is lower than the expected level. &lt;a href="http://en.wikipedia.org/wiki/Robert_Dilts"&gt;Robert Dilts&lt;/a&gt; calls this stage &lt;strong&gt;stagnation&lt;/strong&gt;. When the system reaches a level of variety that matches the level of the variety of the other system, then the system is &lt;strong&gt;stable&lt;/strong&gt;. When it is way above it, the system is &lt;strong&gt;overloaded&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I decide to sell beverages and I start big: I provide different kinds and in different kinds of packaging (I didn&amp;#8217;t do any research and have no idea what they actually want). It is a huge investment, and what if my customers want only a can of soda (the one they can hold while eating the hot-dog)? Then my system is overloaded and this may have a huge effect on my business, because of the unnecessary investment.&lt;/p&gt;

&lt;h3&gt;Ashby&amp;#8217;s Law in software development of the 21st century&lt;/h3&gt;

&lt;p&gt;Understanding Ashby&amp;#8217;s Law can be very useful in software development, because it is all over the place. Scrum introduced the &lt;a href="http://zsoltfabok.com/blog/2010/08/in-pursuit-of-the-cross-functional-team"&gt;cross-functional team idea&lt;/a&gt; so that teams can adapt to change faster, &lt;a href="http://zsoltfabok.com/blog/tag/xp"&gt;eXtreme Programing&lt;/a&gt; emphasizes the importance of craftsmanship so that developers can provide multiple solutions to a problem, &lt;a href="http://zsoltfabok.com/blog/tag/kanban"&gt;Kanban&lt;/a&gt; limits the work in progress to control the system, and in order to avoid system overload &lt;em&gt;Systems Thinking&lt;/em&gt; is talking about understanding the demand.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2010/08/in-pursuit-of-the-cross-functional-team/"&gt;In Pursuit of the Cross-Functional Team&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/"&gt;Visualize the Flow on the Highest Possible Level&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/EgVMqElBggE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/11/variety-absorbs-variety/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Two Ideas for Stand-up Meetings]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/ZHR9uryDMX0/" />
    <updated>2012-11-06T00:00:00+01:00</updated>
    <id>http://zsoltfabok.com/blog/2012/11/two-ideas-for-stand-up-meetings</id>
    <content type="html">&lt;p&gt;I overheard two great ideas about stand-up meetings. The first one is from &lt;a href="https://twitter.com/snowded"&gt;Dave Snowden&lt;/a&gt;. He observed that certain sessions weren&amp;#8217;t going as &lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient"&gt;effectively&lt;/a&gt; as they could. The participants were talking about irrelevant things, and the very important &lt;em&gt;&amp;#8220;what needs to be really done?&amp;#8221;&lt;/em&gt; question wasn&amp;#8217;t properly addressed during these meetings. Therefore, he suggested adding, or completely replacing the original three questions with this one: &lt;strong&gt;&amp;#8220;What do I want to do instead?&amp;#8221;&lt;/strong&gt;&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;If there is a meaningful answer to this question, then the Scrum Team is doing something different from what it is supposed to do. I didn&amp;#8217;t have the chance to talk to Dave about this in more detail, but here is my interpretation: a Scrum Sprint is a really focused event, and a Scrum Team is supposed to be a highly disciplined small organization. If a member of such a team in an environment like this is doing something other than what she wants to do, then either something is wrong with the Sprint or the level of discipline is not high enough. Therefore, this is something the Scrum Team has to talk about.&lt;/p&gt;

&lt;p&gt;The other idea comes from &lt;a href="https://twitter.com/lunivore"&gt;Liz Keogh&lt;/a&gt;. She observed that when a meeting started with the phrase &lt;em&gt;&amp;#8220;who wants to go first?&amp;#8221;&lt;/em&gt;, it turned into a status meeting. Somehow that phrase turned on the &amp;#8220;I need to report&amp;#8221; part of the brain, and from that point the meeting was meaningless from the Scrum point of view. Actually, this makes sense, and if I look back and think about the early stand-up meetings we had, the ones that started with a long silence were much better and more effective than those where we asked somebody specific to start.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2010/12/daily-stand-up-variations/"&gt;Daily Stand-up Variations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/02/standup-for-the-future/"&gt;Daily Stand-up is About the Future not the Past&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/08/stand-up-idea-read-up/"&gt;A Stand-up Improvement Idea: Read up the Tasks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/ZHR9uryDMX0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/11/two-ideas-for-stand-up-meetings/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Can the Marshall Model be Presented Differently?]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/V8fpNdk0bhc/" />
    <updated>2012-10-25T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2012/10/marshall-model-differently</id>
    <content type="html">&lt;p&gt;If you follow the recent events and discussions in the Agile/Lean community, you most probably have heard about the &lt;em&gt;&lt;a href="http://flowchainsensei.wordpress.com/rightshifting/"&gt;#rightshifting&lt;/a&gt;&lt;/em&gt; movement, which uses the so called &lt;a href="http://flowchainsensei.wordpress.com/rightshifting/the-marshall-model/"&gt;Marshall Model&lt;/a&gt; to figure out the actual mindset of an organisation and help them to move from a less &lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient"&gt;effective&lt;/a&gt; stage to a more effective one through intermediate stages. When &lt;a href="https://twitter.com/flowchainsensei"&gt;Bob Marshall&lt;/a&gt; was explaining it in practice at &lt;a href="http://leanagilescotland.com/"&gt;Lean Agile Scotland 2012&lt;/a&gt; I was thinking &lt;strong&gt;what if it was possible to skip these intermediate stages?&lt;/strong&gt; When I was looking at the model as a chart, my idea only seemed possible via a huge jump which is always expensive and usually impossible, but &lt;strong&gt;what if the model is not represented as a chart, but a cylinder?&lt;/strong&gt; In this case the transformation does not require a jump: it is &amp;#8220;simply&amp;#8221; a walk from one stage to the other.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;Disclaimer: with this post I have no intention to change or improve the existing model, or create something new. I got an idea which I&amp;#8217;d like to share with you. That&amp;#8217;s all.&lt;/p&gt;

&lt;h3&gt;The Marshall Model&lt;/h3&gt;

&lt;p&gt;Before explaining my idea in more detail, I&amp;#8217;d like to introduce you to the Marshall Model, more precisely the &lt;strong&gt;Marshall Model of Organisational Evolution&lt;/strong&gt; created by &lt;a href="http://flowchainsensei.wordpress.com/"&gt;Bob Marshall&lt;/a&gt; somewhere in 2008 and documented as a &lt;a href="http://www.fallingblossoms.com/opinion/content?id=1006"&gt;White Paper&lt;/a&gt; in October 2010 (by the way, happy birthday!):&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-10-25-marshall-model-differently/marshall_3d.png"&gt;&lt;/p&gt;

&lt;p&gt;It is a chart based model, which defines four major stages, which are, in ascending order of effectiveness: &lt;strong&gt;ad-hoc&lt;/strong&gt;, &lt;strong&gt;analytic&lt;/strong&gt;, &lt;strong&gt;synergistic&lt;/strong&gt;, and &lt;strong&gt;chaordic&lt;/strong&gt;. The goal of the &lt;em&gt;#rightshifting&lt;/em&gt; movement is to help organisations to be more effective by moving to a stage to the right of their current stage, hence the name: &lt;em&gt;#rightshifting&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I have no intention to copy and repeat the whole White Paper, but I need the exact definitions of the &lt;em&gt;ad-hoc&lt;/em&gt; and &lt;em&gt;chaordic&lt;/em&gt; stages in order to explain my idea:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;#8220;&lt;strong&gt;Ad-hoc&lt;/strong&gt;: ad-hoc organisations are characterised by a belief that there is little practical value in paying attention to the way things get done, and therefore few attempts are made to define how the work works, or to give any attention to improving the way regular tasks are done, over time. The Ad-hoc mindset says that if there’s work to be done, just get on and do it - don&amp;#8217;t think about how it&amp;#8217;s to be done, or how it may have been done last time.&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;#8220;&lt;strong&gt;Chaordic&lt;/strong&gt;: the chaordic mindset believes that being too organised, structured, ordered and regimented often means being too slow to respond effectively to new opportunities and threats. Like a modern Jet fighter, too unstable aerodynamically to fly without the aid of its on-board computers, or sailing a yacht, where maximum speed is to be found in sailing as close to the wind as possible without collapsing the sails, a chaordic organisation will attempt to operate balanced at the knife-edge of maximum effectiveness, on the optimal cusp between orderly working and chaotic collapse.&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, in an &lt;em&gt;ad-hoc&lt;/em&gt; mindset, typically chaos reigns, and in the &lt;em&gt;chaordic&lt;/em&gt; mindset there is chaos and order (&lt;em&gt;chaordic&lt;/em&gt; is a made-up word, it was created by mixing the &lt;a href="http://en.wikipedia.org/wiki/Chaordic"&gt;words chaos and order&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;Similarities between the Ad-hoc and Chaordic Mindsets&lt;/h3&gt;

&lt;p&gt;Apparently, all of these stages contain a certain level of chaos. However, when I’m looking at organisations in different kinds of stages from a distance, they all look the same: delivering software without using any formal process. I asked Bob about this, and he said that the difference was the &lt;a href="http://flowchainsensei.wordpress.com/2012/09/26/discipline/"&gt;discipline&lt;/a&gt;. &lt;strong&gt;In my head, if an organisation in an &lt;em&gt;ad-hoc&lt;/em&gt; stage can develop &lt;em&gt;discipline&lt;/em&gt;, it can be ordered, and with that it can get to the most effective &lt;em&gt;chaordic&lt;/em&gt; stage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The second similarity comes from my observations and hypothesis: &lt;strong&gt;the level of understanding creativity&lt;/strong&gt; in &lt;em&gt;ad-hoc&lt;/em&gt; and &lt;em&gt;chaordic&lt;/em&gt; stages is almost the same (side note: I believe that software development is creative work):&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-10-25-marshall-model-differently/marshall_creativity.png"&gt;&lt;/p&gt;

&lt;p&gt;A couple of years ago, I was a member of a team which was clearly in the &lt;em&gt;ad-hoc&lt;/em&gt; stage. Our days were chaotic, and we were so focused on delivering that we didn&amp;#8217;t pay attention to anything else. For example, being more effective - rightshifting - was never discussed, however our solutions were creative and we wanted the next solution to be creative as well. After a while, we realized that we couldn&amp;#8217;t work like this any longer, it was so frustrating that we felt we had to do something about it. The conclusion was that we needed structure, so we gave up creativity and used the freed up time and effort to introduce it. After that, we went through all the stages of the Marshall model and before we got dismissed we spent some time in the &lt;em&gt;chaordic&lt;/em&gt; stage. During this relative short amount of time, we had nostalgic discussions about the creative ideas we used to have in the &lt;em&gt;ad-hoc&lt;/em&gt; stage and how good
those times had been. So, we started to bring these ideas and discussions back to our daily work, and rediscovered the advantages of creativity. Since we were much more disciplined by then, it wasn&amp;#8217;t that hard to do this one last shift and become creative again.&lt;/p&gt;

&lt;h3&gt;Jump from Ad-hoc to Chaordic&lt;/h3&gt;

&lt;p&gt;When I see two stages which have similarities, I immediately start thinking about how to get from one stage to the other, because it may be possible. Unfortunately, it is not that easy in this case, because those two stages are on the opposite edges of the Model, and the immediate transformation is only possible via a huge jump over the whole model:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-10-25-marshall-model-differently/marshall_jump.png"&gt;&lt;/p&gt;

&lt;p&gt;This jump is really expensive and I dare say it is not even possible using the current understanding. It is like learning how to do freestyle swimming on the floor of the living room and the next day heading to the Ocean jumping into it and trying to get out alive.&lt;/p&gt;

&lt;h3&gt;Paradigm Shifting - Different Representation&lt;/h3&gt;

&lt;p&gt;However, &lt;strong&gt;if we give up this thinking and the chart based linear end-to-end approach, and present the stages on a cylinder where one can walk around instead of a chart&lt;/strong&gt;, then we aren&amp;#8217;t talking about a jump any more, because it is a walk from &lt;em&gt;ad-hoc&lt;/em&gt; to &lt;em&gt;chaordic&lt;/em&gt; like this:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-10-25-marshall-model-differently/marshall_cylinder.png"&gt;&lt;/p&gt;

&lt;p&gt;In this representation &lt;em&gt;ad-hoc&lt;/em&gt; and &lt;em&gt;chaordic&lt;/em&gt; can stay next to each other, &lt;strong&gt;because they share common grounds such as the chaos and understanding of creativity&lt;/strong&gt;. The effort to get from &lt;em&gt;ad-hoc&lt;/em&gt; to &lt;em&gt;chaordic&lt;/em&gt; is the effort to build up &lt;em&gt;discipline&lt;/em&gt; in the organisation.&lt;/p&gt;

&lt;h3&gt;Closing Thoughts&lt;/h3&gt;

&lt;p&gt;Again, this is just an idea which came to my mind when I was listening to &lt;em&gt;#rightshifting&lt;/em&gt; talks at Lean Agile Scotland 2012. What do you think about it?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS: I used images and quotes from Bob Marshall&amp;#8217;s White Paper with his permission.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;A related post you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/09/effective-vs-efficient/"&gt;There is a Difference Between Effective and Efficient&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/V8fpNdk0bhc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/10/marshall-model-differently/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[The Hidden Inventory]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/B0YQBKD2Rkk/" />
    <updated>2012-10-16T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2012/10/hidden-inventory</id>
    <content type="html">&lt;p&gt;A couple of days ago, I had a quick conversation with an old friend of mine about the place of done columns - also known as &lt;strong&gt;inventories&lt;/strong&gt; - on the &lt;a href="http://zsoltfabok.com/blog/tag/kanban"&gt;Kanban board&lt;/a&gt;. He wanted to know if the &lt;a href="http://zsoltfabok.com/blog/2010/10/internal-done-columns"&gt;internal done column&lt;/a&gt; - where the work items that have been completed in that phase are kept -, or the &lt;a href="http://zsoltfabok.com/blog/2010/11/the-internal-queue-column"&gt;internal queue column&lt;/a&gt; - where the work items done in the previous phase -, was the better option. There was a time when I would have said that it didn&amp;#8217;t matter, just make it visible, but this time I gave a different answer: &lt;strong&gt;favour the &lt;em&gt;internal done columns&lt;/em&gt; over the &lt;em&gt;internal queue columns&lt;/em&gt;, because a system with &lt;em&gt;internal queue columns&lt;/em&gt; might have hidden inventories&lt;/strong&gt;.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;The story starts with a &lt;em&gt;small push&lt;/em&gt; when one moves the work items to the queue of the next phase:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-10-16-hidden-inventory/push.png"&gt;&lt;/p&gt;

&lt;p&gt;According to the board above, this push is perfectly legal. Let&amp;#8217;s assume for the sake of the example that the developer&amp;#8217;s focus is on finishing as many items as possible in &lt;em&gt;Implementation&lt;/em&gt;, so she pushes &lt;em&gt;Item D&lt;/em&gt; into the queue of &lt;em&gt;Validation&lt;/em&gt; and pulls in &lt;em&gt;Item G&lt;/em&gt;. Let&amp;#8217;s say that the cycle time in &lt;em&gt;Validation&lt;/em&gt; is higher than in &lt;em&gt;Implementation&lt;/em&gt;, so there is a good chance that &lt;em&gt;Item G&lt;/em&gt; will be finished and pushed before &lt;em&gt;Item D&lt;/em&gt; is started in &lt;em&gt;Validation&lt;/em&gt;. The WIP limits are still honored, and &lt;em&gt;Item G&lt;/em&gt; can be pushed into &lt;em&gt;Validation&lt;/em&gt;, but with that it becomes full. The flow will stop when she won&amp;#8217;t be able to pull more items into &lt;em&gt;Implementation&lt;/em&gt; after that fills up as well.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://zsoltfabok.com/blog/tag/flow"&gt;flow&lt;/a&gt; stops because of the temporary slowness of &lt;em&gt;Validation&lt;/em&gt;, but &lt;strong&gt;the problem has been exposed too late, and additionally an inventory has been created in a form of &lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development"&gt;waste&lt;/a&gt;&lt;/strong&gt;. With her &lt;em&gt;push&lt;/em&gt;, she increased the actual capacity of &lt;em&gt;Implementation&lt;/em&gt; with the unused capacity of &lt;em&gt;Validation&lt;/em&gt; and introduced a hidden inventory in the system (actually, she didn&amp;#8217;t do anything &lt;em&gt;wrong&lt;/em&gt; here, because the current system allowed her to do those steps). I called it hidden, because it is not visible until a change happens in the flow. When the hidden inventory becomes visible, it generates different kinds of other waste such as &lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development#muri"&gt;muri&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This problem won&amp;#8217;t make your organization go bankrupt, but can cause some damage, especially when the work in &lt;em&gt;Implementation&lt;/em&gt; and &lt;em&gt;Validation&lt;/em&gt; is done by &lt;a href="blog/2012/03/visualize-on-the-highest-level"&gt;completely separate sub-organizations&lt;/a&gt; (this damage usually manifests as in half-done features, feature studies, or documents waiting to be pulled one day).&lt;/p&gt;

&lt;p&gt;There may be many solutions, I can think of two at the moment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the WIP limits according to the current capacity (this requires measurement of the capability and throughput in the different phases)&lt;/li&gt;
&lt;li&gt;Use &lt;a href="http://zsoltfabok.com/blog/2010/10/internal-done-columns"&gt;internal done columns&lt;/a&gt; instead&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Both of the solutions will signal early enough if there is a disturbance in the flow&lt;/strong&gt;. There is one more obvious, but important detail which is worth mentioning: the inventories must be included in the WIP limits, &lt;strong&gt;not like&lt;/strong&gt; in the example below:&lt;/p&gt;

&lt;p&gt;&lt;img class="center" src="http://zsoltfabok.com/images/posts/2012-10-16-hidden-inventory/large_inventory.png"&gt;&lt;/p&gt;

&lt;p&gt;Here, the flow is not continuous and the &lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development#mura"&gt;mura waste&lt;/a&gt; caused by an unlimited inventory is huge. Of course, the visualization will show when the situation gets critical, but again this signal comes too late when a lot of effort has already been put into the work items staying in the inventory, and that investment won&amp;#8217;t pay off in the near future.&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2010/10/internal-done-columns/"&gt;Internal Done Columns&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2010/11/the-internal-queue-column/"&gt;Internal Queue Columns&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/03/visualize-on-the-highest-level/"&gt;Visualize the Flow on the Highest Possible Level&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/08/waste-in-software-development/"&gt;Waste in Software Development&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/B0YQBKD2Rkk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/10/hidden-inventory/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Cucumber JVM: Hooks]]></title>
    <link href="http://feedproxy.google.com/~r/zsoltfabok/~3/WwlgzV-_Wek/" />
    <updated>2012-09-26T00:00:00+02:00</updated>
    <id>http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks</id>
    <content type="html">&lt;p&gt;&lt;img class="right" src="http://zsoltfabok.com/images/posts/2011-12-02-cucumber-jvm-preparation/merged-logo1.png"&gt;
I finished the &lt;a href="http://zsoltfabok.com/blog/2012/09/cucumber-jvm-web-with-spring-mvc/"&gt;previous post&lt;/a&gt; with the promise that I&amp;#8217;m going write more about &lt;a href="https://github.com/cucumber/cucumber/wiki/Hooks"&gt;hooks&lt;/a&gt; in cucumber. By definition, &lt;strong&gt;hooks allow us to perform actions at various points in the cucumber test cycle&lt;/strong&gt;. The definition wisely doesn&amp;#8217;t say much about these actions and the points where they are executed. They wary from performing prerequisite actions for scenarios to sending emails when a certain step fails. One can ask, What these have to do with the following scenario:&lt;/p&gt;

&lt;!-- more --&gt;




&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;src/test/resources/web_text_munger.feature &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="nl"&gt;Feature:&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;munger&lt;/span&gt; &lt;span class="n"&gt;kata&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nl"&gt;Scenario:&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;sentence&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;Given&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;embedded&lt;/span&gt; &lt;span class="n"&gt;tomcat&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt;      &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;NEW&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;deployed&lt;/span&gt;         &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;NEW&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;Firefox&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;testing&lt;/span&gt;      &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;NEW&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;home&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;enter&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;flow flow&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;press&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="n"&gt;Then&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;folw folw&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;munged&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;flow flow&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;                 &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;NEW&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VERY&lt;/span&gt; &lt;span class="n"&gt;BAD&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;THIS&lt;/span&gt; &lt;span class="n"&gt;HERE&lt;/span&gt;&lt;span class="o"&gt;!)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;The steps marked with &lt;code&gt;# NEW&lt;/code&gt; have nothing to do with the business case of the scenario&lt;/strong&gt;. They are prerequisites that I need done if I want to run the scenario. For these, I need a different kind of approach: I&amp;#8217;ll call these steps in different hooks.&lt;/p&gt;

&lt;h3&gt;Scenario Hooks&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Scenario hooks&lt;/em&gt; can be defined with the &lt;code&gt;cucumber.annotation.Before&lt;/code&gt; and &lt;code&gt;cucumber.annotation.After&lt;/code&gt; annotations (JUnit has the exact same annotations in the &lt;code&gt;org.junit&lt;/code&gt; package, make sure you use the right ones as cucumber will not process JUnit annotations. Don’t try to use JUnit’s &lt;code&gt;@BeforeClass&lt;/code&gt; and &lt;code&gt;@AfterClass&lt;/code&gt; annotations either for the same reason – see also section about &lt;a href="#global_hooks"&gt;global hooks&lt;/a&gt;):&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cucumber.annotation.After&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cucumber.annotation.Before&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@Before&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;beforeScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;munger&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@After&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;afterScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s remove the unnecessary lines from the &lt;code&gt;web_text_munger.feature&lt;/code&gt; and move their content to the &lt;em&gt;scenario hooks&lt;/em&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;src/test/resources/web_text_munger.feature &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="nl"&gt;Feature:&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;munger&lt;/span&gt; &lt;span class="n"&gt;kata&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nl"&gt;Scenario:&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;sentence&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;Given&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;home&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;enter&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;flow flow&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;press&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;     &lt;span class="n"&gt;Then&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;folw folw&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;munged&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;      &lt;span class="n"&gt;And&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;flow flow&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;WebTextMungerStepsdef.java &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@Before&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;beforeScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;munger&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FirefoxDriver&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@After&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;afterScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The scenario executes without any problems and it seems that we are done. Now let&amp;#8217;s run the old &lt;code&gt;simple_text_munger.feature&lt;/code&gt; as well. No problem there either, but a Firefox window just popped up unexpectedly. It seems that the before hook has been executed twice. &lt;strong&gt;The methods annotated with &lt;code&gt;@Before&lt;/code&gt; and &lt;code&gt;@After&lt;/code&gt; are executed before and after every scenario regardless of where they are defined&lt;/strong&gt;. That&amp;#8217;s not good for us right now.&lt;/p&gt;

&lt;h3&gt;Tagged Hooks&lt;/h3&gt;

&lt;p&gt;It is possible to define a hook so that it is only executed before or after scenarios that are tagged with a specified annotation, for example:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;src/test/resources/web_text_munger.feature &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="nl"&gt;Feature:&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;munger&lt;/span&gt; &lt;span class="n"&gt;kata&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nd"&gt;@web&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nl"&gt;Scenario:&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;sentence&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="c1"&gt;// The steps&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;WebTextMungerStepsdef.java &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@Before&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@web&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;beforeScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;// actions&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@After&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@web&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;afterScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="c1"&gt;// actions&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It executes nicely and the test case is green. Let&amp;#8217;s add another scenario to the &lt;code&gt;web_text_munger.feature&lt;/code&gt;. Both are green, no problems here, but the Firefox window popped up twice again. Since both of the scenarios have been tagged, the hooks have been executed twice: once for each scenario. If you have a lot of scenarios, it&amp;#8217;s worth executing the before and after hooks only once in order to save time and resources.&lt;/p&gt;

&lt;h3&gt;&lt;a id="global_hooks"&gt;&lt;/a&gt;Global Hooks: The Hacking&lt;/h3&gt;

&lt;p&gt;Unfortunately, &lt;strong&gt;cucumber &lt;a href="https://github.com/cucumber/cucumber-jvm/pull/295"&gt;doesn&amp;#8217;t support&lt;/a&gt; &lt;em&gt;global&lt;/em&gt; hooks at the moment&lt;/strong&gt;. It is possible to solve this situation, but it is an ugly hack. Let&amp;#8217;s use the first &lt;code&gt;@web&lt;/code&gt; annotation to start the web service and the browser:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;WebTextMungerStepsdef.java &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;EmbeddedTomcat&lt;/span&gt; &lt;span class="n"&gt;tomcat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;EmbeddedTomcat&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;WebDriver&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@Before&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@web&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;beforeScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isRunning&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;munger&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FirefoxDriver&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now the &lt;code&gt;tomcat&lt;/code&gt; and &lt;code&gt;browser&lt;/code&gt; references have nice global states, that&amp;#8217;s why I don&amp;#8217;t really like this solution, but I don&amp;#8217;t have a better one at the moment, so I&amp;#8217;ll try to live with it.&lt;/p&gt;

&lt;p&gt;Closing the browser and stopping the web service is a bit trickier, we don’t know which the last scenario that requires them is, so we should shut them down when the test suite exits. This solution is pretty much the &lt;a href="https://github.com/cucumber/cucumber/wiki/Hooks"&gt;same&lt;/a&gt; as in &lt;a href="http://zsoltfabok.com/blog/tag/ruby"&gt;ruby&lt;/a&gt; because there the &lt;code&gt;at_exit&lt;/code&gt; is proposed to be used in cases like this.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;WebTextMungerStepsdef.java &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='line'&gt;&lt;span class="nd"&gt;@Before&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;@web&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;beforeScenario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isRunning&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;munger&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FirefoxDriver&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRuntime&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;addShutdownHook&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                &lt;span class="n"&gt;tomcat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="o"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Final Words&lt;/h3&gt;

&lt;p&gt;Don&amp;#8217;t let the previous example discourage you from using hooks. They provide a great opportunity for setting up scenarios and cleaning up afterwards. The code is available under the &lt;a href="https://github.com/ZsoltFabok/cucumber-jvm-post/tree/episode_6"&gt;episode_6&lt;/a&gt; branch on &lt;a href="https://github.com/ZsoltFabok/cucumber-jvm-post"&gt;github&lt;/a&gt;. Happy testing!&lt;/p&gt;

&lt;h4&gt;Related posts you may find also interesting:&lt;/h4&gt;


&lt;ul&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2011/12/cucumber-jvm-preparation/"&gt;Cucumber JVM: Preparation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2011/12/cucumber-jvm-more-scenarios/"&gt;Cucumber JVM: More Scenarios&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/01/cucumber-jvm-di/"&gt;Cucumber JVM: Dependency Injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/03/cucumber-jvm-mocking/"&gt;Cucumber JVM: Mocking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zsoltfabok.com/blog/2012/09/cucumber-jvm-web-with-spring-mvc/"&gt;Cucumber JVM: Web Application with Spring MVC&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;



&lt;img src="http://feeds.feedburner.com/~r/zsoltfabok/~4/WwlgzV-_Wek" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/</feedburner:origLink></entry>
  
</feed>
