<!DOCTYPE html>
<html lang="en">
<head>
    

    






    
    
    

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Chuck Durfee</title>

    <meta name="description" content="The neon tapir, casting his eerie glow upon the masses">

    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="canonical" href="http://neontapir.github.io/">
    <link rel="alternate" type="application/atom+xml" title="Chuck Durfee" href="http://neontapir.github.io/feed.xml" />

    
    
    

    <meta property="og:title" content="Chuck Durfee" />
    <meta property="og:type" content="website" />
    <meta property="og:image" content="/assets/img/tapir.png" />
    <meta property="og:url" content="http://neontapir.github.io/" />
    <meta property="og:site_name" content="Chuck Durfee" />
    <meta property="fb:admins" content="" />
    <meta property="fb:app_id" content="710997945694360" />
    <meta property="og:description" content="The neon tapir, casting his eerie glow upon the masses" />

    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
    <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:400,700,700italic,400italic" rel="stylesheet">

    <link href="/assets/lib/easy-social-buttons/jquery.easy-social-buttons.css" rel="stylesheet">
    <link href="/assets/css/style.css" rel="stylesheet">
</head>
<body>

<header class="site-header">
    <div class="inner clearfix">
        
        <a href="/">
            <img class="avatar" src="/assets/img/tapir.png" alt=""/>
        </a>
        
        <h1 class="clearfix">
            <a class="title " href="/">Chuck Durfee</a>
            <p class="description">The neon tapir, casting his eerie glow upon the masses</p>
        </h1>
    </div>
</header>

<div class="site-container">
    <div class="site-content">
        
<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/op-ed/2015/08/12/conversion-to-jekyll/">Conversion to Jekyll</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=jekyll">#jekyll</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2015-08-12
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/op-ed/2015/08/12/conversion-to-jekyll/" data-title="Conversion to Jekyll | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p><img src="/assets/jekyll-logo.png" alt="Jekyll"></p>

<p>I&#39;ve decided to convert this site from Wordpress to
<a href="http://jekyllrb.com/">Jekyll</a>, a Ruby static site generator that&#39;s suitable for
use with <a href="https://pages.github.com/">GitHub Pages</a>. GitHub Pages is attractive
because publishing is as easy as committing files to a repository.</p>

<p>I&#39;m using <a href="https://github.com/qckanemoto/jekyll-qck-theme">Qck-Theme</a> to style
the site, because it has a little customized theming, but is still simple.</p>

<p>Getting started is easy, although I learned a few things the hard way. I ended
up having to get help from GitHub Pages support, and their technicians were fast
and very knowledgable. Kudos to James and Steven!</p>

<p>First recommendation is to install Jekyll locally for site development. If you
plan to use GitHub Pages to host your site, do yourself a favor and use the
<a href="https://github.com/github/pages-gem">pages-gem</a> to install Jekyll and its
dependencies. It uses the same versions of the gem files that GitHub does, so
you can eliminate some causes of odd behavior that way.</p>

<p>Second, this is open source software, so contribute where you can. I learned a
lot about Jekyll and how it generates sites by doing keyword searches on GitHub
through my theme&#39;s source code. I also found behavior worth a feature request
and a bug. When you fix it locally, isolate the fix and submit a patch!</p>

<p>I used the <a href="http://import.jekyllrb.com/docs/wordpressdotcom/">WordpressDotCom
importer</a>  to pull my site
data from neontapir.com. It did a fairly good job, but there were a couple
gotchas.</p>

<p>The most annoying was that the importer used relative paths to the <code>/assets</code>
folder, where the images are stored. This meant that almost all the images on
the site were broken.</p>

<p>I used a command like this to fix it:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">ls _posts/* _pages/* | xargs perl -pi -e &#39;s/img src=&quot;assets/img src=&quot;\/assets/&#39;
</code></pre></div>
<p>A more insidious issue had to do with a bug in Jekyll itself. By the time you
read this, it&#39;s probably already been fixed, but Jekyll doesn&#39;t handle time
zones in the post dates in the front matter of articles. (Front matter is what
Jekyll calls post metadata like title, description and publication date.)</p>

<p>It manifested in an inability for the <code>post_url</code> directive to find other posts
by filename, even though they were in the folder. Files have the date encoded in
them, and the search function noticed there was a mismatch between the date in
the filename and in the front matter, so it wouldn&#39;t return the file. This
caused a site build failure that I couldn&#39;t reproduce locally.</p>

<p>The imported site was usable almost immediately, but it took another 2-3 hours
to get it looking half-decent. Most of that time was looking for links to other
posts and replacing them with post_url directives, as well as configuring
social sharing buttons and Disqus for comments.</p>

<p>Overall, I&#39;d recommend it. For me, Jekyll lowers the barrier to entry for
writing new content, even if it&#39;s not as fully featured. That having been said,
I rarely used many of the features Wordpress offers.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/podcast/2015/02/07/acw-100-subs/">Agile Chuck Wagon is gaining subscribers</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=agile">#agile</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=podcast">#podcast</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2015-02-07
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/podcast/2015/02/07/acw-100-subs/" data-title="Agile Chuck Wagon is gaining subscribers | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p><img src="/assets/agile-chuck-wagon-banner-300x209.jpg" alt="agile-chuck-wagon-banner" width="300" height="209" class="alignright size-medium wp-image-1426" /></p>
<p>The Agile Chuck Wagon is gaining steam. See what the buzz is about!</p>
<p>Visit the <a href="http://durfweb.com/agile-chuck-wagon">Agile Chuck Wagon category on durfweb.com</a> to see past episodes, which have included:</p>
<ul>
<li> Introduction to Kanban
</li>
<li> Mile High Agile 2015
</li>
<li> Principles of Kanban
</li>
<li> Lean Coffee
</li>
</ul>
<p>Upcoming episodes include:</p>
<ul>
<li> the Decorator pattern
</li>
<li> Offshore Teams
</li>
<li> the getKanban game
</li>
<li> Models of Change
</li>
</ul>
<p>Thanks for listening!</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/podcast/2015/01/21/announcing-agile-chuck-wagon-podcast/">Announcing the Agile Chuck Wagon podcast</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=podcast">#podcast</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2015-01-21
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/podcast/2015/01/21/announcing-agile-chuck-wagon-podcast/" data-title="Announcing the Agile Chuck Wagon podcast | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <div style="float: right; padding: 1em;"><a href="http://durfweb.com/wp-content/uploads/2015/01/agile-chuck-wagon-banner-1400x1400.jpg"><img class="alignnone size-medium wp-image-29" src="assets/agile-chuck-wagon-banner-1400x1400-300x300.jpg" alt="agile-chuck-wagon-banner-1400x1400" width="300" height="300" /></a></div>
<p>I'm pleased to announce the Agile Chuck Wagon podcast! Each episode will be a short talk about an agile or lean software delivery topic, including techniques like design patterns that help teams stay agile. Please join me!</p>
<p>Topics ready for release include an introduction to the principles of Kanban, the decorator pattern, and offshore teams.</p>
<p>Here's a link to the first episode:</p>
<p><iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/3680595/height/360/width/640/theme/standard/direction/no/autoplay/no/autonext/no/thumbnail/yes/preload/no/no_addthis/no/" height="360" width="640" scrolling="no"  allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen></iframe></p>
<p>If you have comments or suggestions for topics, please leave a comment on the <a href="http://wp.me/p59wLS-j">Durfweb post</a>. Future announcements about the podcast will appear there.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/rpg/tabletop/2014/10/22/fashion-police-1/">Actual Play: Feng Shui 2 RPG with the Fashion Police</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=feng shui rpg">#feng shui rpg</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=feng-shui">#feng-shui</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=one-shot">#one-shot</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=rpg">#rpg</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-10-22
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/rpg/tabletop/2014/10/22/fashion-police-1/" data-title="Actual Play: Feng Shui 2 RPG with the Fashion Police | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p><img class="alignright size-full wp-image-1421" src="assets/5f083_fashion_police.jpg" alt="fashion_police_badge" width="300" height="283" /></p>
<p>This weekend, I got a chance to run the <b>Feng Shui 2 </b>roleplaying game for my two youngest kids, ages 17 and 16. Even though I backed the Kickstarter almost a month ago, I hadn't had time to read the rules fully, so I went off my memory of the One Shot podcast (<a class="ot-anchor aaTEdf" href="http://peachesandhotsauce.com/podcasts/feng-shui-2-part-1" target="_blank" rel="nofollow">http://peachesandhotsauce.com/podcasts/feng-shui-2-part-1</a>).</p>
<p>I got many of the details of the system wrong, but the spirit was right and we all left eager for more! The Feng Shui system means to evoke the feel of an action movie, and it succeeds admirably.We had a blast describing our moves, punctuated with cheesy one liners.</p>
<p>This new edition also streamlines the first edition, which I'd played about five years ago. It's hard to believe it's only been five years -- the storytelling aspect of roleplaying games has bloomed in just a few short years.</p>
<p>Players in Feng Shui play "chi warriors", and their characters vie for control of sites of mystical power called feng shui sites.</p>
<!-- more -->
<p>My daughter Hannah chose the Spy archetype, but she ended up investigating the situation to learn more about her foes, so Hannah switched her character Scarlet to be a Private Investigator at the end of the session. Scarlet comes from the post-apocalyptic Juncture -- another change from the previous edition of the game -- but that didn't factor into play much.</p>
<p>My son Riley was a Thief named Colm, born in medieval times. In the Feng Shui setting, characters can access a handful of stable time periods called Junctions to choose from, but his wasn't one of them. Rather than redirect him, I ruled that Colm accidentally got sucked into the Netherworld (a nebulous location that connects Junctures) and can't get back to his home time. Riley was really attached to the idea of Colm's immortality, so I said that he's been taking longevity potions for a while now and really is too old to live without them.</p>
<p>This initial session consisted entirely of a fight that started in an upscale department store at the mall. The pair noticed they were surrounded by creepy mannequins that were advancing on them. Both Colm and Scarlet paused in the action to upgrade their wardrobe with items off the rack, so I dubbed them the .</p>
<p>Colm took a few of the mooks out with some nicely choreographed strikes, and I got to describe the emotionless faces of the mannequins as their limbs were severed and they kept advancing, Toy Story style. Scarlet ran for the household appliances, and used kitchen knives and ceramic plate shards to make mincemeat of her mannequins.</p>
<p>When the mannequins couldn't stop the heroes, one mook ran off and brought a featured foe named Qi-shi, a mysterious fire sorcerer in a green, fireproof Mandarin tunic. "At last, the chi warriors have arrived!", he said. Hannah realized that her Guns skill was her primary attack, so she tried to shoot Qi-shi, but her errant shot set off the store's security system and brought down the gates, trapping the duo in the store!</p>
<p>Even with his commanding entrance, his fire whip and softballs of fire, Qi-shi barely managed to set Colm's duster ablaze in the perfume department, so Qi-shi spent most of the fight retreating. (I had the combat rules wrong, thinking that initiative reset when the location changed.)</p>
<p>When it was clear Qi-shi could not best the team, the sorcerer burned a hole through the store's security fence to duck into a tea shop, just a step in front of the heroes. The front was teapots and teas for sale, the back was a suburban replica of a Japanese tea house. Not being one for subtlety, Colm bashed through some rice paper walls into what seemed like a serious Japanese business meeting with guns on the table. [Thanks to my other son Diego for the suggestion -- I'm sure those suits will become important later.]</p>
<p>Scarlet, being sensible, pressed her advantage and drove him into the back of the store. In fact, Qi-shi kept retreating so far that he led the duo through a portal into the Neverworld that led to Qi-shi's home Juncture, China's Ancient past....</p>
<p>Colm leapt through the rice paper wall next to the portal, so I ruled that he tumbled uncontrollably through the Netherworld. However, he did so well on his recovery role -- yay for getting exploding sixes twice -- that we decided he burst through the ceiling of an apothecary shop in a three-point landing with the sun shining through the roof like a spotlight, just as Qi-shi came through the portal with Scarlet at his heels.</p>
<p>Even in this city where magic is strong, Qi-shi has proven no match for our pair of chi warriors. His billowing dust attack was made useless when Colm leapt to the rooftops and Scarlet pulled out clear-vision goggles and a breather mask and charged right on through.</p>
<p>We left with Qi-shi at the Fashion Police's mercy. When we next play, it will be interesting to see what Qi-shi will say when pressed to explain why he attacked them, and why he was on the lookout for chi warriors in the first place....</p>
<p>Can't wait!</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/process/professional/2014/09/14/hoosiers-moneyball/">Agile Methodologies as Sports Movies: Hoosiers and Moneyball</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=kanban">#kanban</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=movie">#movie</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=movies">#movies</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=scrum">#scrum</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-09-14
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/process/professional/2014/09/14/hoosiers-moneyball/" data-title="Agile Methodologies as Sports Movies: Hoosiers and Moneyball | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p>An article in Business Week made me think about sports movies as a metaphor for agile methodologies.</p>
<p><a href="http://neontapir.com/wp/wp-content/uploads/2014/09/hoosiers.jpeg"><img class="alignright size-full wp-image-1414" src="assets/hoosiers.jpeg" alt="hoosiers" width="220" height="160" /></a></p>
<p>To me, Scrum is like the 1986 film <a href="http://en.wikipedia.org/wiki/Hoosiers"><em>Hoosiers</em></a>. Norman Dale, played by Gene Hackman, takes over a small-town basketball team. The group is undisciplined; Dale dismissed two of the original seven players because they weren't paying attention. Dale spends a lot of time drilling basketball basics into the team, without scrimmages. Dale's methods are unpopular and his is almost ousted as coach. Results are slow in coming, but as Dale's team adjusts to this new style of play, they begin to show signs of success, win games, and -- well, it's a sports movie.</p>
<p>I like this movie because while the plot is about a basketball team, the heart of the movie is about Dale and the transformation the characters undergo together. Hackman is outstanding as Coach Dale, and manages to make a complex character come to life. Historical inaccuracies aside, <em>Hoosiers</em> is worth watching.</p>
<p>I think scrum masters would empathize with some of the challenges Dale faced. The townspeople were unsupported of Dale's harshness with the town's star players, who was kicked off the team in the beginning of the film for not paying attention. As a scrum master, I've encountered departments and managers who exhibited a similar lack of support for agile methods.</p>
<p>Dale's conservative, defensive style of play was not exciting to watch, and the team struggled with it in the beginning. I think teams struggle with Scrum at first, especially with some of the technical practices that facilitate Scrum like pair programming, test-first development (TDD) and behavior-driven development (BDD). A successful Scrum team is careful to commit to workloads they know they can accomplish, knowing that as they develop a cadence, they will gather speed.</p>
<p><a href="http://neontapir.com/wp/wp-content/uploads/2014/09/moneyball.jpeg"><img class="alignright wp-image-1415 size-medium" src="assets/moneyball-300x124.jpeg" alt="Moneyball" width="300" height="124" /></a></p>
<p>By contrast, I think Kanban is more like <a href="http://en.wikipedia.org/wiki/Moneyball_(film)"><em>Moneyball</em></a>. Last week's Business Week article called <a href="http://www.businessweek.com/articles/2014-08-28/extreme-moneyball-houston-astros-jeff-luhnow-lets-data-reign">Extreme Moneyball: The Houston Astros Go All In on Data Analysis</a> is a sequel of sorts. It talks about how the Astros, like the Oakland A's in the film, have started aggressively analyzing baseball data and exploiting new strategies to win. The article goes into good detail about how Moneyball might apply to modern business, so I won't repeat that here.</p>
<p>Looking over the metrics of a Kanban team feels a lot like being Jonah Hill's character Peter Brand, who uses that in-game statistical analysis, that <a href="http://en.wikipedia.org/wiki/Sabermetrics">sabermetrics</a> approach to selecting undervalued talent and signing them. I'm not alone in that thought: the book that the movie is based on, <i>Moneyball: The Art of Winning an Unfair Game</i> by Michael Lewis, is popular in business circles. Despite the reservations of most everyone, that A's team of seemingly average players goes on to be wildly successful.</p>
<p>I'm pouring over my Kanban team's metrics to see if I can find some commonality with features and stories that are causing my team trouble. There are some features that move through the system like clockwork. There are others that slow during development and gum up the works. For example, if I can determine that one component features prominently in those stories, I'll know that those stories need special handling.</p>
<p>I think a good Kanban team lead needs a little of Coach Dale as well as a little Peter Brand in them. Heart plus smarts for the win.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/coding/process/2014/09/05/bash-ruby-kanban-experience-report/">From Bash to Ruby: A Kanban experience report</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=bash">#bash</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=docker">#docker</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=kanban">#kanban</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=rspec">#rspec</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=ruby">#ruby</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=script">#script</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=slop">#slop</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=vagrant">#vagrant</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=vcr">#vcr</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-09-05
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/coding/process/2014/09/05/bash-ruby-kanban-experience-report/" data-title="From Bash to Ruby: A Kanban experience report | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p><a href="http://neontapir.com/wp/wp-content/uploads/2014/09/rubylang.png"><img class="alignright size-full wp-image-1410" src="assets/rubylang.png" alt="rubylang" width="128" height="128" /></a></p>
<p>In the intervening months since my last post, the project has accelerated significantly. We released the first version of the platform, and now are adding features to meet an aggressive migration schedule. I even traveled to Minsk, Belarus to meet our contractor team, to do some process training, and to discuss strategies for improving our communication and throughput.</p>
<p>There have been some process improvements too. I got tired of manually inputting the output of <a href="http://neontapir.com/wp/2014/06/rally-data-extract-scripts-kanban-experience-report/">my Bash script</a>, so I converted the script into a <strong>Ruby</strong> program. I wanted to share some of the implementation details, specifically the libraries I used. I am a Ruby novice, so I consciously chose not to use the Rally gem that's available as a learning experience.</p>
<p>The application now supports two output modes: screen (the original output) and a pipe-delimited export file. My needs are very simple, so I use <strong>slop</strong> for command-line option parsing. The Ruby script also accepts an input file, instead of getting data one work item at a time.</p>
<p>I chose <strong>mustache</strong> as a template engine, and implemented the Strategy design pattern to switch between them based on a command-line parameter. While mustache is frequently used for HTML output, I found that it handles plain-text output just as well.</p>
<p>I'm using <strong>rspec</strong> for testing. I could not have gotten this application working without <strong>vcr</strong>. This application makes a lot of REST calls via <strong>rest-client</strong> and <strong>json</strong>, and I didn't want to spam Rally every time I ran my test suite. With the vcr module in place, I captured the result of those calls once, and they are replayed when the code under test requests data. Pure gold.</p>
<p>While I can use the pipe-delimited export file as a data feed for Excel, the script will need some features to emulate some "processing" I was doing by hand. For example, there are still times when work items are moved backward on the Kanban board. In those cases, the Ruby script reports a negative duration in a process state.</p>
<p>However, the script has had to wait. I've been tasked with getting a Vagrant image and Docker environment for our platform created. The immediate need is so that we can on-ramp temporary developers quickly. There are other use cases, though. We could use Docker as a way to deploy our platform to a cloud provider. We could use the image for our sales folks, who could use a standalone configuration of the platform to demonstrate products to customers. I partnered with our build engineer, and I'm testing the first version now.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/process/professional/2014/06/26/process-violations-kanban-experience-report/">Process Violations: a Kanban experience report</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=experience">#experience</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=kanban">#kanban</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=pizza">#pizza</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=process">#process</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=step">#step</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=story">#story</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=violations">#violations</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-06-26
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/process/professional/2014/06/26/process-violations-kanban-experience-report/" data-title="Process Violations: a Kanban experience report | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p><a href="http://neontapir.com/wp/wp-content/uploads/2014/06/violations.jpeg"><img src="assets/violations.jpeg" alt="violations" width="226" height="223" class="alignright size-full wp-image-1373" /></a></p>
<p>This is the fourth in a series of blog posts about implementing Kanban on my current project. The first installment was about <a href="http://wp.me/p2vhlC-lM">establishing the flow</a>. The second described the <a href="http://wp.me/p2vhlC-lS">Rally data extract scripts</a> I wrote. The third about <a href="http://wp.me/p2vhlC-lX">my Excel spreadsheet</a> that consumes the data. This post is about Kanban flow process violations.</p>
<p>I enter the number of state change violations that occurred, either by a story skipping a step or going backward across the board. I wish Rally had stronger means to discourage people from these kinds of violations! For me, simply marking a nonconforming column red is not strong enough.</p>
<p>During the first milestones, I took an approach of education. Now that we've been using the board consistently for a few months, I am stricter about process violations. I've pointed out there's a strong correlation between stories that skip steps in the process and the amount of time stories stay blocked.</p>
<p>I want to share with you the contents of an email I wrote about these process violations. I think it gives you an example of my style, as well as being a useful analogy. Without further ado:</p>
<div style="background:#DDDDDD;padding:1em">
I’ve noticed an increase in state change violations. These fall into a few categories:</p>
<ul>
<li>Story skips steps without meeting exit criteria</li>
<li>Story goes backward across the board</li>
<li>Story “pushed” into next step instead of being marked ready</li>
</ul>
<p>Let me use an analogy that is hopefully familiar to all of us, ordering pizza for delivery. (Of course, it doesn’t look like your city has a lot of pizza delivery, so you might have to work with me a little bit.)</p>
<p>Here’s a screenshot from Domino’s Pizza’s web site, that shows a Kanban flow for a single work item (that is, your pizza).</p>
<p><a href="http://neontapir.com/wp/wp-content/uploads/2014/06/dominos-kanban-flow.png"><img src="assets/dominos-kanban-flow-300x129.png" alt="dominos-kanban-flow" width="300" height="129" /></a></p>
<p>This closes matches the backend flow:</p>
<table>
<tr>
<td>Backend Step
</td>
<td>Domino’s Step
</td>
</tr>
<tr>
<td>Ready
</td>
<td>Order Placed
</td>
</tr>
<tr>
<td>Design
</td>
<td>Prep
</td>
</tr>
<tr>
<td>Development
</td>
<td>Bake
</td>
</tr>
<tr>
<td>Validation
</td>
<td>Quality Check
</td>
</tr>
<tr>
<td>&nbsp;
</td>
<td>Out for delivery
</td>
</tr>
<tr>
<td>Accepted
</td>
<td>(Delivered)
</td>
</tr>
</table>
<p>Let’s talk about each of the violations above in turn.</p>
<p><strong>Skip steps</strong></p>
<p>An example of this would be if a pizza moved from step 2 (prep) to step 4 (quality check). In this case, the person putting the pizza in the box would notice that it isn’t cooked. They would walk back to the prep station and have a discussion with the prep person. While they are talking, no pizzas are moving through the oven, which slows the delivery of all the pizzas in the line.</p>
<p>The most common violation I see in our current flow is that a story is created and is immediately put in Development. In doing so, the Ready and Design steps are skipped. Those stories don’t have many details and no testing criteria. This causes problems in the Validation step, since the person doing QA is left wondering what changed and what should be tested.</p>
<p><strong>Moving backwards</strong></p>
<p>An example would be if a pizza moved from step 3 (bake) to step 2 (prep). Once a pizza is baked, it doesn’t go back through prep. If a topping is missed, the pizza is rejected and a new one is made. You can’t re-bake a pizza and still have it taste good.</p>
<p>Rather than thinking of a story’s column as its current state, think of it as being the most advanced state a story has achieved. If a story needs rework, just get the proper resources involved and do the missing work. If there’s a problem or the story needs attention, use blocking as a signal.</p>
<p><strong>Story is “pushed” instead of marked ready</strong></p>
<p>Let’s say our pizza just finished baking (step 3). Who takes the pizza out of the oven? There’s a gap between when the pizza leaves the oven and when the quality check begins. Usually, it’s the QA person and the time between the oven and the quality check station is negligible. In this situation, it doesn’t seem like there would be any harm in marking the pizza as being in step 4 when it comes out of the oven.</p>
<p>Now let’s imagine that pizzas go through the oven twice as fast. Now the manager is having to remove pizzas from the oven before they burn, but QA hasn’t started yet. If the pizza goes into step 4 immediately, it looks like the QA station is doing twice the amount of work it’s doing. This is a false signal. Really, the QA station isn’t twice as good, it needs help!</p>
<p>When a story has met the exit criteria for a step, it should be marked ready. When someone is ready to do that work, they move the story into the next column. Because the work is done by the same person in many of the columns , sometimes this step is forgotten.</p>
<p>In fact, the procedure really looks like this:</p>
<ol>
<li>Finish getting story ready for next step</li>
<li>Check board from right to left for work that is ready to move to the next step</li>
<li>Take the furthest right, top-most item and go to step 1</li>
</ol>
<p>I see that step 2 is often neglected, and that people look for stories that are in their area of expertise first. I would challenge each of you to go through this exercise and see whether you end up on the story you expected to. I think you’ll find there are a number of times when you would end up arriving at a different story — validating a story instead of beginning design work, for example. If we were to do this more strictly, we’d eventually find that we gained a base comfort level in all areas of the application, which is a better position to be in that a group of specialists.</p>
<p><strong>Conclusion</strong></p>
<p>Consider this email <em>food for thought</em>. During Beta, I’ll continue to point out process violations and work with team leads to resolve them.</p>
<p>Regards,<br />
Chuck</p>
</div>
<p>There are a couple of things to mention about this. I think this email was effective, because I overheard people using this analogy to explain problems. I really like to connect abstract flows like software delivery to everyday experiences.</p>
<p>Also, there are exceptions to the advice given above. For example, some stories of certain classes of service like defects may not follow the same workflow as a standard story. Also, in certain edge cases, it might make sense to move a story backward across the Kanban board. But, for this audience, I didn't want to go that deep. I'll introduce those subtle nuances later.</p>
<p>This is the last post in this initial run of posts. I do intend to delve deeper into certain metrics and charts I'm producing as the project progresses.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/process/professional/2014/06/19/excel-spreadsheet-metrics/">Excel spreadsheet for metrics: a Kanban experience report</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=chart">#chart</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=day">#day</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=kanban">#kanban</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=lead">#lead</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=story">#story</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=week">#week</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-06-19
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/process/professional/2014/06/19/excel-spreadsheet-metrics/" data-title="Excel spreadsheet for metrics: a Kanban experience report | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p>This is the third in a series of blog posts about implementing Kanban on my current project. The first installment was about <a href="http://wp.me/p2vhlC-lM">establishing the flow</a>. The second described the <a href="http://wp.me/p2vhlC-lS">Rally data extract scripts</a> I wrote. In this post, I talk about my Excel spreadsheet that consumes the data.</p>
<p><a href="http://neontapir.com/wp/wp-content/uploads/2014/06/abacus.jpg"><img src="assets/abacus-300x300.jpg" alt="abacus" width="300" height="300" class="alignright size-medium wp-image-1376" /></a></p>
<p>All of the data exists on a "Stories" tab. I collect the formatted ID, the date the story first entered each state, and the lead developer and quality engineer. When a story is Accepted or Rejected, I run the story query script and input that data.</p>
<p>I also do some data normalization. For example, my story query script does not take weekends and holidays into account, but the spreadsheet does. Neither team currently does story size estimation, but I derive a story's size by taking the total number of hours the story was being worked and apply each story to the typical story point Fibunacci sequence using a Bell curve. Values like holidays and the story point sequence exist on a Lookups sheet.</p>
<p>With this data, I can calculate a number of interesting metrics. The data from the Stories worksheet is aggregated onto the Days worksheet, and Days onto both the Weeks and Days of Week worksheet. These populate charts like the <a href="http://brodzinski.com/2013/07/cumulative-flow-diagram.html">Continuous Flow Diagram</a>. I took the Accepted stories data from the CFD and some <a href="http://en.wikipedia.org/wiki/Takt_time">Takt time</a> calculations to project future delivery.</p>
<blockquote><p>
  This calculation became invaluable during week three and four of the first milestone release. I was able to tell the team that they need to get 4 stories accepted a day in order to reach the milestone goal. We ran into a blocking issue, and we got up to 5-6 stories per day. The team responded by swarming on the roadblock and collaborating to shepherd the logjam through the system and got us back on track.</p>
<p>  While many individuals worked many late nights, we only had one mandatory evening of work on the last night of the project. Fueled by pizza, we solved our last integration challenge and were done by 8pm. To me, this made all the hours of work developing the spreadsheet and time putting in data worthwhile. I think if the team hadn't rallied when they did, the last week before delivery would have been very painful indeed.
</p></blockquote>
<p>I'm also breaking down story data by dev lead, QA lead, tag and location. While I'm aware of the potential uses of individual performance data, so far there are no strong patterns to observe. I get dev lead and QA lead from the senior person who's making changes in Rally. My heuristic is a workaround for the limitation that a story in Rally can only have a single owner. We change the owner of the story during its lifecycle on the board to know who to talk to about the story at any given time.</p>
<p>Originally, the Tag field was going to be used to slice data by Rally tag, but I ended up using it to track work by component. I parse story titles to determine what component(s) they affected. Again, not ideal, but good enough for now.</p>
<p>I also look at other daily metrics. I monitor the number of story changes made per day, for example, to see how active the team is.</p>
<p><a href="http://neontapir.com/wp/wp-content/uploads/2014/06/day-of-week-chart.png"><img src="assets/day-of-week-chart-300x165.png" alt="day-of-week-chart" width="300" height="165" class="alignright size-medium wp-image-1362" /></a></p>
<p>As you can see, stories are most active on Tuesdays. Early in the project, there was a spike on Thursdays as well, but over time, that's dampened.</p>
<p>I look in changes in key metrics over time. For example, I see wide fluctuations in the amount of development time, but much steadier validation times over the life of the project.</p>
<p>Next time, I'll talk about Kanban flow process violations.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/coding/process/professional/2014/06/12/rally-data-extract-scripts-kanban-experience-report/">Rally data extract scripts: a Kanban experience report</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=bash">#bash</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=data">#data</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=experience">#experience</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=kanban">#kanban</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=script">#script</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=story">#story</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-06-12
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/coding/process/professional/2014/06/12/rally-data-extract-scripts-kanban-experience-report/" data-title="Rally data extract scripts: a Kanban experience report | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p>This is the second in a series of blog posts about implementing Kanban on my current project. The first installment was about <a href="http://wp.me/p2vhlC-lM">establishing the flow</a>. This post talks about obtaining the data for the Kanban metrics. Later posts talk about the Excel spreadsheet that consumes the data.</p>

<p><a href="http://neontapir.com/wp/wp-content/uploads/2014/06/script-bash.jpg"><img src="assets/script-bash.jpg" alt="script-bash"></a></p>

<p>My employer has standardized on <a href="http://www.rallydev.com/">Rally</a>, so we are using it for work item management. However, I&#39;ve found that its Kanban flow support is not as robust as I need. I wanted to create several additional charts on some derived values, so I manually input some data for each story into Excel for my formulas and charts. Of course Rally supports custom applications in JavaScript, but I didn&#39;t relish the thought of performing statistical analysis in raw JavaScript. I chose to continue to use Excel for my metrics gathering.</p>

<p>After creating the first few, I started exploring the data and made more. At first, I would scour the revision history for the data I needed, but I quickly desired some automation. I wrote two shell scripts that query Rally&#39;s APIs for data. It currently takes me about 15 minutes a day of data entry to keep pace with the teams, which is short enough that I haven&#39;t taken the next step of converting a derivative of that script into a Excel data source.</p>

<p>Here&#39;s the output of my script, with some of the project-specific data scrubbed. I used <a href="http://www.fakenamegenerator.com/">Fake Name Generator</a> to come up with poor Richard.</p>

<blockquote>
<p>Fake Name Generator generates a lot more than names. Except when I&#39;m looking for character ideas for a story I&#39;m writing, I only use it for realistic test data.</p>
</blockquote>
<div class="highlight"><pre><code class="language-text" data-lang="text">$ ./storyQuery.sh 53142
US12345 -- Reorganize test packages to support ease of testing
Project: Backend
Release: BETA
Tags:

State changes
18641196378  2014-05-29  None         -------  Cedric Jorgenson
Beta         2014-05-29  None         -------  Cedric Jorgenson
Beta         2014-05-29  Ready        -------  Cedric Jorgenson
Beta         2014-05-29  Design       -------  Gary Bennett
Beta         2014-05-29  Development  -------  Peggy Bivens
Beta         2014-05-30  Validation   -------  Richard Chenier
Beta         2014-05-30  Validation   BLOCKED  Chuck Durfee
Beta         2014-05-30  Validation   -------  Richard Chenier
Beta         2014-05-30  Accepted     -------  Cedric Jorgenson

User Count: 2
Defects: 0 (NONE)
Blocked: 1 hours
Design: 0 hours
Development: 25 hours
Ready: 0 hours
Validation: 0 hours
</code></pre></div>
<p>As you can see, the script uses both the story details and <a href="https://rally1.rallydev.com/analytics/doc/">Lookback</a> APIs to get a concise history of the story. The story details API only provides rollup information; I need the Lookback API to get revision history.</p>

<p>In this case, Cedric is the <a href="http://www.mountaingoatsoftware.com/agile/scrum/product-owner/">product owner</a>, Gary is a quality engineer, and Peggy and Richard are developers on the project. Richard didn&#39;t implement the story, so he&#39;s handling validation. On stories that are risky or important to the project, a quality engineer will also perform ad-hoc testing.</p>

<p>My script doesn&#39;t do separate lookups to obtain names for person or release IDs, as you can see by the <code>18641205378</code> in the first line. For some enumerated value fields, you can request that Rally &quot;hydrate&quot; a field, but the updating user and release are not among them. Though written in <a href="http://www.gnu.org/s/bash"><code>bash</code></a>, my script uses a <a href="http://www.perl.org/">Perl</a> associative array to inject the names into the output. While there&#39;s a more complete call example later, that Perl call looks like this:</p>

<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="p">|</span> perl -pe <span class="s1">&#39;%users = (</span>
<span class="s1"> &quot;10624400656&quot;,&quot;Cedric Jorgenson&quot;,</span>
<span class="s1"> &quot;1191677143&quot; ,&quot;Chuck Durfee&quot;,</span>
<span class="s1"> &quot;12294673246&quot;,&quot;Gary Bennett&quot;,</span>
<span class="s1"> &quot;13318093404&quot;,&quot;Peggy Bivens&quot;,</span>
<span class="s1"> &quot;13304263924&quot;,&quot;Richard Chenier&quot;,</span>
<span class="s1"> );</span>
<span class="s1"> foreach $key (keys %users) { s/$key/$users{$key}/g; }</span>
<span class="s1"> &#39;</span> <span class="se">\</span></code></pre></div>

<p>The <code>-e</code> option lets you execute Perl scripts inline. The <code>-p</code> option runs the script on each line in turn.</p>

<p>I use a separate query script to get a new person&#39;s name and update the script, which I run a handful of times a month. I get the release by hand, since setting up releases happens only a few times a year.</p>

<p>Here&#39;s how the story query script makes one of the Lookback API REST call gets some of its data. I defined <code>$KANBAN_FIELD</code> and <code>$MY_WORKSAPCE</code> earlier in the script. I parameterized <code>$KANBAN_FIELD</code> because the front-end team has a different workflow than the backend team and hence a different custom field in Rally to store the state.</p>

<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">BODY</span><span class="o">=</span><span class="k">$(</span>cat <span class="s">&lt;&lt; EOF</span>
<span class="s"> {</span>
<span class="s"> &quot;find&quot; : { &quot;FormattedID&quot;: &quot;$STORY&quot; },</span>
<span class="s"> &quot;fields&quot; : [&quot;ObjectID&quot;, &quot;_ValidFrom&quot;, &quot;_ValidTo&quot;, &quot;Release&quot;, &quot;Blocked&quot;, &quot;$KANBAN_FIELD&quot;, &quot;_User&quot;],</span>
<span class="s"> &quot;compress&quot; : true</span>
<span class="s"> }</span>
<span class="s"> EOF</span>
 <span class="k">)</span>

<span class="nv">RESULTS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$BODY</span> <span class="se">\</span>
 <span class="p">|</span> http -a <span class="nv">$AUTH</span> -j POST https://rally1.rallydev.com/analytics/v2.0/service/rally/workspace/
    <span class="nv">$MY_WORKSPACE</span>/artifact/snapshot/query.json <span class="se">\</span>
 <span class="p">|</span> json Results<span class="k">)</span></code></pre></div>

<p>I&#39;m using two CLI tools to help me, <a href="http://httpie.org">httpie</a> and <a href="http://trentm.com/json/">json</a>. HTTPie is a Python script that simplifies cURL-style REST calls. The <code>-b</code> option only outputs the response body. The <code>-a</code> provides my Rally credentials. I don&#39;t store those in plaintext in the script, of course.</p>

<blockquote>
<p>If you&#39;re interested in seeing all the fields during script development, send <code>&quot;fields&quot;: true</code> in the POST body.</p>
</blockquote>

<p>The <code>json</code> tool is used to extract data from the REST call results. Here, I&#39;m filtering the output to just the inner Results object. You can see <code>json</code>&#39;s capabilities more clearly in the story details REST call:</p>

<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">DETAILS</span><span class="o">=</span><span class="k">$(</span>http -b -a <span class="nv">$AUTH</span> -j GET <span class="s2">&quot;$DETAILS_URL?query=(FormattedID =</span>
<span class="s2">   $STORY)&amp;fetch=true&amp;workspace=$WORKSPACE_URL&quot;</span><span class="k">)</span>
 <span class="nv">DETAILS_RESULTS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS</span> <span class="p">|</span> json -D / QueryResult/Results<span class="k">)</span>

<span class="k">if</span> <span class="o">[[</span> <span class="nv">$RAW</span> <span class="o">=</span> <span class="nb">true</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
 <span class="nb">printf</span> <span class="s2">&quot;Raw Details\r\n&quot;</span>
 <span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json
 <span class="k">fi</span>

<span class="nv">STORY_NAME</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json -a _refObjectName<span class="k">)</span>
 <span class="nv">DEFECT_STATUS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json -a DefectStatus<span class="k">)</span>
 <span class="nv">DEFECT_COUNT</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json -D / -a Defects/Count<span class="k">)</span>
 <span class="nv">PROJECT_NAME</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json -D / -a Project/_refObjectName<span class="k">)</span>
 <span class="nv">RELEASE_NAME</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json -D / -a Release/_refObjectName<span class="k">)</span>
 <span class="nv">TAGS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$DETAILS_RESULTS</span> <span class="p">|</span> json -D / -a Tags/_tagsNameArray <span class="p">|</span> json -a Name
   <span class="p">|</span> tr <span class="s1">&#39;\n&#39;</span> <span class="s1">&#39;,&#39;</span> <span class="p">|</span> sed -e <span class="s2">&quot;s/,$//;s/,/, /;&quot;</span><span class="k">)</span></code></pre></div>

<p>The <code>-D</code> option on <code>json</code> sets the delimeter for the <code>-a</code> command, which causes <code>json</code> to parse each record of an array separately. To handle an array of arrays, you need to call <code>json</code> twice, as is done in for <code>$TAGS</code>. I use <a href="http://en.wikipedia.org/wiki/Tr_(Unix)"><code>tr</code></a> to translate the return character into a comma, and then <a href="http://www.grymoire.com/unix/sed.html"><code>sed</code></a> to do some inline substitutions. I also make use of GNU awk or <a href="http://www.gnu.org/s/gawk/manual/gawk.html"><code>gawk</code></a> to do some aggregation, as you can see from this excerpt:</p>

<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># Display blocked hours</span>
 <span class="nb">echo</span> <span class="nv">$RESULTS</span> <span class="se">\</span>
 <span class="p">|</span> json -d, -a _ValidFrom _ValidTo Blocked <span class="se">\</span>
 <span class="p">|</span> grep <span class="nb">true</span> <span class="se">\</span>
 <span class="p">|</span> sed -e <span class="s2">&quot;s/9999-01-01T00:00:00.000Z/${NOW}/g;</span>
<span class="s2"> s/[TZ:-]/ /g;&quot;</span> <span class="se">\</span>
 <span class="p">|</span> gawk -F, <span class="s1">&#39;{d=(mktime($2)-mktime($1))</span>
<span class="s1"> printf (&quot;%02d h\r\n&quot;,d/3600);}&#39;</span> <span class="se">\</span>
 <span class="p">|</span> gawk <span class="s1">&#39;{cnt+=$1}</span>
<span class="s1"> END{printf &quot;Blocked: %s hours\r\n&quot;,cnt?cnt:0}&#39;</span></code></pre></div>

<p>Here, I use <code>json</code> to take the full JSON output of the REST call and strip out everything but the fields I specify. I then look for periods when the story is blocked (where the Blocked flag is true). I use <code>sed</code> to turn Rally&#39;s &quot;max datetime&quot; field into <code>$NOW</code>, which I obtain earlier. The first call to <code>gawk</code> takes the period of time and converts it into hours, whereas the second sums those times and reports the grand total. If the story was never blocked, it shows 0.</p>

<p>Armed with that summary, I then plug the data into my Excel spreadsheet, which is the topic of my next post. Then I&#39;ll talk about process violations.</p>

            
        </section>
    </article>
</div>


<hr/>


<div class="article-wrapper">
    
    <article>
    
    

<header>
    <div class="panel">
        <h1>
            
            <a class="post-link" href="/process/professional/2014/06/05/establishing-flow-kanban-experience-report/">Establishing the Flow: a Kanban experience report</a>
            
        </h1>

        <ul class="tags">
            
            
            <li><i class="fa fa-tags"></i></li>
            
            
            <li>
                <a class="tag" href="/search/?t=development">#development</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=experience">#experience</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=git">#git</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=kanban">#kanban</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=Rally">#Rally</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=scrum">#scrum</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=Stash">#Stash</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=state">#state</a>
            </li>
            
            <li>
                <a class="tag" href="/search/?t=team">#team</a>
            </li>
            
        </ul>

        <div class="clearfix">
            <ul class="meta">
                
                <li>
                    <i class="fa fa-calendar"></i>
                    2014-06-05
                </li>
                

                
                <li>
                    <a href="/search/?a=Chuck">
                        <i class="fa fa-user"></i>
                        Chuck
                    </a>
                </li>
                
                
            </ul>
        </div>
    </div>

    
    <div style="margin-top: 1em;">
        





<div class="share-buttons-wrapper">
    <div class="share-buttons" data-url="http://neontapir.github.io/process/professional/2014/06/05/establishing-flow-kanban-experience-report/" data-title="Establishing the Flow: a Kanban experience report | Chuck Durfee"></div>
</div>

    </div>
    

    
</header>

        <section class="post-content">
            
            
            <p><a href="http://neontapir.com/wp/wp-content/uploads/2014/06/simple-kanban-board.png"><img src="assets/simple-kanban-board.png" alt="simple-kanban-board" width="293" height="195" class="alignright size-full wp-image-1384" /></a></p>
<p>To my mind, Kanban the process is a good fit for managing software projects in a startup situation, like we have at my current employer. In his book <em>The Lean Startup</em>, Eric Ries talks about the importance of build-measure-learn feedback loops. Kanban supports the measure phase of this feedback loop through rich metrics.</p>
<blockquote><p>
  I'd like to preface this blog series by saying that it's only been eight weeks since Kanban was applied in earnest on this project, and while I've done this before, examples should not be taken as a definitive statement of best practice. In fact, there are a number of places where potential improvements are obvious. Note also that this project has a very aggressive delivery timeline and that date has limited the number and scope of improvements the team is willing to undertake.
</p></blockquote>
<p>On this project, we have about 10 people here in Colorado and another 20 contractors in eastern Europe. If we were using scrum, I'd be a scrum master to all those teams, as well as a "release train engineer" in SAFe parlance. I'm honestly not sure what the analogous role is called with Kanban teams, since many Kanban teams are self-managed. Because project manager has a specific meaning at my employer, the best title I've come up with is "project coordinator" or maybe "technical project manager" (although that title has baggage too).</p>
<p>When I was tasked with implementing Kanban for this project, I started by talking to the team about workflows they have enjoyed using in the past. I used the <a href="http://getkanban.com">getKanban</a> game to illustrate how a well-considered Kanban flow operates, and the team still talks about the game. We ended up adopting a similar flow to getKanban's for our backend team.</p>
<ul>
<li>In getKanban, the states are: Ready, Design Doing, Design Done, Development Doing, Development Done, Test, and Deployed. </li>
<li>For our backend team board, we chose Ready, Design, Development, Validation and Accepted. </li>
<li>The front-end team chose different states: Ready, Requirements, Wireframes, Data Contracts (where we identify API changes and groom stories for the backend team), Proof of Concept, Production Ready, Validation, and then Accepted.</li>
</ul>
<blockquote><p>
  There was a lot of confusion about the Proof of Concept and Production Ready columns, which I renamed after the first delivery milestone to Development and Deployment. I'm also finding that stories on the front-end board don't spend significant time in Wireframes or Data Contracts, so I'm considering consolidating Requirements, Wireframes and Data Contracts into a "Design" step.
</p></blockquote>
<p>I spent time with both teams establishing some exit criteria for each step in the workflow. On the backend board, stories exit Ready when they are groomed, including acceptance criteria and test scenarios. During Design, the developer, often in partnership with a quality engineer, comes up with test suites and a high-level design approach, at least to the component and API level. Then, during Development, they create the implementation as well as any <a href="http://junit.org">JUnit</a> and <a href="http://www.fitnesse.org">FitNesse</a> fixtures needed to exercise their code. After a code review, the story enters Validation where the functionality is exercised by FitNesse as well as ad-hoc testing. Then, the PO accepts the story. Should we decide at some point that the story is no longer desired, it gets moved to Rejected.</p>
<blockquote><p>
  In practice, team members often break these exit criteria, and we went through a couple of weeks of blocking stories that didn't pass muster. I found this was an effective way to get the team to pay attention to exit criteria. With a team this large, it's hard to get everyone together at once. I discovered that I underestimated the communications effort -- both in terms of a Russian/English language barrier as well as need for repetition.
</p></blockquote>
<p>We use <a href="http://github.com"><code>git</code></a> for source control, specifically the Atlassian server project <a href="https://www.atlassian.com/software/stash"><code>Stash</code></a>, which allows us to keep our code behind our firewall and to use LDAP for user access. We use pull requests for code reviews, because Stash offers similar reviewing capabilities to <a href="http://github.com">github</a>.</p>
<blockquote><p>
  The eastern European team is used to <code>Subversion</code> and new to <code>git</code>, and that's caused some confusion with branching strategies. When one team reported they were spending man-days handling merge conflicts, I suspect it is either because of the way they handle branching or how they have configured git. In my experience, after some explanation, merge issues of this magnitude arise much less frequently with git. The tiny size of our initial code base is also a contributing factor -- there is a lot of contention for certain key files. I've challenged the team to dig into why that file and the code it contains are involved in so many of our features to make sure they are avoiding creating a <a href="http://en.wikipedia.org/wiki/God_object">God object</a> or the like.
</p></blockquote>
<p>The next post digs into the data collection aspect of a Kanban flow. Later posts talk about my Excel spreadsheet that consumes that data, what metrics I pull, and process violations.</p>

            
        </section>
    </article>
</div>





<div class="pagination">

    
    <span class="btn disabled">
        <i class="fa fa-chevron-left"></i>
        Prev
    </span>
    

    
    <a class="btn" href="/page/2">
        Next
        <i class="fa fa-chevron-right"></i>
    </a>
    

</div>



    </div>

    <aside class="site-aside">
        <div class="inner">
            <div class="block">
                <form action="/search">
                    <input type="search" id="search" name="q" placeholder="Search" />
                </form>
            </div>
            <ul>
                
                
                
                <li><a class="page-link" href="/_pages/2012-02-17-whats-a-tapir-2/">What's a Tapir?</a></li>
                
                
                
                <li><a class="page-link" href="/_pages/2012-02-17-whos-neontapir/">Who's the Neon Tapir?</a></li>
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                <li><a class="page-link" href="/tags/">Tags</a></li>
                
                
                
                <li><a class="page-link" href="/archives/">Archives</a></li>
                
                
            </ul>
            <ul class="icons">
                


<li>
    <a href="http://neontapir.github.io/feed.xml">
        <i class="fa fa-fw fa-rss"></i>
    </a>
</li>



<li>
    <a href="mailto:chuck@neontapir.com">
        <i class="fa fa-fw fa-envelope"></i>
    </a>
</li>



<li>
    <a href="https://github.com/neontapir">
        <i class="fa fa-fw fa-github"></i>
    </a>
</li>





<li>
    <a href="https://twitter.com/ChuckDurfee">
        <i class="fa fa-fw fa-twitter"></i>
    </a>
</li>



<li>
    <a href="https://www.facebook.com/chuck.durfee">
        <i class="fa fa-fw fa-facebook"></i>
    </a>
</li>



<li>
    <a href="https://plus.google.com/+ChuckDurfee">
        <i class="fa fa-fw fa-google-plus"></i>
    </a>
</li>









<li>
    <a href="https://www.flickr.com/photos/tangentier">
        <i class="fa fa-fw fa-flickr"></i>
    </a>
</li>



<li>
    <a href="http://instagram.com/neontapir">
        <i class="fa fa-fw fa-instagram"></i>
    </a>
</li>



<li>
    <a href="https://www.linkedin.com/in/neontapir">
        <i class="fa fa-fw fa-linkedin"></i>
    </a>
</li>









<li>
    <a href="http://stackexchange.com/users/19520/neontapir">
        <i class="fa fa-fw fa-stack-exchange"></i>
    </a>
</li>





<li>
    <a href="https://neontapir.wordpress.com/">
        <i class="fa fa-fw fa-wordpress"></i>
    </a>
</li>



<li>
    <a href="https://www.youtube.com/user/neontapir">
        <i class="fa fa-fw fa-youtube"></i>
    </a>
</li>


            </ul>
            <hr class="with-no-margin margin-bottom"/>

            <div class="block sticky">
                <h1>Recent posts</h1>
                <ul>
                    
                    
                    <li><a href="/op-ed/2015/08/12/conversion-to-jekyll/">Conversion to Jekyll</a></li>
                    
                    <li><a href="/podcast/2015/02/07/acw-100-subs/">Agile Chuck Wagon is gaining subscribers</a></li>
                    
                    <li><a href="/podcast/2015/01/21/announcing-agile-chuck-wagon-podcast/">Announcing the Agile Chuck Wagon podcast</a></li>
                    
                    <li><a href="/rpg/tabletop/2014/10/22/fashion-police-1/">Actual Play: Feng Shui 2 RPG with the Fashion Police</a></li>
                    
                    <li><a href="/process/professional/2014/09/14/hoosiers-moneyball/">Agile Methodologies as Sports Movies: Hoosiers and Moneyball</a></li>
                    
                    <li><a href="/coding/process/2014/09/05/bash-ruby-kanban-experience-report/">From Bash to Ruby: A Kanban experience report</a></li>
                    
                    <li><a href="/process/professional/2014/06/26/process-violations-kanban-experience-report/">Process Violations: a Kanban experience report</a></li>
                    
                    <li><a href="/process/professional/2014/06/19/excel-spreadsheet-metrics/">Excel spreadsheet for metrics: a Kanban experience report</a></li>
                    
                    <li><a href="/coding/process/professional/2014/06/12/rally-data-extract-scripts-kanban-experience-report/">Rally data extract scripts: a Kanban experience report</a></li>
                    
                    <li><a href="/process/professional/2014/06/05/establishing-flow-kanban-experience-report/">Establishing the Flow: a Kanban experience report</a></li>
                    
                </ul>
            </div>
        </div>
    </aside>
</div>

<footer class="site-footer">
    <div class="inner">
        <span>Powered by <a href="http://jekyllrb.com">Jekyll</a> with <a href="https://github.com/qckanemoto/jekyll-qck-theme">QckTheme</a></span>
    </div>
</footer>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="/assets/lib/garand-sticky/jquery.sticky.js"></script>
<script src="/assets/lib/easy-social-buttons/jquery.social-info.js"></script>
<script src="/assets/lib/easy-social-buttons/jquery.easy-social-buttons.js"></script>
<script src="/assets/js/script.js"></script>





<!-- Google Analytics -->



</body>
</html>
