<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Agile Otter Blog</title>
<link>https://tottinge.github.io/agile-otter-blog/</link>
<atom:link href="https://tottinge.github.io/agile-otter-blog/index.xml" rel="self" type="application/rss+xml"/>
<description>Tim Ottinger&#39;s thoughts on software development.</description>
<generator>quarto-1.10.19</generator>
<lastBuildDate>Mon, 29 Sep 2025 23:00:00 GMT</lastBuildDate>
<item>
  <title>Convenience Scripts for Projects</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-09-30-convenience-scripts-for-projectsw.html</link>
  <description><![CDATA[ 




<p>
Recommended bash scripts for every project
</p>
<p>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgkvQKy9gb8_HccNU6CEVvl0huCl1XyTwd841u6V0SfUraI5SvsT4CPyRwHkMS6wWG6yYJDrsUPMb_our96DUUm4bhGvRfXCDAVGuipGCmSWkwvBdcdYyYT4lsknmuJsy2D_BHQ-dvFSLO2vx6DHPsdAf4oT62OvQ088piRxFbOEJ-pjK89Nh2t5gEiyLg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="112" data-original-width="252" height="142" src="https://blogger.googleusercontent.com/img/a/AVvXsEgkvQKy9gb8_HccNU6CEVvl0huCl1XyTwd841u6V0SfUraI5SvsT4CPyRwHkMS6wWG6yYJDrsUPMb_our96DUUm4bhGvRfXCDAVGuipGCmSWkwvBdcdYyYT4lsknmuJsy2D_BHQ-dvFSLO2vx6DHPsdAf4oT62OvQ088piRxFbOEJ-pjK89Nh2t5gEiyLg" width="320"></a>
</div>
<br><br>
<p>
</p>
<p style="text-align: left;">
</p>
<ol style="text-align: left;">
<li>
<b>clean_start</b>&nbsp;ensures you are ready to start new work. It does:
</li>
<ol>
<li>
‘pull -r’ (which fails if you have uncommitted work)
</li>
<li>
a refresh of the local environment
</li>
<li>
&nbsp;‘git clean -i’ in case you have untracked files you’ve forgotten about
</li>
<li>
a full test run.<br>
</li>
</ol>
<li>
<b>onboard</b> is the script to run if you are a brand-new developer and you need to set up your development environment. It will deal with setting up the environment (installing dependencies and any virtual environment) and runs the tests.
</li>
<li>
<b>run</b> runs the application itself. <br>I started adding run scripts when I started changing between ruby, python, java and other projects and got tired of having to remember which incantation started the servers.&nbsp; This is a shortcut.
</li>
<li>
<b>run_tests</b> will run all of the tests – every kind.
</li>
<li>
<b>run_integration_tests</b> will run only the integration tests (I don’t always separate these).
</li>
</ol>
I don’t use a script to run only the unit tests, because I have IDE configured to run every time I make a compilable change. In some languages, I have to wait until I save the file (pycharm does it better). Some js/ts test libraries will also run automatically on save. If you need one, write a ‘./unit_test’ script and be happy. Use it often.<br>
<p>
</p>
<p style="text-align: left;">
Another useful trick is to add a precommit hook so that you cannot commit locally unless all the tests are running successfully.
</p>
<p style="text-align: left;">
It can be helpful to have an LLM/agent/AI write these scripts initially and keep them up to date. You can do just as good a job as they can, but it is a fairly simple task that most of them can handle well enough.
</p>
<p>
<br>
</p>
<div>
<br>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-09-30-convenience-scripts-for-projectsw.html</guid>
  <pubDate>Mon, 29 Sep 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Why is working faster not working?</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-09-12-why-is-working-faster-not-working.html</link>
  <description><![CDATA[ 




<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 16px; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">

<div class="update-components-text relative update-components-update-v2__commentary" dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Do you want to understand why that is?</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br>Warning<br></span></span>
</div>
</div>
</div>
<blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;" class="blockquote">
<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 16px; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">If you are working with development teams (and aren’t a developer or ex-developer) then this might be <i>jarring</i>, but it’s intended for good and not for offense.</span></span>
</div>
</div>
</div>
</blockquote>
<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 16px; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span>The reason it takes so long for work to be done? I know from a distance it seems like it’s “they’re not working hard enough,” but it’s very possible (better than 50/50) that they’re working too much.<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span></span></span>
<h2 style="text-align: left;" class="anchored">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">The queues</span></span></span>
</h2>
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Wherever there is a handoff, there is a queue.<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span>If the person receiving the work is busy, the queue becomes a wait.<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span>How long work waits is largely a matter of:<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;">
<ul style="text-align: left;">
<li>
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">How many things are in the queue?</span></span>
</li>
<li>
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">How often can someone pull the work from the queue?</span></span>
</li>
<li>
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">How long does it take to complete the job once started?</span></span>
</li>
<li>
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">How long does it take one task to clear all of the other queues and reach production?</span></span>
</li>
</ul>
<div>
We tend to think of our workflow like this:
</div>
</span></span></span>
</div>
</div>
</div>
<blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;" class="blockquote">
<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 16px; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">
<div style="text-align: left;">
[Step 1] —- [Step 2] — [Step 3] – [Release]&nbsp; &nbsp;<span style="background-color: transparent;">&nbsp;</span>
</div>
</span></span></span>
</div>
</div>
</div>
</blockquote>
<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 16px; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">In reality, it looks more like this:</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
</div>
</div>
<blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;" class="blockquote">
<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span style="font-size: 14px;">[Queue 1][Step1] -&gt; [Queue 2][Step2] -&gt; [Queue 3][Step 3] -&gt; [Queue 4][Release]</span>
</div>
</div>
</div>
</blockquote>
<div class="iZjoKBcYOndqIOclNhexQvyRYLEBbaUJfRI" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; margin: 0px; padding: 0px; vertical-align: baseline;" tabindex="-1">
<div class="feed-shared-inline-show-more-text feed-shared-update-v2__description feed-shared-inline-show-more-text--minimal-padding feed-shared-inline-show-more-text--3-lines feed-shared-inline-show-more-text--expanded" data-artdeco-is-focused="true" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: 2rem; margin: 0px 1.6rem; max-height: none; max-width: 928px; outline: none; overflow: hidden; padding: 0px; position: relative; vertical-align: baseline;" tabindex="-1">
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">For simplification, imagine that every step took exactly one day. The fastest any item could go from start to end would be if all the queues were empty (later steps were idle, waiting for work). It would take 4 days, since release is a step also.</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Now lets say that there is one item waiting already in each of the queues when our task reaches that step. You can imagine readily enough that it doubles the time. Each queue will take a day to process the item ahead of our task and one day to process our task. We’re not taking any extra time to do the work, but the quickest possible release is 8 days out.</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Let’s make another change, and imagine that step 3 takes 2 days instead of one. In an empty queue situation, it’s only 5 days to release, but imagine that we keep Steps 1 and 2 as busy as possible in the meantime.&nbsp;</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><google-sheets-html-origin style="color: black; font-size: medium;">
<table border="1" cellpadding="0" cellspacing="0" data-sheets-baot="1" data-sheets-root="1" dir="ltr" style="border-collapse: collapse; border: none; font-family: Arial; font-size: 10pt; table-layout: fixed; width: 0px;" xmlns="http://www.w3.org/1999/xhtml">
<colgroup>
<col width="100">

<col width="40">

<col width="38">

<col width="32">

<col width="27">

<col width="86">

</colgroup>
<tbody>
<tr style="height: 21px;">
<td style="background-color: #a4c2f4; border: 1px solid rgb(0, 0, 0); font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
Day
</td>
<td colspan="4" rowspan="1" style="background-color: #a4c2f4; border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
Queues
</td>
<td style="background-color: #a4c2f4; border-color: rgb(0, 0, 0) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; font-family: Verdana; overflow: hidden; padding: 2px 3px; vertical-align: bottom;">
Expect Thru
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
5
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
2
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
5
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
3
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
5
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
4
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
2
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
7
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
5
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
2
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
7
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
6
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
3
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
9
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
7
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
3
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
9
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
8
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
4
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
11
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
9
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
4
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
11
</td>
</tr>
<tr style="height: 21px;">
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: center; vertical-align: bottom;">
10
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
1
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
5
</td>
<td style="border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
0
</td>
<td style="background-color: #d0e0e3; border-color: rgb(204, 204, 204) rgb(0, 0, 0) rgb(0, 0, 0) rgb(204, 204, 204); border-image: initial; border-style: solid; border-width: 1px; color: #2c2c4d; font-family: Verdana; overflow: hidden; padding: 2px 3px; text-align: right; vertical-align: bottom;">
13
</td>
</tr>
</tbody>
</table>
</google-sheets-html-origin></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">You can see that going full-speed in steps 1 and 2 merely make the queue in front of step 4 fuller, so that by day 10 the new item that arrives in the first queue can be expected to take at least 13 days to make it out the door if all goes well.</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Now imagine that, in an attempt to get work done faster, we double the speed of the people at the first queue. What is the result then? it build up a queue at step 2, and work does not arrive at queues 3 and 4 any sooner.&nbsp;</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span style="font-size: 14px;">If we add twice as many people doing steps 1 and 2 but do nothing to speed work at task 3, we exacerbate the problem. This is explored much further in works by Elihu Goldratt such as The Goal and Critical Chain.&nbsp;</span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span style="font-size: 14px;"><br></span>
</div>
<h2 style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;" class="anchored">
<span style="font-size: 14px;">Individual Queues</span>
</h2>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<br>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Work is often assigned to individuals, so a new jobs coming into the system will wait for the availability of the assigned person, no matter who else has time. I doesn’t matter if three unassigned developers have finished a task, since they can’t pull work from someone else’s assigned load. That job will wait.</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">That means that we have many early queues and waits, and often these flow into fewer queues for review, scanning, testing, approval, and what-have-you. The cardinality differences often mean that queues build.&nbsp;<br><br>Most people don’t even track the size of the queues. They can, but don’t.</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<h2 style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;" class="anchored">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">What about the rework?</span></span>
</h2>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">When work in the front of the queue is hurried, it is more likely to fail a quality gate and return for rework. This is disturbingly common in many programming organizations.<br><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br>Now the issues must be remediated, and the work resubmitted. This rework goes through the same queues and quality gates.</span></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">With rework flowing from the first task,&nbsp; the second queue may have all the original work and also all of the repaired work piling up. As the queues build, the release time stretches out to the horizon.</span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span>Without so much work-in-progress (really work-in-queue), there would be faster starts and completions. Sadly, instead of reducing WIP and queuing, and spending time to get the pass rates up on the quality gates, <b>the standard naive answer is to “make programmers work faster”</b> – which results in even slower releases due to quality gate rejections and code resubmissions.</span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">You could track your system and attack issues with a systems mindset, but odds are that nobody in your organization has ever done so. Instead, <b>everyone is super-busy and nothing is getting done.</b></span></span>
</div>
<div class="update-components-text relative update-components-update-v2__commentary" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 1.4rem; line-height: inherit; margin: 0px; padding: 0px; position: relative; text-align: left; vertical-align: baseline;">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span>There’s more to this, but maybe check and see what the system’s load is like before declaring “they have to work harder” since the system of work may be inflicting most of the slowness.<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span></span></span>
<h2 style="text-align: left;" class="anchored">
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">AI to the Rescue?</span></span></span>
</h2>
<span class="break-words tvm-parent-container" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; font-size: 14px; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; word-break: break-word;"><span dir="ltr" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; line-height: inherit; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">What about AI? AI doesn’t fix this and may make the queuing problem much worse.</span></span>
</div>
</div>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-09-12-why-is-working-faster-not-working.html</guid>
  <pubDate>Thu, 11 Sep 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Subjectivity: Who is to say what’s right?</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-07-21-who-are-you-to-say-whats-right.html</link>
  <description><![CDATA[ 




<p>
&nbsp;<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">This is probably too snarky, but bear with me:</span>
</p>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">If I fill my fuel tank with non-fuel or the wrong fuel, it will damage my car and fail to perform.</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Is that because fueling the car is a bad idea?</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;">
<ul style="text-align: left;">
<li>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">If fueling a car is a good idea, shouldn’t there be a million ways to do it so that it’s easy for people? This “petrol only” rule = is too restrictive to be useful in the real world.</span>
</li>
<li>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Every time I put diesel in my petrol vehicle, the mechanic pulling my gas tank and cleaning the fuel lines tells me I’m doing it wrong. Don’t they realize there’s more than one way? Just because my way consistently fails doesn’t make me wrong!</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span>
</li>
<li>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Why should all of those elite gate-keepers put down people who choose their own fuels? Why are they so petty and close-minded?</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span>
</li>
<li>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Don’t you think that people should get to choose to put whatever they like in the gas tank? This top-down mandate by car makers is undemocratic! It’s authoritarian! Where is the psychological safety?</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span>
</li>
<li>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Who are you to tell me what fuel to use? You’re no better than I am, just because you’re lucky enough to afford a car that runs every day!</span>
</li>
<li>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">My cousin put petrol in the petrol tank and got a flat tire on the same day. Your petrol causes flat tires! What do you say to that!?</span>
</li>
</ul>
</span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Look, it doesn’t matter what we’re talking about here: If you do it poorly, you will probably fail.</span>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;"><br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">The correlation is quite high.</span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Is it possible that you could do it correctly and still have issues?&nbsp;</span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;"><br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">It is more likely that your issues are not related to the thing you did RIGHT, but to the things still not done well.<br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;"><br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">If you are going to change the spark plugs, don’t claim the freedom to put the plug cables back in any order that you find aesthetically pleasing. Your car won’t work if you do. There is a right way and a wrong way.</span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;"><br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">If you are making a cake, you might want to use baking ingredients and not gardening supplies. You might have some latitude in technique and proportion, but if you mix dirt and fertilizer and put it out in the sun, what you’re doing is not baking a cake. That’s gardening. You can’t expect to serve it with ice cream at your child’s birthday party to the acclaim of the assembled children.<br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;"><br></span>
</div>
<div>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Why is it that some people have done TDD for decades and it has always worked for them, and your first attempt for a couple of afternoons in 2021 didn’t turn out?<br><br>Is it because TDD doesn’t work, and they’re all a bunch of liars, or because your attempt was inexpert and maybe didn’t employ the same strategies and approaches that they would have?<br><br><br><br></span>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-07-21-who-are-you-to-say-whats-right.html</guid>
  <pubDate>Sun, 20 Jul 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Who (the heck) Am I?</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-07-09-who-heck-am-i.html</link>
  <description><![CDATA[ 




<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;">I’m Tim Ottinger.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; white-space-collapse: preserve;">You may already know me.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; white-space-collapse: preserve;">I’m a long-time developer, agilist, XPer, CI/CD, teaming/ensemble, TDD, and general software delivery specialist.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">I wrote the second chapter of <i>Clean Code</i>.&nbsp; I am the originator and co-author of </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Agile in a Flash</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> with Jeff Langr, and I wrote </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Use VIM Like a Pro</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; white-space-collapse: preserve;">I’m mentioned in the “acknowledgements” sections of many other books on Code Craft, Agility, Design Patterns, because I’ve been heavily involved in the tech community and have done reviews and edits of their pre-publication materials.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">I worked with “Uncle Bob” Martin at </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Object Mentor</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (twice). With his company, I taught physicists at Stanford Linear Accelerator Center how to improve software design for high-energy physics. I worked with companies like Caterpillar, Xerox, and many others.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">I worked with Ian Murdoch (who founded the Debian Project) in his company, </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Progeny Linux Systems</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. We created software to aid in the creation of custom commercial Linux distributions.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; white-space-collapse: preserve;">I built industrial balancing machines with ITW.</span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">I have worked with</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> Industrial Logic</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> (Joshua Kerievsky’s company) in the USA for the past 14 years. We helped companies create their flagship product. We worked with companies in oncology, heavy manufacturing, agriculture, insurance, respiratory health, and others. I’ve designed and delivered training courses. I’ve helped transform legacy code. I’ve coached software development executives.</span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;"><br></span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;">I’m known as “the agile otter” (a play on my connections with XP and agile practices, and a play on my last name).</span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;"><br></span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;">I have taught modern software practices and code craft to thousands of people around the world, including the USA, Canada, India, China, Germany, Hungary, Poland, Norway, Australia, and other countries. I enjoy international travel and love serving software organizations, whether large or small.&nbsp;</span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;"><br></span>
</p>
<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial,sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap; white-space: pre;">I’m particularly well known for code craft, TDD, CI, CD, and refactoring.</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; white-space-collapse: preserve;">In recent years, I’ve worked to bring Lean flow to organizations, helping them to reduce unpredictability, delay, and frustrations of typical delivery processes. This has been rewarding and fascinating, and will continue to make a big difference for the companies I’ve served..</span>
</p>
<p>
<span style="font-family: Arial, sans-serif; font-size: 11pt; white-space-collapse: preserve;">I’m living in Scotland. I speak one human language and many programming languages.</span>
</p>



 ]]></description>
  <category>biography</category>
  <category>agile otter</category>
  <category>tim ottinger</category>
  <category>specialties</category>
  <category>skills</category>
  <category>history</category>
  <category>abilities</category>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-07-09-who-heck-am-i.html</guid>
  <pubDate>Tue, 08 Jul 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>A quick note on “At Scale”</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-07-09-a-quick-note-on-at-scale.html</link>
  <description><![CDATA[ 




<p>
&nbsp;<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">i will submit that the problem of scale is mostly that you</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span>
</p>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;">
<ol style="text-align: left;">
<li>
<span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Have to deal with divergent, incompatible SW development paths</span>
</li>
<li>
Might not be able to handle losing fine-grained control of every element of the business.
</li>
<li>
Are likely to accumulate heavy processes with a lot of inherent delay and unpredictability in them.
</li>
<li>
Have to deal with “the law of the 2nd floor” (LO2F)
</li>
</ol>
</span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span>
</div>
</span>
<h2 style="text-align: left;" class="anchored">
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">The Law of Two Floors</span>
</h2>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">The first few points may be obvious enough to not need explanation, but too few people know the LO2F.</span>
</div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"></span>
<blockquote class="blockquote">
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Nobody two levels&nbsp;</span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;"><i>ABOVE OR BELOW</i> you <u>on the org chart</u> <i>really knows </i>what your days are like.</span><span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"> </span>
</blockquote>
<span class="white-space-pre" style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline; white-space: pre !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">I think this may well be a proper “law” and not just observational comedy.</span>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span>
</div>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">It doesn’t happen in the small, scrappy startups where there aren’t three levels on the whole org chart, or where the entire programming team can sit in the same conference room. It is a problem of scale.</span>
</div>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span>
</div>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">You all have enough production work, customer management, finance, regulatory, and technical work every day. You can’t really stay in touch.&nbsp; You don’t know everyone by face and name anymore. You’ve not had coffee together (maybe ever).<br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">You will become an “abstract person” to people 2-3 levels away from you, AND THEY TO YOU.&nbsp;</span>
</div>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br></span>
</div>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">Don’t think it’s “poor me, they don’t value me” because it’s also “poor them, you don’t value them.”&nbsp;<br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Both sides make up stories about what they think the others do and how they do it – usually laced with self-protective suspicion. <br><br>“They just want to fire us to shore up their balance sheet.”<br></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">“They don’t care about the business or its people, just their quarterly bonus.”<br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;">“Those programmers don’t want to work – they’re probably goofing off right now.”<br>“The testers don’t really care about the product or the users, they’re just holding up progress.”<br></span>
<div>
<span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">One might even be tempted to force-mold the real people into the abstract shape one thinks they <i>should</i> have. <br><br>Note the “everyone has to be the same” compliance drive, regardless of who people are or what kind of work they do.</span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255); border-color: rgba(0, 0, 0, 0.9); border-image: none 100% / 1 / 0 stretch; border-style: none; border-width: 0px; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit !important; margin: 0px; outline: rgba(0, 0, 0, 0.9) none 0px; padding: 0px; vertical-align: baseline;"><br style="box-sizing: inherit; line-height: inherit !important;"></span><span style="background-color: white; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 14px;">Those are problems of scale.&nbsp;<br><br>Perhaps the most painful problem of scale for software development is in divergence. You can read about that in my blog on <a href="https://www.industriallogic.com/blog/easy-integration/">easy integration</a> (which is harder to do at scale).</span>
</div>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-07-09-a-quick-note-on-at-scale.html</guid>
  <pubDate>Tue, 08 Jul 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>How much rework do you WANT?</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-07-07-how-much-rework-do-you-want.html</link>
  <description><![CDATA[ 




<h2 style="text-align: left;" class="anchored">
How much failure demand and rework do you feel is appropriate in your system?
</h2>
<div>
Rework in software is the correction of unacceptable code. That doesn’t include refactoring, which corrects only the design and expression of ideas without changing what the code does. This is limited to “something does not work correctly and we can’t let it be released.”&nbsp;
</div>
<div>
<br>
</div>
<div>
So, we don’t want any of that, right? It delays releases and costs money. It distracts developers from doing new feature work. It raises the costs of release. Clearly, this is a bad thing, right?
</div>
<div>
<br>
</div>
<div>
No.&nbsp; This is a less-obvious question than it first seems.&nbsp;
</div>
<p>
Obviously, nobody wants to have errors and failures in their system. We would like to see 100% success rates, right?&nbsp;
</p>
<p>
Well, hold on…
</p>
<h2 style="text-align: left;" class="anchored">
Pass Rates
</h2>
<div>
How would you feel if your QA/QC department did not report a single defect in the past 3 quarters? Not one!
</div>
<div>
<br>
</div>
<div>
What if all the code reviews passed with “Looks good. Nice work!” and nothing was ever returned for repair?
</div>
<div>
<br>
</div>
<div>
What if none of the security scans or linters ever reported a problem?
</div>
<div>
<br>
</div>
<div>
What if every one of your releases went out flawlessly and nobody ever reverted anything?
</div>
<div>
<br>
</div>
<div>
Would you actually be happy?
</div>
<div>
<br>
</div>
<div>
Would you be angry with code reviewers, testers, and your investment in scanners?
</div>
<div>
<br>
</div>
<h2 style="text-align: left;" class="anchored">
No Rejections? That’s incredible!
</h2>
<div>
The word incredible means that it has no credibility – it’s not trustworthy and likely untrue.
</div>
<div>
<br>
</div>
<div>
The problem with my phrasing above is that I expressed it as people not reporting problems, rather than expressing it as people doing diligent and competent work and still not finding any problems because the code is so perfect.
</div>
<div>
<br>
</div>
<div>
It’s hard for people in most programming groups to even imagine that code could not be full of easily-catchable issues (and probably some subtle ones that aren’t easy to spot).
</div>
<div>
<br>
</div>
<div>
But this leaves us in a funny picture: we need the code to have problems in order to prove the value of the gauntlet of post-code checkers we have put in place. How else can we prove the efficacy of the system that keeps bugs from escaping into the wild?
</div>
<div>
<br>
</div>
<h2 style="text-align: left;" class="anchored">
Competition
</h2>
<div>
The usual system pits developers against testers (human and otherwise) and requires there to be a certain level of rework. For every bit of code that passes 100% on the first try, we give a demerit to our testing gauntlet. For every time code is rejected by the system, we give a demerit to the programming staff.
</div>
<div>
<br>
</div>
<div>
Somebody has to lose for the system to remain stable.&nbsp;
</div>
<div>
<br>
</div>
<div>
When the code improves, the test gauntlet has to raise the bar until they can report more issues (however trivial) in order to prove the value of their system and the need for the salaries and subscriptions paid periodically.
</div>
<div>
<br>
</div>
<div>
That creates a reputation that programmers are ineffective and flawed. If they again improve, then it casts shade on the gauntlet operators again.
</div>
<div>
<br>
</div>
<div>
Isn’t this “using blame and shame to create an upward spiral”?&nbsp;<br><br>
<h2 style="text-align: left;" class="anchored">
Does it make a difference?
</h2>
<br class="Apple-interchange-newline">Here is a pipeline based on some factual post-code pipelines:<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjn_JjXAnr3TIWJc6SdS1CXrURq3qQayCpRR4zudV8P0u-QUK-Gt67MzlBw-NLcleADHp3kXND754s85LYmrSalhP0g-zyqvHq_fFDAgfZQErKjoKn6h_ydyz04MesHA0lDlV-OwMEFfnybz-93mHWYcxNnpm4z2RNevhJlLc6ktdDCwhm2Tc2ROJDqpio" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="663" data-original-width="697" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjn_JjXAnr3TIWJc6SdS1CXrURq3qQayCpRR4zudV8P0u-QUK-Gt67MzlBw-NLcleADHp3kXND754s85LYmrSalhP0g-zyqvHq_fFDAgfZQErKjoKn6h_ydyz04MesHA0lDlV-OwMEFfnybz-93mHWYcxNnpm4z2RNevhJlLc6ktdDCwhm2Tc2ROJDqpio" width="252"></a>
</div>
<br>Looks pretty good, right? Pretty high pass rates?<br><br>The overall pass rate is only 58%.&nbsp;<br><br>Let’s run some 100-task simulations. Ideally, each step would run once per task. When a code submission is rejected, it starts back over at the beginning.<br><br>The simulation is unfairly simple.&nbsp;
</div>
<div>
<ul style="text-align: left;">
<li>
It doesn’t include time to remediate the problems.&nbsp;
</li>
<li>
It doesn’t consider queuing waits, such as when the QA is busy, and work piles up.&nbsp;
</li>
</ul>
</div>
<div>
<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjWpclHjLoVlGjG9IghjdtrEDjoHvOAUnX_4ouNRPb0BWoRttYYpm96iysX6o40c3-M_EJi6UP_8xDCoBcWbCzZYLTxtvfbqkXQaB2mIrgTz8AAA3oi-d8QAKQsie2wrN1TrIHeAHCBS4XS4_C4WPhwPdB70-iRZjBpZytQdfsDEfeHvAS67Y7AnEICq7s" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="421" data-original-width="1034" height="261" src="https://blogger.googleusercontent.com/img/a/AVvXsEjWpclHjLoVlGjG9IghjdtrEDjoHvOAUnX_4ouNRPb0BWoRttYYpm96iysX6o40c3-M_EJi6UP_8xDCoBcWbCzZYLTxtvfbqkXQaB2mIrgTz8AAA3oi-d8QAKQsie2wrN1TrIHeAHCBS4XS4_C4WPhwPdB70-iRZjBpZytQdfsDEfeHvAS67Y7AnEICq7s=w640-h261" width="640"></a>
</div>
<br>With this pipeline, 180 extra hours (rework) are needed just to operate the quality gates. That doesn’t include programming or queuing time.&nbsp;<br>
<h2 style="text-align: left;" class="anchored">
Costs
</h2>
</div>
<div>
<br>
</div>
<div>
Intentionally driving down the pass rates (making the gates “extra tough”) creates an appetite for rework and failure, and a kind of informal currency around it. One earns points for slowing the system, increasing the costs of work, delaying releases, and destroying the predictability of any work in progress.
</div>
<div>
<br>
</div>
<div>
What if we kept a high standard, and even raised the standard, but rather than using this to return work and raise costs, we focused on the developer experience and made it possible (possibly inevitable) that the developers would produce code that works and satisfies users?<br><br>Deming described the “quality control” function as “you burn the toast, and I’ll scrape it” – rework that costs money and time and cannot possibly be the path to total quality.
</div>
<div>
<br>
</div>
<h2 style="text-align: left;" class="anchored">
Shifting
</h2>
<div>
<br>
</div>
<div>
The focus on “shift left” for QA is to move more of the evaluative function to moment of code creation.
</div>
<div>
<br>
</div>
<div>
This is wisdom.
</div>
<div>
<br>
</div>
<div>
There are many ways to approach development without rework.
</div>
<div>
<br>
</div>
<div>
With techniques like (proper use of) static typing and design-by-contract, we move more of the quality responsibility to compile time. Even dynamically-typed language often have a type-checking extension and these can make it hard to write ill-formed code witout knowing.
</div>
<div>
<br>
</div>
<div>
Most IDEs have some level of code-checking built into them. While some programmers are highly cognizant of warnings, errors, and suggestions there are many others who ignore these helpful quality reminders. Admittedly, not all warnings in all IDEs are useful, but that doesn’t mean that they are all to be ignored.&nbsp;
</div>
<div>
<br>
</div>
<div>
There are a number of “lint” utilities that can be installed in the IDEs and editors we use.&nbsp; These can spot poor usage patterns, clumsy expressions, possible security flaws, anti-patterns and code smells, and unconventional formatting issues. Again, some developers refuse to install these and others ignore them.
</div>
<div>
<br>
</div>
<div>
Practices like TDD exist to provide a behavioral level of testing that goes beyond what a linter or IDE can check. With the microtests TDD relies upon, you don’t just know that the function takes two integers and returns a floating point number; you can know that given a certain set of numbers, it will return the expected result. This is an extension of quality checking that has a lot of power: you can change how the code works provided it still does the right thing. This allows one to evolve the design and improve the expression of code ideas safely. It’s one of the few ways of working that does (since DesignByContract is rarely implemented).<br><br>Automated testing helps here also. Using tools like Playwright and Storybook can take a UI development to a new level of reliability.
</div>
<div>
<br>
</div>
<div>
But the biggest left-shift seems to be one that people are in a huge hurry to discount - working together.&nbsp;
</div>
<div>
<br>
</div>
<div>
I’m not sure why a proven method of enabling CI/CD and high quality, lauded in many studies and publications (including the DORA report) seems to have such a curb appeal problem, but people don’t want to think about this one.&nbsp;
</div>
<div>
<br>
</div>
<div>
It matters, though. Nobody knows all the grammar of all the programming languages they use every day. Nobody knows the entire standard library of any one of those languages, nor all the relevant standards. Nobody knows all of the application code. No one person can be expected to know and keep up with an application system and its ecosystem.&nbsp; A few people working together can get close enough, though. You might be amazed at the Venn diagram of who knows what and how little common space there is in solo programmers all “doing their own work.”&nbsp; You would be amazed how much ground is covered by a diverse group of skilled workers.
</div>
<div>
<br>
</div>
<div>
But of course, if you don’t have errors and rework so that all of your code goes out the door well and quickly and your customers aren’t waiting and yelling at you then how can you tell which of your people are doing their best work?&nbsp;<br><br>And does that matter when your company is succeeding?
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-07-07-how-much-rework-do-you-want.html</guid>
  <pubDate>Sun, 06 Jul 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>There is No Automatic Reset for Engineering</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-03-03-there-is-no-automatic-reset-in.html</link>
  <description><![CDATA[ 




<blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;" class="blockquote">
<div style="text-align: left;">
<p style="text-align: left;">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"></span>
</p>
</div>
</blockquote>
<blockquote style="text-align: left;" class="blockquote">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">Do you remember all those rushed changes that your developers implemented three years ago, and how they complained about the design damage they caused to make that happen?</span><br><span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">It’s all still in the codebase. It never disappears.</span><span class="white-space-pre" color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: 14px; line-height: inherit; margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre;"> </span><br><span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">You may have forgotten it, but they still live with it every day.</span><br>
<div style="text-align: left;">
<p style="text-align: left;">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">I’m not saying you were wrong to be in a hurry then; I’m only saying<b> it’s not over</b></span>
</p>
</div>
</blockquote>
<div style="text-align: left;">
<h2 style="text-align: left;" class="anchored">
It Does Not Heal Itself
</h2>
<p style="text-align: left;">
In engineering, software or otherwise, whatever decision we make this month, <b><i>we have to live with it </i></b>from now on, or until someone invests additional time in reversing it.
</p>
<p style="text-align: left;">
That hack is as permanent a part of the product as any well-considered change.&nbsp;
</p>
<p style="text-align: left;">
It doesn’t refresh with the next month, quarter, or planning period. it doesn’t fade away. It doesn’t heal.
</p>
<p style="text-align: left;">
There is no end-of-period reset.&nbsp;
</p>
<p style="text-align: left;">
Making new goals doesn’t remove the baggage of prior goals.
</p>
<p style="text-align: left;">
Do the other people have to live with January 2013 for the rest of their lives? Or is it only engineering that has to deal with every dirty hack since the beginning of the organization?
</p>
<p style="text-align: left;">
I wonder if non-engineering parts of a company properly recognize this “code is forever” situation.
</p>
<h2 style="text-align: left;" class="anchored">
Hurrying Is Sometimes Wise
</h2>
<p style="text-align: left;">
That doesn’t mean we should never hurry or not be quick; we all want to produce a quick and meaningful effect, but if we get there by cutting corners and producing risky code, we need to productize it (to turn the working prototype into something that we expect people to trust in production).
</p>
<p style="text-align: left;">
It’s good to borrow time from the future to capture a market opportunity, but we owe the future that time; we can’t borrow freely forever <i>as if</i> it costs us nothing.<br>
</p>
<p style="text-align: left;">
Incremental and iterative development is a good thing. It’s reasonable that we adjust our product intentions to keep up with changing market conditions if we can.&nbsp;
</p>
<p style="text-align: left;">
The problem is rushing weak code out the door frequently and often.
</p>
<p style="text-align: left;">
A continuous stream of hacks we must live with forever will destroy our ability to produce quickly and may impact our ability to build and operate the system cost-effectively.
</p>
<h2 class="anchored">
It Can Be Fixed / Managed
</h2>
<p>
Some ongoing “sustaining” and “accelerating” work is needed to drive down the cost and drag of past decisions. The “accelerating” work also sets up the product to scale and manage runtime costs.&nbsp;<br>
</p>
<p>
You can have some success by intentionally working in a “portfolio” way - keeping all the important work going while shifting the onus to the more appropriate category and letting engineering work out the details.
</p>
<p>
Imagine you could set the percentages (with engineering) for this kind of portfolio:<br>
</p>
<p>
</p>
<ul style="text-align: left;">
<li>
Advancing: Adding new features and UX improvements - all customer-facing.
</li>
<li>
Sustaining: Solving defects, doing support work, automated testing, and refactoring. Without these, the product either cannot run (certificates renewals), won’t run well (defects), can’t be sure to work (testing), or may suffer past design damage indefinitely.
</li>
<li>
Accelerating: doing work to increase development and validation speed so you can do more of the other two kinds of work successfully and quickly.
</li>
</ul>
<p style="text-align: left;">
Perhaps now is a good time to put 20% more effort into sustaining, to ensure that your existing customers will renew their subscriptions.
</p>
<p style="text-align: left;">
Alternatively, this may be a good time to put 30% more effort into new features because a trade show or sales push is coming up.
</p>
<p style="text-align: left;">
Are we frustrated with the slowing pace of work? Maybe we should put 40% of our effort into accelerating for a few weeks, then bring it back down to 10% or 15% of the total workload.
</p>
<p style="text-align: left;">
Are we getting bad press from defects? Perhaps we can reduce the accelerating work to 10% and put 50% into support and 40% into advancing features.&nbsp;<br>
</p>
<p style="text-align: left;">
This doesn’t need a lot of close supervision from outside engineering, just a good sense of what the product needs to move forward. There are ways for engineering groups to regroup and self-organize to meet goals.
</p>
<p style="text-align: left;">
There are many ways to handle this kind of problem, and I’d love to hear how yours works and how you keep your balance as an engineering organization.
</p>
<h2 style="text-align: left;" class="anchored">
Ecocycle Planning (Liberating Structures)
</h2>
<div>
At this point, I’m just relating what others have told me; I’ve not engaged in <a href="https://www.liberatingstructures.com/31-ecocycle-planning/">ecocycle planning</a> yet, but it seems a brilliant idea. Since it is a part of Liberating Structures, I don’t doubt that many other people have done so.&nbsp;
</div>
<div>
<br>
</div>
<div>
Take a look at the EP process, as it provides additional business context to the planning of development work.&nbsp;
</div>
<div>
<br>
</div>
<div>
Joshua Kerievsky is working on (and writing about) the business contexts of technical work. I hope to provide links to his articles in my blog as well as in social media as it becomes available for public consumption.<br><br><br>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<p>
</p>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-03-03-there-is-no-automatic-reset-in.html</guid>
  <pubDate>Mon, 03 Mar 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Pair Programming Listicle</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2025-02-11-pair-programming-listicle.html</link>
  <description><![CDATA[ 




<p>
There are many ways to collaborate, and <b><i>pair programming</i></b> is the first many people consider.&nbsp;
</p>
<p>
It’s a useful practice, though it can be emotionally intense compared to other ways of work like mob programming AKA teaming AKA ensemble, or swarming. It’s easier for people like me to work with three partners than only one.<br><br>The fact that other ways exist in no way diminishes the value of pair programming, and if you aren’t able or aren’t allowed to go to a more inclusive collaborative technique, pair programming is a great way to work.
</p>
<p>
That is, if you’re doing it correctly and don’t fall into the key dysfunctions…
</p>
<p>
Here are the resources:
</p>
<p>
<br>
</p>
<p>
BASICS
</p>
<ul>
<li>
Jeff and I wrote&nbsp;<a href="https://agileinaflash.blogspot.com/2009/02/abcs-of-pair-programming.html">The ABCs of Pair Programming</a>&nbsp;to help you get started.
</li>
<li>
Vitaly Sharovetov’s&nbsp;<a href="https://qase.io/blog/pair-programming/">Guide to Pair Programming</a>&nbsp;might be more your style; it’s pretty good!
</li>
<li>
Dragan takes us&nbsp;<a href="https://www.infoq.com/articles/co-creation-patterns-software-development/">from Async Code Reviews to Co-Creation Patterns</a>&nbsp;with Ben Linders.
</li>
<li>
<a href="https://www.cs.utexas.edu/~mckinley/305j/kindergarten.pdf">All I Need To Know About Pair Programming, I Learned In Kindergarten</a>&nbsp;by Williams and Kessler. This is often listed as a highly influential paper by experienced pair-programmers.
</li>
<li>
Ron Jeffries’<a href="https://ronjeffries.com/xprog/articles/practices/pracpairs/">&nbsp;Pair Programming article, written in 1998</a>&nbsp;describing his actual experiences using this practice in a real corporate project with deadlines.
</li>
<li>
Josh Kerievsky illustrated the concept with <a href="https://www.industriallogic.com/blog/pairdraw-2/">Pair Drawing</a>.
</li>
<li>
<a href="https://a.co/d/hcmiTvt">Williams and Kessler’s</a>&nbsp;Pair Programming Illuminated, based on significant, reviewed research&nbsp;
</li>
<li>
The description&nbsp;<a href="http://www.extremeprogramming.org/rules/pair.html">from eXtreme Programming.org</a>
</li>
<li>
The Agile Alliance’s&nbsp;<a href="https://www.agilealliance.org/glossary/pair-programming/">article on Pair Programming</a>&nbsp;&nbsp;
</li>
<li>
A very&nbsp;<a href="https://www.youtube.com/watch?v=3LhthBVU0nA&amp;ab_channel=TimOttinger">old YouTube video</a>&nbsp;I made
</li>
</ul>
<p>
TIPS FOR PRACTITIONERS
</p>
<ul>
<li>
Duckly’s&nbsp;<a href="https://duckly.com/blog/7-tips-for-successful-pair-programming/">7 Tips</a>&nbsp;For Successful Pair Programming
</li>
<li>
Martin Fowler’s&nbsp;<a href="https://martinfowler.com/articles/on-pair-programming.html">Writings On Pair Programming</a>&nbsp;with Birgitta Böckeler and&nbsp;Nina Siessegger&nbsp;
</li>
<li>
Jeff and I wrote&nbsp;<a href="https://medium.com/pragmatic-programmers/pair-programming-benefits-two-heads-are-better-than-one-6e13c55ddfc">Two Heads are Better Than One</a>&nbsp;for Pragmatic Programmers, describing the benefits that people can expect.
</li>
<li>
<i>Note that apparently James Coplein wrote one with the same name (Two Heads are Better Than One) earlier than ours, and it’s not available to me. If you have a link to his, please send it on.</i>
</li>
<li>
A <a href="https://anthonysciamanna.com/2020/02/15/mob-programming-quick-start-guide.html">mob programming quick-start article</a> by <a href="https://www.industriallogic.com/people/anthony/">Anthony Sciamanna</a> is also relevant to pair programming. You could be improved by reading everything Anthony writes.&nbsp;
</li>
<li>
If you pair-program in person, <a href="https://www.clearlyagile.com/agile-blog/2016/5/20/pair-programming-configurations">configure your space.</a>
</li>
<li>
Try some <a href="https://blog.coscreen.co/blog/top-8-remote-pair-programming-tools/">remote pair programming tools</a>.&nbsp;
</li>
</ul>
<p>
<br>DYSFUNCTIONS
</p>
<ul>
<li>
<a href="https://agileinaflash.blogspot.com/2009/02/pair-programming-smells.html">Pair Programming Smells</a>&nbsp;(from AgileInAFlash) by Jeff and myself, again.
</li>
<li>
The antipatterns of&nbsp;<a href="ttps://www.industriallogic.com/blog/programming-under-surveillance/">Programming Under Surveillance</a>&nbsp;instead of pair-programming.
</li>
<li>
A video about&nbsp;<a href="https://www.youtube.com/watch?v=McZ131y0OYU&amp;ab_channel=DigvijayGunjal">pair programming dysfunctions</a>
</li>
</ul>
<p>
<br>BENEFITS
</p>
<ul style="text-align: left;">
<li>
Dave Farley’s <a href="https://youtu.be/fbxMV76e7_E?si=QKugfzPdSHYON2Mv">Pros and Cons of Pair Programming</a>
</li>
<li>
Dr.&nbsp;Williams’ t<a href="https://nrc-publications.canada.ca/eng/view/accepted/?id=fa72ee73-13b7-41db-9d23-9928b9618ff1">he economics of software development</a> “indicates that pair programming is highly productive.”
</li>
<li>
Williams, Kessler, Cunningham, and Jeffries: <a href="https://citeseerx.ist.psu.edu/document?repid=rep1&amp;type=pdf&amp;doi=53370a9549890cce5a18324ba4575112e6e6ee82">Strengthening the Case for Pair Programming</a>
</li>
<li>
Other of Dr Williams <a href="https://scholar.google.com/citations?user=Cln2viUAAAAJ">research papers and writings.</a>
</li>
<li>
Alistair Cockburn’s paper with Dr Williams on <a href="https://www.researchgate.net/publication/2333697_The_Costs_and_Benefits_of_Pair_Programming">The Costs and Benefits of Pair Programming</a>
</li>
<li>
David Bernstein’s video on <a href="https://youtu.be/aiXr7mEB4ms?si=K6K5gPwV34nubXqi">Why Pair Programming is the Future</a>
</li>
</ul>
<p>
</p>
<p style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: var(--artdeco-reset-typography-font-family-sans); font-size: inherit; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">
<span style="font-weight: var(--artdeco-reset-typography-font-weight-normal);">This is just a start. Sometimes we ship </span><b><i>and then </i></b><span style="font-weight: var(--artdeco-reset-typography-font-weight-normal);">refactor …in this case, I have shipped this article knowing it’s not comprehensive and may&nbsp;</span>
</p>
<p style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: var(--artdeco-reset-typography-font-family-sans); font-size: inherit; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">
<span style="font-weight: var(--artdeco-reset-typography-font-weight-normal);"><br></span>
</p>
<p style="border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: var(--artdeco-reset-typography-font-family-sans); font-size: inherit; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">
<span style="font-weight: var(--artdeco-reset-typography-font-weight-normal);">Tool vendor <a href="https://tuple.app/pair-programming-guide">Tuple also has a listicle on pair programming.</a> You might find it useful.<br><br>Feel free to suggest other links that you have found helpful, funny, or illuminating.<br><br>Also, remember that we teach these skills at <a href="https://www.industriallogic.com/get-in-touch/">Industrial Logic&nbsp;</a>&nbsp;along with many other technical, management, and UX skills. We’re here to help you be successful. Give us a call.</span>
</p>



 ]]></description>
  <category>listicle</category>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2025-02-11-pair-programming-listicle.html</guid>
  <pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Irresponsibility: Estimates and NoEstimates</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-12-11-irresponsibility-estimates-and.html</link>
  <description><![CDATA[ 




<p>
<span style="background-color: white; font-size: 20px; white-space-collapse: preserve;">Sometimes the argument is made that<i> not estimating</i> is <i>irresponsible</i>. </span>
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
I understand why people say it. I don’t necessarily agree. It is arguable that relying on developer estimates is at least as irresponsible.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br>
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
There are interesting counterarguments that I’ll summarize here.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br>
</p>
<h3 style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;" class="anchored">
But First, This:
</h3>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br style="box-sizing: inherit; font-family: var(--artdeco-reset-typography-font-family-sans);">
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
Many arguments lean on “managers <i>need</i> accurate and precise estimates” but if those don’t exist, it seems irresponsible to depend on them. Would you build your entire company’s operating system on Unicorn Poop? That companies are in business despite needing more accuracy and precision than they get suggests that maybe the pinpoint accuracy isn’t as important as we let on.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br style="box-sizing: inherit; font-family: var(--artdeco-reset-typography-font-family-sans);">
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
“Before buying a thing, I need to know the cost!” say some. Software development isn’t like “buying a thing.” It is a collaborative development project. It can’t be what it isn’t. It needs ongoing management involvement.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br>
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
I don’t expect the above paragraphs to put those arguments to rest. They will be brought out because if estimates were reliable it would make management much easier, and nobody wants management to be incredibly hard. Sadly, it’s only wishful thinking.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br>
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<a href="https://pragprog.com/titles/gdestimate/software-estimation-without-guessing/">George Dinwiddie’s book</a> suggests that we be empathetic toward the managers’ needs and ask what they need the estimates for, how they plan to use them, and how we can help them. I like his approach and recommend his book.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br style="box-sizing: inherit; font-family: var(--artdeco-reset-typography-font-family-sans);">
</p>
<h2 style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; text-align: left; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;" class="anchored">
The Responsibility Argument
</h2>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br style="box-sizing: inherit; font-family: var(--artdeco-reset-typography-font-family-sans);">
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
</p><p>So, on to the point suggested in the title: is estimation the responsible choice, and looking for other ways an irresponsible choice?</p>
<p></p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
Can we balance these and compare them like-for-like?
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br>
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
Let’s try.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
</p>
<ol style="text-align: left;">
<li>
Wasting project time estimating and re-estimating (including detailing and estimating work that will never be done) is irresponsible. We see teams wasting many person-weeks per year (often more than 3 person-months) trying to estimate more precisely and accurately, without positive effect.&nbsp;
</li>
<li>
The estimate is not the duration. Getting people to shorten the <i>estimate</i> doesn’t shorten the <i>duration</i>. Misunderstanding this leads to “sprint packing,” which is an open invitation to cascading schedule failure.
</li>
<li>
Summing inaccurate guesses won’t add up to an accurate number especially when there is pressure to guess low. Pretending it will average out (when it never has) is unrealistic and irresponsible.
</li>
<li>
You can’t make your estimates more precise and accurate than the natural variation in the work. Even setting story points to half-days won’t help with this. See <a href="https://www.industriallogic.com/blog/story-points-why-is-this-so-hard/">Why Is This So Hard?</a>
</li>
<li>
Estimating harder and more often doesn’t eliminate randomness and variation in the system. Rather than estimating harder, work on becoming more predictable (even if it doesn’t seem faster).
</li>
<li>
Predictability isn’t always what you most need from your teams. Does it make the outcomes better, or only make managing easier? What would you surrender (in time and money) to improve predictability? Would you be willing to allow teams to work differently (perhaps mob programming or TDD) to improve predictability, knowing that it will slow them down in the short term?
</li>
<li>
Proponents of <span class="ql-hashtag" data-test-ql-hashtag="true" data-face="var(--artdeco-reset-typography-font-family-sans)" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); overflow-wrap: normal; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">#NoEstimates</span> never claimed you could eliminate every kind of sizing &amp; estimation. It’s just a hashtag. It’s about reducing estimation waste, but the hashtag is the name that stuck. “AHA! You are choosing a day’s worth of work! That’s estimating!” never was the sockdolager one might expect. Proponents take that easily in stride. They recommend forecasting and slicing the work thin – it doesn’t upset them that those are forms of estimation.
</li>
<li>
Managers must work with teams to manage risks. They can’t delegate risk management to developers via estimation. They cannot “quiet quit” management by reducing it to mere scheduling.
</li>
<li>
Managing, again: “How long will it take you to do this in 8 months?” isn’t a question. If the date’s a given, the more important questions are “What do we do first?” and “What can we de-scope to hit the deadline?”
</li>
</ol>
<p>
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br style="box-sizing: inherit; font-family: var(--artdeco-reset-typography-font-family-sans);">
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
All methods that help teams, managers, and clients work together efficiently to produce a positive outcome without all the irresponsible wastes of typical estimate-heavy systems are welcome under the <span class="ql-hashtag" data-test-ql-hashtag="true" data-face="var(--artdeco-reset-typography-font-family-sans)" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); overflow-wrap: normal; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">#NoEstimates</span> banner.
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
<br style="box-sizing: inherit; font-family: var(--artdeco-reset-typography-font-family-sans);">
</p>
<p style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: -apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif; font-size: 20px; line-height: 1.5; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">
</p><p>This blog post is unlikely to convince anyone who is of a solid opinion, but maybe it’s helpful to people who want to look at it from multiple angles and who don’t feel threatened by the fact that this hashtag and its concepts exist, nor by the idea that it’s not universally accepted.</p>
Be kind to each other. Don’t refuse to care or refuse to listen. If you exercise “curiosity over judgment”, there is no telling how far you will go. Maybe this article is an exercise in seeing things from a different point of view?
<p></p>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-12-11-irresponsibility-estimates-and.html</guid>
  <pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Basic Microphone Usage</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-08-06-basic-microphone-usage.html</link>
  <description><![CDATA[ 




<p>
<span style="color: var(--primary-text); font-family: inherit;">How to use&nbsp;</span><span style="color: var(--primary-text); font-family: inherit; font-size: 0.9375rem; white-space-collapse: preserve;">microphones (pay special attention to (3) and (12)!!!! :</span>
</p>
<div class="html-div xdj266r x11i5rnm xat24cr x1mh8g0r xexx8yu x4uap5 x18d9i69 xkhd6sd" style="font-family: inherit; margin: 0px; padding: 0px;">
<div class="html-div xdj266r x11i5rnm xat24cr x1mh8g0r xexx8yu x4uap5 x18d9i69 xkhd6sd" dir="auto" style="font-family: inherit; margin: 0px; padding: 0px;">
<div id=":r3a2:" class="x1iorvi4 x1pi30zi x1swvt13 xjkvuk6" data-ad-comet-preview="message" data-ad-preview="message" style="font-family: inherit; padding: 4px 16px;">
<div class="x78zum5 xdt5ytf xz62fqu x16ldp7u" style="display: flex; flex-direction: column; font-family: inherit; margin-bottom: -5px; margin-top: -5px;">
<div class="xu06os2 x1ok221b" style="font-family: inherit; margin-bottom: 5px; margin-top: 5px;">
<span class="x193iq5w xeuugli x13faqbe x1vvkbs xlh3980 xvmahel x1n0sxbx x1lliihq x1s928wv xhkezso x1gmr53x x1cpjm7i x1fgarty x1943h6x x4zkp8e x3x7a5m x6prxxf xvq8zen xo1l8bm xzsf02u x1yc453h" dir="auto" style="-webkit-font-smoothing: antialiased; color: var(--primary-text); display: block; font-family: inherit; font-size: 0.9375rem; line-height: 1.3333; max-width: 100%; min-width: 0px; overflow-wrap: break-word; word-break: break-word;">
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="font-family: inherit; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
<ol style="text-align: left;">
<li>
NEVER NEVER NEVER point your microphone at a speaker. Not even accidentally. Don’t drop your hands so the mic points at the on-stage speakers. Don’t walk in front of a loudspeaker while holding a mic. The feedback will be piercing and can damage the system (as well as the audience’s hearing)!
</li>
<li>
If you are afraid of feedback, hold the mic <i><b>closer to your face</b></i>. The further away you hold it, the more the sound person has to raise the sensitivity of the mic (making feedback more likely).
</li>
<li>
Don’t cup the head of the mic. Cupping causes feedback, for technical reasons – just don’t do it.
</li>
<li>
It is okay to hear yourself; it means others can hear you. That’s what the mic is for. Let the sound engineer make any necessary volume adjustments.
</li>
<li>
Now that you are hearing yourself, you can adjust your pitch and pronunciation to sound better through the sound system.
</li>
<li>
If you’re singing, you will hear your own pitch better through the system than through the bones of your head. This will eliminate any delusions you have about your pitch, but it’s a good thing. Imagine being off-pitch and NOT knowing it! Using the monitors is a skill you will pick up quickly.
</li>
<li>
Point the mic at your tonsils. Hold the microphone like it’s a glass of water and you are about to take a sip.
</li>
<li>
For the sake of those who read lips, keep the mic just below your lower lip.
</li>
<li>
If the mic is on a stand, try to follow the same advice. Either stand close to the mic or pull it closer to you, keep your mouth visible, listen, and adjust.
</li>
<li>
Don’t put your mouth on the mic, nor the mic in your mouth. Saliva on mics was always gross even before COVID.
</li>
<li>
<span style="color: var(--primary-text); font-family: inherit; font-size: 0.9375rem;">If you’re going to shout, put a bit of distance between you and the mic. You want the system to have the same sound level. Shouting directly into the mic will cause a lot of distortion and noise, and nobody likes that. Don’t worry, you’ll sound like you’re shouting even if it isn’t actually louder.</span>
</li>
<li>
Don’t blow into the mic (not with mouth <i>or nose</i>). Saliva can rust or damage the sensitive inner workings. It won’t instantly fail the first time someone does it, but it will need replacement sooner if people blow in it.
</li>
<li>
Don’t tap the mic. The impact can damage the internal workings of the mic. It won’t fail immediately, but it will eventually need replacement sooner.
</li>
</ol>
<div>
<br>
</div>
</div>
</div>
</span>
</div>
</div>
</div>
</div>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-08-06-basic-microphone-usage.html</guid>
  <pubDate>Mon, 05 Aug 2024 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Profitable Struggle and Unprofitable Struggle</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-05-24-profitable-struggle-and-unprofitable.html</link>
  <description><![CDATA[ 




<p>
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;"><br></span>
</p>
<p>
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">Imagine I have to work in an unfamiliar and tough passage of code.</span>
</p>
<h2 style="text-align: left;" class="anchored">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: small;">Unprofitable Code</span>
</h2>
<p>
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">I spend time and effort to puzzle it out, and all I get from it is that now I understand that tough passage.</span>
</p>
<p>
If it was written in the most primitive way possible, using no interesting language or library features (which might have made it less puzzling) then it is <i><b>unprofitable</b></i><span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">.&nbsp; I have invested my time in “playing computer,” simulating every line of code and tracking each value in my head, or perhaps I walked through every line and watched every variable in a debugger.&nbsp;</span>
</p>
<p>
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">I have expended this effort of will and focus but received little in return. I know what this bit of code is doing (for now) but I won’t be any faster to write or read other code because of it.</span>
</p>
<p>
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">That knowledge will be lost in months, possibly weeks or days.</span>
</p>
<p>
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">The unprofitable code, left in its original form, will require as much effort next year as it did this time. It is a productivity speed bump.</span>
</p>
<h2 style="text-align: left;" class="anchored">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white; font-size: small;">Profitable Code</span>
</h2>
<p style="text-align: left;">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">OTOH, if I dig into some unfamiliar and tough passage and learn some idioms, standard library functions, built-in syntax, or framework capabilities then I have been rewarded for my pains.&nbsp;</span>
</p>
<p style="text-align: left;">
<span color="rgba(0, 0, 0, 0.9)" data-face="-apple-system, system-ui, &quot;system-ui&quot;, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Fira Sans&quot;, Ubuntu, Oxygen, &quot;Oxygen Sans&quot;, Cantarell, &quot;Droid Sans&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif" style="background-color: white;">This is <i><b>profitable</b></i> work; I know how to read and write similar code more fluently. It may save me minutes, hours, or even days of work. My investment will pay dividends for a long time.</span>
</p>
<p style="text-align: left;">
People familiar with the idioms and method will move quickly through this code, and others will only have to suffer that initial shock of newness once.&nbsp;
</p>
<div>
<h2 style="text-align: left;" class="anchored">
<span style="font-size: small;">The Scouting Rule</span>
</h2>
<div>
<div style="text-align: left;">
<p style="text-align: left;">
I like the “leave it better than you found it” rule.&nbsp;
</p>
<p style="text-align: left;">
I could rewrite the unprofitable code as profitable code if I have the time and there are enough tests to make refactoring or rewriting safe.&nbsp;
</p>
<p style="text-align: left;">
Without the safety of tests, I wouldn’t want to take the chance of breaking all the code that depends on this passage.
</p>
<p style="text-align: left;">
If I can’t make it profitable, I can make the code less <i>un</i>profitable.
</p>
<ul style="text-align: left;">
<li>
I could add tests so that the next person to encounter this code has more safety than I had.
</li>
</ul>
<ul style="text-align: left;">
<li>
I could do safe refactorings (rename variables, extract expressions, extract methods) to make it less puzzling.
</li>
</ul>
<ul style="text-align: left;">
<li>
If all else fails, I can add some comments.&nbsp;
</li>
</ul>
</div>
<div style="text-align: left;">
<h2 style="text-align: left;" class="anchored">
<span style="font-size: small;">Is This The Right Thing To Do?</span>
</h2>
<p>
</p>
<p style="text-align: left;">
That’s all probably obvious and straightforward, but there is a more interesting question underlying all of this:
</p>
<p style="text-align: left;">
</p>
<blockquote class="blockquote">
Does the team <i>want</i> to learn the language and libraries fluently, or are they striving to <i>avoid learning</i> how to use those?
</blockquote>
<p>
</p>
<div>
<p>
Readability is present in the relationship between a code artifact and its audience; its ENTIRE audience.
</p>
<p style="text-align: left;">
I am an author or an editor, but that makes me a minority part of the audience of this source code. All my colleagues and future colleagues who share the codebase are also the audience.
</p>
<p style="text-align: left;">
If<i> the last thing they want </i>is to profit from this example then fluent use of the stack is a failing.
</p>
<p style="text-align: left;">
If becoming more competent is a goal, then avoiding fluent use is failing.
</p>
<p style="text-align: left;">
<span style="color: #351c75;">The important thing is not my writing, but their reading.&nbsp;</span>
</p>
<h2 style="text-align: left;" class="anchored">
<span style="font-size: small;">And so…. what?</span>
</h2>
<p style="text-align: left;">
<span style="font-size: small;">Since readability is a quality of a relationship between the artifact and its audience, I have some choices.&nbsp;</span>
</p>
<p style="text-align: left;">
<span style="font-size: small;">We can change the artifact to meet the audience’s requirements and make the code more readable without changing or improving the audience.</span>
</p>
<p style="text-align: left;">
<span style="font-size: small;">We can change the knowledge and comfort of the audience and thereby raise the readability of the code without changing the code in any way.</span>
</p>
<p style="text-align: left;">
There is also a middle path: we can change the code and the audience’s expectations. It does not have to be all one thing or all the other.
</p>
<p style="text-align: left;">
What is your strategy for code readability and developer competence?&nbsp;&nbsp;
</p>
<p style="text-align: left;">
<br>
</p>
<div>
<br>
</div>
<div>
<br>
</div>
</div>
</div>
</div>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-05-24-profitable-struggle-and-unprofitable.html</guid>
  <pubDate>Thu, 23 May 2024 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Definition-by-Dysfunction</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-02-27-definition-by-dysfunction.html</link>
  <description><![CDATA[ 




<p>
&nbsp;I’ve done it. You’ve seen me.
</p>
<p>
You’ve done it. I watched you do it.<br>
</p>
<p>
We’ve probably argued about it.
</p>
<h2 style="text-align: left;" class="anchored">
The Defining Dysfunctions
</h2>
<p>
I published a <a href="https://www.industriallogic.com/blog/programming-under-surveillance/">blog post some time ago on the Industrial Logic website </a>about programming together vs programming under surveillance. It’s a relatively simple piece, and it identifies a problem we have in the world when it comes to just about any technique or discipline.
</p>
<blockquote class="blockquote">
<p>
<span data-face="Poppins, sans-serif" style="background-color: white; color: #333333; font-size: 18px;">When I suggested that people mistake group programming for working under surveillance, an incredulous reader exclaimed&nbsp;</span><em style="background-color: white; box-sizing: border-box; color: #333333; font-family: Poppins, sans-serif; font-size: 18px;">“How could it possibly be anything else!?”</em>
</p>
</blockquote>
<p>
So here’s the thing: a person had a bad experience where instead of actually researching what pair programming is and how it works, they just sat down at a keyboard with another person and tried “doing pair programming” without any pre-study or preparation. They ended with one person bored, watching the other program.&nbsp;&nbsp;
</p>
<p>
This is a widely-known dysfunction or “failure pattern” known as “Worker/Watcher.” It’s not how pair programming is done.&nbsp;
</p>
<p>
The two people who had this one unpleasant, uninformed, wasteful experience came into it with little more than a sound bite (“two people coding together”), guessed at how it was done (“one person types”), and had a poor experience.&nbsp;
</p>
<p>
Since they didn’t start with a good definition of pair programming, that experience became the <i>definition </i>of pair programming.&nbsp;
</p>
<p>
They had a <i>defining dysfunction.</i>&nbsp;
</p>
<p>
Unless something new happens, they will forever see pair programming as wasteful and pointless practice.<br><br>Is that the real definition of pair programming?&nbsp;
</p>
<p>
Is that what it’s about and how it’s done?&nbsp;
</p>
<p>
Not remotely. but it is the one touch-point they have – the one experience that they have had of it, and “pair programming” is the name of that experience now.
</p>
<p>
Do they want to try it again? Clearly not. They <i>know</i> what it is, and it’s nonsense.&nbsp;
</p>
<p>
They will likely take to social media to decry the BS that is pair programming and save everyone else from this wasteful and unprofitable behavior.
</p>
<p>
You and I have likely done the same.&nbsp;
</p>
<p>
Give those complainers some credit, because at least they tried it (or something that they imagined was it) first.
</p>
<h2 style="text-align: left;" class="anchored">
Some Examples Might Be Useful Here
</h2>
<p>
I ranted against scrum™for years, because I let the dysfunctions I routinely see become the definition of the process for me. If anyone were to actually try doing scrum™it would be a pretty good way of working, but nobody does.
</p>
<p>
Sadly, a lot of people in that space have adopted the defining dysfunctions. As far as they are concerned the “right way” to do scrum™ is to have a titled person assign individual work tickets to developers, who strive to serve the maximum number of tickets per fortnight to raise the velocity of the team – striving to do “twice the work in half the time” (a soundbite). This isn’t remotely what the defining document of the scrum™ method describes but it is what is often taught as “doing scrum.”
</p>
<p>
Are you an agile hater because it’s all Jira tickets, meetings, estimation, and work crammed in to meet artificial deadlines? I’d hate that too. I do hate that. It’s just not agile. it’s not even scrum™.
</p>
<p>
Do you hate agile because agile is “no documentation,” “no design,” and “no estimates”?&nbsp; Well, that’s a worthy distaste. It’s also a mischaracterization.
</p>
<p>
Do you hate TDD because you have to write all the tests first, and you don’t even know what shape the answer is going to take, so it’s impossible? Well, that’s a bad process, and it’s not TDD. It’s not the definition of TDD, it’s just a failure mode.
</p>
<h2 style="text-align: left;" class="anchored">
Why Bother Trying?
</h2>
<p>
Sometimes people don’t even have to have a bad experience to adopt a defining dysfunction. They hear a sound bite or title and <i>imagine</i> dysfunctions. They (efficiently) go straight to disdaining the practice based on their <i>imagined</i> defining dysfunctions.<br><br>Do you think that Psychological Safety means you can’t ever say anything that might possibly upset someone? Does Radical Candor mean that you can say whatever you want without consequence? Wrong, and wrong. Those are defining <i>guesses</i> at <i>dysfunction</i>.&nbsp;
</p>
<p>
If we only guess at a discipline or a philosophy or a behavior and don’t actually bother to investigate what it’s intended to be, what it really means, and how people actually perform it then we don’t have the basis for an honest opinion. If we have only experienced it as a bad attempt at a good idea we haven’t formed a valid opinion.&nbsp;
</p>
<h2 style="text-align: left;" class="anchored">
We’re Too Smart For That!
</h2>
<p>
Have you jumped to conclusions based on naive attempts or imagination alone?
</p>
<p>
I’m betting we both have.&nbsp; It’s a human thing, and we’re all human. It doesn’t much matter how smart or experienced you are – you’ve done this. I might just be projecting, but I’ve seen too many examples to believe it to be less than universal. Please prove me wrong!
</p>
<p>
I’m willing to bet that you’ve done so this week. Let’s both look out for these mistakes, because I’m betting that we could be more successful at many things if we took the time to understand them.
</p>
<p>
<br><br>
</p>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-02-27-definition-by-dysfunction.html</guid>
  <pubDate>Tue, 27 Feb 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Listicle on Flow and Teamwork</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-02-27-listicle-on-flow-and-teamwork.html</link>
  <description><![CDATA[ 




<p>
Some article links related to solo vs group, flow, productivity, and predictability.
</p>
<p>
</p>
<ul style="text-align: left;">
<li>
<a href="https://www.industriallogic.com/blog/stop-per-person-swimlanes">Stop using Per-Person Swimlanes</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/swarm-programming-with-the-swarm-board">Swarming</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/pitfalls-of-solo-work">Pitfalls of solo work</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/programming-under-surveillance">Programming Under Surveillance</a>, or in groups?
</li>
<li>
<a href="https://www.industriallogic.com/blog/faster-and-more-predictable">Faster and More Predictable</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/managing-interruptions">Managing Interruption</a>s
</li>
<li>
<a href="https://www.industriallogic.com/blog/work-to-be-interruptible">Work To Be Interruptible</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/scatter-gather">Scatter-Gather</a> software development
</li>
<li>
What is your <a href="https://www.industriallogic.com/blog/first-time-through">First Time Through</a> ratio?
</li>
<li>
<a href="https://www.industriallogic.com/blog/squeezing-or-slicing">Squeezing Vs Slicing</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/managing-programmers">Managing Programmer Productivity</a>
</li>
<li>
<a href="https://www.industriallogic.com/blog/over-starting-and-under-finishing">Over-Starting and Under-finishing</a>
</li>
</ul>
<p>
</p>



 ]]></description>
  <category>listicle</category>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-02-27-listicle-on-flow-and-teamwork.html</guid>
  <pubDate>Tue, 27 Feb 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Fundamentally Wrong</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-01-15-fundamentally-wrong.html</link>
  <description><![CDATA[ 




<p>
The Problem
</p>
<p>
An <a href="https://hackernoon.com/test-driven-development-is-fundamentally-wrong-hor3z4d">article</a>&nbsp;has been shared with me by several friends and also by some critics, and some people who are both, describing how TDD is fundamentally wrong, and doing test-after-development is better.
</p>
<p>
To be fair, the process described here is fundamentally wrong:
</p>
<p>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgLKxdyfKJv3deqCM8-LTXeznNrsp2HfEnKNPag4c7-9_CZd3PywIXZhvp3scdEtnFRKqeeJC7VcBQ38mJBdxPaGlHTDlabXk21ss-vbbLP1WyfBoodM_I7Q2-6M4nuHNqk7GzLX22gdRQ55E7V1iGKKq81UULSHnfcfXlyecJN81a1fvGu8Cvexovkez4" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="936" data-original-width="1744" height="172" src="https://blogger.googleusercontent.com/img/a/AVvXsEgLKxdyfKJv3deqCM8-LTXeznNrsp2HfEnKNPag4c7-9_CZd3PywIXZhvp3scdEtnFRKqeeJC7VcBQ38mJBdxPaGlHTDlabXk21ss-vbbLP1WyfBoodM_I7Q2-6M4nuHNqk7GzLX22gdRQ55E7V1iGKKq81UULSHnfcfXlyecJN81a1fvGu8Cvexovkez4" width="320"></a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br>
</div>
The problems with step #1 would indeed lead to the wasteful problems described below it. The recommendation here would certainly be better than the process described above:<br><br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhOHbII-oSbSMC4jBIBoLL4n-oGT_Cx28RLNVaWIWhBmchFbUuN25JgmOpMgxuaJYRqKKNtLPP6yrabjNAcVUJDE5AOQJ03_xX8BT0BySvgZIMPVAPQ7fQ1ulAdPjiLwGjDcaYhHmPOthT4brW4scTDXtSpw7o5XsglJptwNTQqxKr_I94jPVoq_7i5xVY" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="688" data-original-width="1894" height="116" src="https://blogger.googleusercontent.com/img/a/AVvXsEhOHbII-oSbSMC4jBIBoLL4n-oGT_Cx28RLNVaWIWhBmchFbUuN25JgmOpMgxuaJYRqKKNtLPP6yrabjNAcVUJDE5AOQJ03_xX8BT0BySvgZIMPVAPQ7fQ1ulAdPjiLwGjDcaYhHmPOthT4brW4scTDXtSpw7o5XsglJptwNTQqxKr_I94jPVoq_7i5xVY" width="320"></a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br>
</div>
<div>
<br>
</div>
<h3 style="text-align: left;" class="anchored">
TDD Is Fundamentally Wrong is Fundamentally Wrong
</h3>
<br>Now, the problem with this article is more fundamental than the problem being described.
<p>
</p>
<div style="text-align: center;">
<b><span style="font-size: large;">TDD does not mean “<i>Write all the tests then all the code</i>”</span></b>
</div>
<div style="text-align: center;">
<b><span style="font-size: x-large;"><br></span></b>
</div>
<div style="text-align: center;">
<b>It has never meant that.</b>
</div>
<div style="text-align: center;">
<b><br></b>
</div>
<div style="text-align: center;">
<b><span style="font-size: x-large;"><i>That is not TDD.</i></span></b>
</div>
<div style="text-align: center;">
<b><span style="font-size: x-large;"><br></span></b>
</div>
<div style="text-align: center;">
<b>That is some other misbegotten travesty that has no name.</b>
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
This is the fifth or sixth time I’ve heard anyone describe TDD as writing <i>all</i> the tests first. In all cases except one, it has been described by people who self-describe as being anti-TDD, and who write articles decrying the foolishness that they identify as TDD (which is not TDD).
</div>
<div>
<br>
</div>
<div>
I have never seen anyone do TDD that way – even unsuccessfully.&nbsp; I have never seen anyone even try to do TDD that way. I would never sit by while someone tried to do that and called it TDD. That’s simply not the process.
</div>
<div>
<br>
</div>
<div>
The one time that I read an article that actually recommended doing that, it was from a Microsoft publication early in the XP/Agile days. The public outcry was great and sudden, and the article was retracted. I don’t think I’ve ever seen anyone else recommend that approach,&nbsp;&nbsp;<i>because that approach is so obviously flawed and was never the process used by original XP teams.</i>
</div>
<h3 style="text-align: left;" class="anchored">
So What Is TDD?
</h3>
<div>
<br class="Apple-interchange-newline">TDD was originally described as a three-step dance that repeats over and over as one develops code.
</div>
<div>
<br>
</div>
<div>
You can take that <a href="https://tidyfirst.substack.com/p/canon-tdd">straight from the horse’s mouth </a>(so to speak):<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhsMnhgobsOo2-OMOba0xZP7XPzd2lfdCrHG1JAuJecO7Ze4qlbBTZrZLgbTWpSxhjxURQEbIi9GSsUrTofuqV9Bk-knL8Wye2MCIzCJvYi-oYXr7XEy9-ev40GT58Ks4Nxc2UZhvLt2tq2MK7juRoYC-qg_65cTVIZ78pkEttdLuaJh_kk-pne8o8369U" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="480" data-original-width="857" height="204" src="https://blogger.googleusercontent.com/img/a/AVvXsEhsMnhgobsOo2-OMOba0xZP7XPzd2lfdCrHG1JAuJecO7Ze4qlbBTZrZLgbTWpSxhjxURQEbIi9GSsUrTofuqV9Bk-knL8Wye2MCIzCJvYi-oYXr7XEy9-ev40GT58Ks4Nxc2UZhvLt2tq2MK7juRoYC-qg_65cTVIZ78pkEttdLuaJh_kk-pne8o8369U=w365-h204" width="365"></a>
</div>
<br><br>
</div>
<div>
<br>
</div>
<div>
To these three steps, we (at Industrial Logic) added a fourth and final step.&nbsp; Others may also have independently added this 4th step, I don’t know.
</div>
<div>
<br>
<ol style="text-align: left;">
<li>
<b>Write a test that does not pass,</b> and in fact cannot pass, because the functionality it describes does not exist.&nbsp; This failing test is the <span style="color: #990000;">RED</span> step, so-called because test-running programs generally produce the results of a failed test run colored red.
</li>
<li>
<b>Write the code that passes the test.</b>&nbsp; When the test passes, it is typical that the test-running program will present the results colored green, so this is often called the <span style="color: #38761d;">GREEN</span> step. The code may not be optimal or beautiful, but it does (only) the thing the test(s) require it to do.
</li>
<li>
<b>Refactor the code and test </b>so that both are readable, well-structured, clean, simple, and basically full of <a href="https://www.industriallogic.com/blog/code-virtues-explained/">virtue</a> (so far).&nbsp; Refactoring requires the presence of tests, so this way we can refactor as soon as the code passes the tests, rather than waiting until after all the code for our feature/story/task is finished. We refactor very frequently.
</li>
<li>
<b>Integrate</b>&nbsp;with the code base. This will include <i>at least</i>&nbsp;making a local commit. Most likely it will be a local comment and also a pull from the main branch (preferably <span style="font-family: courier;">git pull -r</span>). More than half the time, it also includes a push to the shared branch so everyone else can benefit from our changes and detect any integration issues early.
</li>
</ol>
<div>
<br>
</div>
<div>
<br>
</div>
&nbsp;We repeat this cycle for the next test. The whole cycle may repeat 4-10 times an hour.
</div>
<div>
<br>
</div>
<div>
<br>
</div>
<div>
We do 1-2-3-4-1-2-3-1-2-3-4, we do not do 111111111-222222222-44444-(maybe someday)333.&nbsp; These are not batched.
</div>
<div>
<br>
</div>
<h3 style="text-align: left;" class="anchored">
Was It A Misunderstanding of the List Method?
</h3>
<div>
Some people misunderstood Kent Beck’s <i>List Method</i>, in which you begin with a step 0 of writing down a list of the tests you think you will need to pass for your change to be successful (see the screen shot and link to Kent Beck’s article).&nbsp;
</div>
<div>
<br>
</div>
<div>
Note that you only make a list of tests. You do not write them all in code.
</div>
<div>
<br>
</div>
<div>
As you enter the TDD cycle, you take a test from the list. That may be the first test, the easiest test, the most essential test, or the most architecturally significant test. You follow the 4-step (or 3-step) dance as above.&nbsp;
</div>
<div>
<br>
</div>
<div>
If you realize a test is unnecessary, you scratch it off the list. Don’t write tests if the functionality they describe is already covered by an existing test.
</div>
<div>
<br>
</div>
<div>
As you make discoveries, you add new tests to the list. That discovery may lead you to scratch some unwritten tests off the list. That’s normal.
</div>
<div>
<br>
</div>
<div>
Eventually, you will note that all the tests on your list have been scratched out. Either you implemented them, or you realized they’re unnecessary. This applies to the tests you discovered as well as the original list.
</div>
<div>
<br>
</div>
<div>
You’ve done everything you can think of doing that is relevant to this task, so you must be done. This is doubly true if you have a partner also thinking with you, or even more certain if you have a whole ensemble cast working with you.
</div>
<div>
<br>
</div>
<div>
You never had to predict the full implementation of the features and write tests against that speculative future state.
</div>
<div>
<br>
</div>
<div>
It’s a tight inner cycle, not a series of batches.
</div>
<div>
<br>
</div>
<h3 style="text-align: left;" class="anchored">
Do I disagree with the article, then?
</h3>
<div>
<br>
</div>
<div>
Indeed, the “write all tests first” would only work for the most trivial and contrived practice example. It would never suffice in real work where <a href="https://agileotter.blogspot.com/2014/09/programming-is-mostly-thinking.html">11/12ths of what we do is learning</a>, reading, and thinking.
</div>
<div>
<br>
</div>
<div>
As far as the process being unworkable, I totally agree.
</div>
<div>
<br>
</div>
<div>
As far as that process being TDD, I totally disagree.&nbsp;<br><br>That characterization of TDD is fundamentally wrong.
</div>
<div>
<br>
</div>
<div>
<br>
</div>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-01-15-fundamentally-wrong.html</guid>
  <pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Python Listicle!</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2024-01-05-python-listicle.html</link>
  <description><![CDATA[ 




<div>
People often ask me (directly, or just generally posting to some social site) how they can learn Python quickly.&nbsp;&nbsp;
</div>
<div>
<br>
</div>
<div>
Learning Python is one of those things where one can begin quite easily and quickly, but there is some depth to the language that one will want to understand and use once one gets past the most elementary early uses.&nbsp;
</div>
<div>
<br>
</div>
<div>
<div>
If you are learning from tutorials, you might want to follow along in a REPL. You can try running Python locally (see <a href="https://en.wikipedia.org/wiki/IPython">ipython</a> and/or&nbsp;<a href="https://bpython-interpreter.org/">bpython</a>), as a <a href="https://jupyter.org/">Jupyter</a> notebook, or in&nbsp;<a href="https://replit.com/">Repl.it</a>&nbsp;if you want to keep your local machine Python-free for the time being).
</div>
<div>
<br>
</div>
</div>
<div style="text-align: left;">
You will probably want to install an IDE, though. There are many<a href="https://www.simplilearn.com/tutorials/python-tutorial/python-ide">&nbsp;<span>Python IDEs and Editors</span></a>&nbsp;in the world, but&nbsp;<a href="https://www.jetbrains.com/pycharm/">PyCharm</a> is the king of them all. Nothing else even comes close.
</div>
<div>
<br>
</div>
<div>
So, here are some great places to start:
</div>
<div>
<ul style="text-align: left;">
<li>
<a href="https://learnxinyminutes.com/docs/python/">Learn X In Y Minutes</a>&nbsp;is great for <b>experienced</b> developers who are unfamiliar with the syntax and idioms of Python. It’s all learn-by-example and is highly recommended for programmers who are exploring Python for the first time.
</li>
<li>
For <b>less experienced</b> developers, consider the official&nbsp;<a href="https://wiki.python.org/moin/BeginnersGuide">Beginner’s Guide</a>&nbsp;or the&nbsp;<a href="https://www.w3schools.com/python/default.asp">W3 Schools</a>&nbsp;tutorial first.
</li>
<li>
Regardless of your level, you will want to bookmark the&nbsp;<a href="https://docs.python.org/3/index.html">Official Docs</a>&nbsp;which include r<b>eference material and tutorial material.</b>
</li>
<li>
You will get a lot of <b>good tips and deeper lessons</b> from&nbsp;<a href="https://www.youtube.com/@ArjanCodes">Arjan Codes</a>&nbsp;on YouTube, or the many excellent lessons at&nbsp;<a href="https://realpython.com/">Real Python</a>. This is true whether you are an expert, intermediate, or beginner. There is a lot of content to explore, so don’t try to take it all in over the course of a weekday.
</li>
<li>
A language without a great <b>standard library</b> is just a syntax. The Python&nbsp;<a href="https://pymotw.com/3/">Module of the Week</a>&nbsp;gives some of the best in-depth exposition you can find. Definitely spend time there!
</li>
<li>
The Python community has created so many<b> additional libraries </b>at <a href="https://pypi.org/">The Python Package Index</a>. Here you can search, research, and learn about the many frameworks and libraries that make Python the best choice for so many jobs in real-world applications.
</li>
<li>
Every feature you’ll use started as one of the&nbsp;<a href="https://peps.python.org/">Python Enhancement Proposals (PEPs)</a>. Python PEPs are to Python what the RFPs are for the internet and the worldwide web.&nbsp; If you need to deeply understand a feature’s purpose and intention, this is the place to go.
</li>
<li>
<a href="https://docs.python.org/3/whatsnew/index.html">What’s New In Python</a>&nbsp;is a crucial resource for experienced developers to <b>keep up with change</b>s in the language. Besides being a bullet list of new features, there’s some very good expository writing there and links to the relevant PEPs.
</li>
</ul>
</div>
<div>
<br>
</div>
<div>
That is a lot, I know, but if you choose one of these resources according to your needs at the moment, I think you will be well satisfied.&nbsp;
</div>



 ]]></description>
  <category>listicle</category>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2024-01-05-python-listicle.html</guid>
  <pubDate>Fri, 05 Jan 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Leadership.</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2023-12-20-leadership.html</link>
  <description><![CDATA[ 




<p>
&nbsp;<span style="background-color: white; color: #050505; font-family: inherit; font-size: 15px; white-space-collapse: preserve;">I have this very simple/simplistic view on leadership.</span>
</p>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
People will become a follower if:
</div>
<div dir="auto" style="font-family: inherit;">
<ol type="a">
<li>They believe the person is competent
</li></ol></div>
<div dir="auto" style="font-family: inherit;">
<ol start="2" type="a">
<li>They will personally benefit from that person’s competence
</li></ol></div>
</div>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
<span style="font-family: inherit;"><a style="color: #385898; cursor: pointer; font-family: inherit;" tabindex="-1"></a></span>Whether it’s a minister, a businessperson, a writer, a local organizer, or a criminal doesn’t matter all that much.
</div>
<div dir="auto" style="font-family: inherit;">
<br>
</div>
<div dir="auto" style="font-family: inherit;">
We like to impart character and integrity to our leaders, and we like to pretend that we chose them because of their superior traits, but it<span style="font-family: inherit;"> doesn’t matter as much as we would like to pretend. If those were really the criteria, we would never fall for con men and tricksters. </span>
</div>
</div>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
Remember. that people followed some pretty unsavory characters in the past and many do now.
</div>
<div dir="auto" style="font-family: inherit;">
<br>
</div>
<div dir="auto" style="font-family: inherit;">
I had to chew on this for years, because people can be radical followers of some pretty awful characters. Why would they be so blind to the character of their heroes?
</div>
<div dir="auto" style="font-family: inherit;">
<br>
</div>
<div dir="auto" style="font-family: inherit;">
It seems consistent now if one focuses on two factors.
</div>
</div>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
The perceptions don’t even have to be correct. Sometimes confidence masquerades as competence. In politics, business, religion, or social life the bombastic and dynamic personality is often chosen over the quietly competent because <i>confidence looks like competence</i> to the outsider.
</div>
<div dir="auto" style="font-family: inherit;">
<br>
</div>
<div dir="auto" style="font-family: inherit;">
Some people speak with such conviction that others are tricked into believing they know what they’re talking about.
</div>
</div>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
It always comes down to people “backing the winner” - the good/bad guy who is “on our side” and who is aligned with our interests. They’re “going to win” so we want to be on their side, and benefit from that support.
</div>
</div>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
Their competence will benefit us, so they’re the “good guy.”
</div>
</div>
<div class="x11i5rnm xat24cr x1mh8g0r x1vvkbs xtlvy1s x126k92a" style="background-color: white; color: #050505; font-family: system-ui, -apple-system, &quot;system-ui&quot;, &quot;.SFNSText-Regular&quot;, sans-serif; font-size: 15px; margin: 0.5em 0px 0px; overflow-wrap: break-word; white-space-collapse: preserve;">
<div dir="auto" style="font-family: inherit;">
That draws followers.
</div>
<div dir="auto" style="font-family: inherit;">

</div>
<div dir="auto" style="font-family: inherit;">
It defines leaders.
</div>
</div>

 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2023-12-20-leadership.html</guid>
  <pubDate>Wed, 20 Dec 2023 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Choose your Expression: Structural Matching, IF-ELSE, and Dictionaries</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2023-11-22-choose-your-expression-structural.html</link>
  <description><![CDATA[ 




<p>
&nbsp;So, I have a command line utility that collects and presents some time-series data.<br><br>What it is isn’t important, but dates are involved.
</p>
<p>
You can specify start dates and/or end dates with options <span style="font-family: courier;">–after</span> and <span style="font-family: courier;">–until</span>.&nbsp; If you specify neither, you get everything.
</p>
<p>
This programming idea is not so interesting on its own, and I have multiple expressions that all work just fine. It’s not a programming puzzle I am here to present.
</p>
<p>
Instead, I’m curious about which version speaks to you, which teaches you, which repulses you.&nbsp;<br>
</p>
<p>
More than that, I’m interested in WHY.&nbsp;
</p>
<p>
Here is an if-the-else version:<br><br>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiBbDAYRaE5v7AAjvyle1-35i6UQbYPOqprLqFdj41jBkPCEZVuhJ1d3pSXAgZJhlZqLJ9zDuaGNYv2nDwLDyz0BBawsIca_k_lt2YBA72Ht_wGKVyiCkwdC0gNDXglmldkKBxX_gPwVc3xXf5RS0mQU0OpmuFqTOi2TyITWH80QawduyV_1YNpc-vX0NY" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="378" data-original-width="1592" height="169" src="https://blogger.googleusercontent.com/img/a/AVvXsEiBbDAYRaE5v7AAjvyle1-35i6UQbYPOqprLqFdj41jBkPCEZVuhJ1d3pSXAgZJhlZqLJ9zDuaGNYv2nDwLDyz0BBawsIca_k_lt2YBA72Ht_wGKVyiCkwdC0gNDXglmldkKBxX_gPwVc3xXf5RS0mQU0OpmuFqTOi2TyITWH80QawduyV_1YNpc-vX0NY=w623-h169" width="623"></a>
</div>
<p>
</p>
<p>
<br>
</p>
<p>
Here is a similar version using a dictionary:
</p>
<p>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgFjp_0m4eH-GlbHD4dBtmUCOqoLd8D8RlhGORPqvVwRNCwPqXb8SIzr7bcR7oQC2WV-s6FxkTgF9UzyTp-6LFL1pqYUwyc3Su4hVe2BW7MMP8TZtH9HiTPHUYYmvB2qQCtqA7Azo9ARyk8Tzzx5RetJuOuSwil77hZHAiblJDuw8XJpAj-K3Bpg3bBldQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="436" data-original-width="1502" height="213" src="https://blogger.googleusercontent.com/img/a/AVvXsEgFjp_0m4eH-GlbHD4dBtmUCOqoLd8D8RlhGORPqvVwRNCwPqXb8SIzr7bcR7oQC2WV-s6FxkTgF9UzyTp-6LFL1pqYUwyc3Su4hVe2BW7MMP8TZtH9HiTPHUYYmvB2qQCtqA7Azo9ARyk8Tzzx5RetJuOuSwil77hZHAiblJDuw8XJpAj-K3Bpg3bBldQ=w734-h213" width="734"></a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br>
</div>
And one that uses structural matching:
<p>
</p>
<p>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiOonfDqA0vmxNpJbKW1VYeIB26ZFfqM9rzGciMkAL04k7zU1nS9480WLzD77X593uUruEix_TFCh0Oc0ys9e67rUUeWVuGfL3duU7An3qtyuam7thqo4aMwNZJlZ2_h6N-XIDnhK7FY1SPfM_qhClX4Hf_xi4eXn1zVcN2gl-laK21mC5nH4db4_ykUCY" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="492" data-original-width="1428" height="232" src="https://blogger.googleusercontent.com/img/a/AVvXsEiOonfDqA0vmxNpJbKW1VYeIB26ZFfqM9rzGciMkAL04k7zU1nS9480WLzD77X593uUruEix_TFCh0Oc0ys9e67rUUeWVuGfL3duU7An3qtyuam7thqo4aMwNZJlZ2_h6N-XIDnhK7FY1SPfM_qhClX4Hf_xi4eXn1zVcN2gl-laK21mC5nH4db4_ykUCY=w674-h232" width="674"></a>
</div>
<br><br>
<p>
</p>
<p>
Some people will naturally prefer if/else for the simple reason of familiarity. They see a lot of if/then/else logic, and so there isn’t much to learn or think about. They may call it “simpler’ but it is not.&nbsp;
</p>
<p>
The dictionary version has more parts, but they’re very simple parts, and all the actual work is done in the first and last sentence.&nbsp;
</p>
<p>
The structural matching is using newer syntax, and is both less verbose than the if/else and more verbose than the dictionary version.
</p>
<p>
Which strikes you as the most valuable expression of the idea?&nbsp;
</p>
<p>
Which would you rather write?
</p>
<p>
Which would you rather edit?
</p>
<p>
Which would you rather test?&nbsp;
</p>
<p>
What is your reasoning behind the appeal of your chosen method (pun intended).
</p>
<p>
<br>
</p>
<p>
<br><br>
</p>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2023-11-22-choose-your-expression-structural.html</guid>
  <pubDate>Wed, 22 Nov 2023 00:00:00 GMT</pubDate>
</item>
<item>
  <title>CSS Specificity Rundown</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2023-08-30-css-specificity-rundown.html</link>
  <description><![CDATA[ 




<p>
&nbsp;CSS really is fun.&nbsp;<br><br>No, seriously. I’m not being sarcastic here.&nbsp;
</p>
<p>
Even though I’ve been in software a long, long, long time, I hadn’t really studied CSS before last year (shocking, I know) and so I’ve been behind in my training.&nbsp;
</p>
<p>
I had an opportunity to dive in more, and all was going well until I started playing with media queries and ran into a specificity problem that wasn’t so obvious (to me, though it may have been to you).
</p>
<p>
So, to help people who are treading the same path, here are some aids on specificity:
</p>
<p>
<br>
</p>
<p>
</p><ul>
<li><a href="https://www.w3schools.com/css/css_specificity.asp">W3 Schools</a> has a fun “try it and learn” approach to general CSS Specificity
<p></p>
<p>
</p><ul>
<li>Saucelabs specifically breaks down <a href="https://saucelabs.com/resources/blog/css-breakpoints-media-query-breakpoints-responsive-design">specificity and media queries</a>
<p></p>
<p>
</p><ul>
<li>Halodoc provides some <a href="https://blogs.halodoc.io/best-practices-that-we-follow-to-avoid-specificity-issues/">best practices</a>&nbsp;to avoid troubles.
<p></p>
<p>
</p><ul>
<li>Specificity with Darth Vader and Stormtroopers and stuff at <a href="https://www.smashingmagazine.com/2007/07/css-specificity-things-you-should-know/">smashing magazine.</a>
<p></p>
<p>
<br>
</p>
<p>
These should get you past the worst of your troubles nicely. If you do get stuck, then it’s always nice to experiment with a local HTML/CSS document or maybe fire up a <a href="http://REPL.IT">REPL.IT</a> instance for HTML, CSS, and JS. It’s all fun.
</p>
<p>
PS: Because we need it so often, here is a <a href="https://www.456bereastreet.com/archive/200509/css_21_selectors_part_1/">CSS Selector Cheat Sheet.</a>
</p></li>
</ul></li>
</ul></li>
</ul></li>
</ul>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2023-08-30-css-specificity-rundown.html</guid>
  <pubDate>Tue, 29 Aug 2023 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Code Smells Listicle</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2022-04-06-code-smells-listicle.html</link>
  <description><![CDATA[ 




<p>
&nbsp;After many times looking up various resources on code smells and code smell taxonomies, I finally decided to make a listicle (list article) of these.&nbsp;
</p>
<p>
Enjoy:<br><br>
</p>
<ul style="text-align: left;">
<li>
Industrial Logic’s <a href="https://elearning.industriallogic.com/gh/submit?Action=AlbumContentsAction&amp;album=recognizingSmells&amp;devLanguage=Java">Code Smells</a> album is carefully curated and deftly explained. A winner.
</li>
<li>
Industrial Logic also has a <a href="https://www.industriallogic.com/blog/smells-to-refactorings-cheatsheet/">cheat sheet</a> for code smells (recommended)
</li>
<li>
The <a href="https://wiki.c2.com/?CodeSmell">OG</a>
</li>
<li>
Wikipedia’s <a href="https://en.wikipedia.org/wiki/Code_smell">extensive listing</a>
</li>
<li>
A nice taxonomy at <a href="https://blog.codinghorror.com/code-smells/">Coding Horror</a>
</li>
<li>
A nice writeup at <a href="https://refactoring.guru/refactoring/smells">Refactoring Guru</a>
</li>
<li>
The <a href="https://sammancoaching.org/reference/code_smells/index.html">Samman Coaching List </a>has nice descriptions.
</li>
<li>
There is a longish<a href="https://deviq.com/antipatterns/code-smells"> list without explanations</a> at DevIQ, as a jumping off point for many interesting web searches.
</li>
<li>
<a href="https://www.youtube.com/@ArjanCodes">Arjan Codes</a> (a nice channel, recommended) has a video introduction to <a href="https://www.youtube.com/watch?v=LrtnLEkOwFE">Python Code Smells.</a>
</li>
</ul>
<div>
On the “positive” side of the ledger, we also have virtues:
</div>
<div>
<ul style="text-align: left;">
<li>
The original<a href="https://medium.com/pragmatic-programmers/how-virtuous-is-your-code-c3d1a587babf"> Code Virtues</a> article from Pragmatic Programmers, republished at Medium.
</li>
<li>
The <a href="https://www.industriallogic.com/blog/code-virtues-explained/">explainer article</a> (feel free to start here) at Industrial Logic.
</li>
</ul>
</div>
<p>
</p>



 ]]></description>
  <category>listicle</category>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2022-04-06-code-smells-listicle.html</guid>
  <pubDate>Tue, 05 Apr 2022 23:00:00 GMT</pubDate>
</item>
<item>
  <title>What does Tim have against “private” methods?</title>
  <link>https://tottinge.github.io/agile-otter-blog/posts/2022-03-14-what-does-tim-have-against-private.html</link>
  <description><![CDATA[ 




<p>
&nbsp;A big thread erupted, all full of misunderstandings and miscommunications, about the idea of “private” methods.&nbsp;
</p>
<p>
It all started quite innocently (I maintain) when someone asked how we felt about testing private methods. Some people jumped in with “Absolutely Not! Never! That’s wrong! Test via public interfaces.”<br><br>I thought a little longer, and said “I’m not sure” and then later “I’m not sure that ‘private’ is even needed.”
</p>
<p>
This is where the problems started, and maybe here I can clarify what I meant by it all.&nbsp;
</p>
<p>
People assume (and insist) that I could only possibly mean that they should substitute ‘public’ for all protected and private members, polluting the interface, and inviting the violation of a class’ internal state.&nbsp;
</p>
<p>
That was never my intention and still isn’t. Still, this is what people insist that I must have meant from the start. I suppose this is because that’s what they imagined me to mean and it’s hard to admit that you’re wrong, or perhaps because this is social media so people never miss an opportunity to double-down and pile on if at all possible. It’s like a sport.&nbsp;<br><br>It’s also entirely possible that I didn’t communicate well at all in short tweets. Maybe that’s all on me. I can’t say.
</p>
<p>
Well, you’ve come this far, so let’s see if I can’t communicate better in blog than in twitter, since I can write in peace without people accusing me of meaning the wrong thing while I try to explain what I actually mean.<br><br>If I’ve managed to make sense with this post, let me know.&nbsp;
</p>
<p>
If I’ve not, the forum is open for clarifying questions below.
</p>
<h2 style="text-align: left;" class="anchored">
Autocomplete is a big deal.
</h2>
<p>
The good thing about ‘private’ and ‘protected’ – the thing that actually makes programming easier/better, is that the<b><i> methods aren’t offered by auto-complete</i></b>. The idea of locking people out of calling the method? Not even remotely a second-degree concern.
</p>
<p>
People program by autocomplete. You type the name of a thing, press the dot, and you get a list of things you can do. You may never look at the documentation, or read the example code, but you will see the autocomplete hundreds of times a day.
</p>
<p>
When you want to disable an account, there is likely to be a ‘disable’ method attached to an account. You choose that method, run the tests, ship it. That’s how you normally will navigate.<br>
</p>
<p>
When you don’t see a method you want, you might pop up a level and use the module or some management API interface. Again, you type the name and a dot, and you look for ‘disable’ in the recommended names.&nbsp;
</p>
<p>
Private and Protected are two of the ways to keep functions out of that list, and if they’re not in the list, you’re not likely to even consider calling them.
</p>
<h2 style="text-align: left;" class="anchored">
Arbitrarily Located Functions
</h2>
<div>
A developer is implementing a class and realizes that they need to compare date ranges. They write that up, drop it into a private method, and all is well.
</div>
<div>
<br>
</div>
<div>
Or is it?&nbsp;<br><br>
</div>
<div>
Why is <i>that </i>method located in <i>this</i>&nbsp;class? Does it have high cohesion? No.&nbsp;Does it support the purpose of this class directly? No.&nbsp;<br>
</div>
<div>
<br>
</div>
<div>
Why then? Because this class calls the function, and this is the file I was editing when I wrote the function.
</div>
<div>
<br>
</div>
<div>
In other words, the function doesn’t belong here according to any rule of design, but it wasn’t found anywhere else either. The developer drops it into the class with ‘private’ and moves on.
</div>
<div>
<br>
</div>
<div>
What I’ve found is that often the private methods in one class are repeatedly reinvented in private methods of other classes. Sometimes they’re even copied and pasted directly from one class to another.
</div>
<div>
<br>
</div>
<div>
Why? Because this is the class they had open in the editor when they realized they needed the function, and it’s not available for calling because it’s private in the other class.&nbsp; So they copied it.
</div>
<div>
<br>
</div>
<div>
Arbitrarily located functions, hidden from view, repeated by invention and copying, likely hiding the opportunity for Single Point Of Truth (SPOT) abstractions and libraries that would make everyone’s job a little easier.<br><br>This isn’t a rare occurrence.&nbsp;<br><br>By being hidden and arbitrarily located, they invite duplication and reinvention.&nbsp;
</div>
<div>
<br>
</div>
<h2 style="text-align: left;" class="anchored">
Testability of Private Methods? None
</h2>
<p>
When we talk about testing private methods, it’s a non-starter. If you put the word ‘private’ on the front of a method in most languages, you cannot call that method from a test. That means you can’t possibly test private methods.
</p>
<p>
Okay, there is a way, but it involves reflection and that’s an obscenity. If you ever use reflection to crack into some legacy code and test hidden methods, make sure you remove that hack as soon as humanly possible (or sooner) because it’s a travesty. It’s awful. It will fail you if the method is renamed or moved. Reflection is generally a bad idea, and I wouldn’t do that (much, or for long).
</p>
<p>
If you are doing TDD (and why wouldn’t you?) you test the public methods, and if they’re using private methods then the private methods are being exercised. If you have meaningful tests and assertions, then the private methods are being tested through the public interface and that’s probably okay.
</p>
<p>
If you’re not doing TDD (and why not?) then you may not have code that tests all the private behaviors. You may have to read all the code in order to exercise it properly, which is a pain.
</p>
<p>
If you’re doing test-after development (but why?) you’ve written the code and now you have to write tests around it. Every private method is a called from some public method and you’re going to have to figure out how to get down into that private method code and recognize if it’s working correctly or not.
</p>
<p>
By being private, those methods have cut off the easiest route to testability – calling the method directly.
</p>
<p>
<br>
</p>
<h2 style="text-align: left;" class="anchored">
Should You Test Implementation?
</h2>
<p>
You should: implementation is how code behaves and you have to test behavior.
</p>
<p>
There are caveats here:
</p>
<p>
</p>
<ul style="text-align: left;">
<li>
If you’re structure-aware in your tests, they’ll resist structural refactoring
</li>
<li>
If you’re time-sequence-aware in your tests, they’ll resist time-order refactoring
</li>
<li>
If you’re using reflection, you’re poisoning our future and must be stopped (half-grin)
</li>
</ul>
<p style="text-align: left;">
There are rules, of course. You don’t lock down things that you want to change, and you don’t leave unspoken the things that must be true. Your tests specify how your world behaves at a certain level.
</p>
<p style="text-align: left;">
Sometimes that’s too high a level and there are mini-behaviors you need to check too.
</p>
<p style="text-align: left;">
I’ve seen cases where testing only at the interface required hundreds of tests, but testing at the internal level requires barely a dozen. This is because at the higher level, you need all the combinations of all the paths of all the subordinate functions. At lower levels, you need one for each path in a function.
</p>
<p style="text-align: left;">
High-level end-to-end and integration tests take a long time to run, and microtests are cheap and fast.
</p>
<p style="text-align: left;">
We tend to do microtesting (or unit testing) so that we can afford to run the tests in a tight TDD cycle.&nbsp;
</p>
<p style="text-align: left;">
To argue against testing implementation functions is to argue against unit testing and microtesting on principle.
</p>
<p style="text-align: left;">
If you should only use the most-public interface, then shouldn’t you only test at the UI level? Yeah, this is not a good idea.&nbsp;
</p>
<p style="text-align: left;">
So how can we get at the lower-level functions? If they’re all private, we can’t but it is totally possible if they are public methods on lower-level classes that are composed (“encapsulated”) by the API classes.&nbsp;
</p>
<p style="text-align: left;">
<br>
</p>
<h2 style="text-align: left;" class="anchored">
Interfaces and Implementations
</h2>
<p style="text-align: left;">
In many languages, you can declare a public interface, and that interface can be implemented by other classes.
</p>
<p style="text-align: left;">
It’s accepted that one should always program to the interface in those languages. This way, one can only use the declared, public interface of the implementations. This keeps the implementations substitutable (via Liskov Substitution Principle).&nbsp;
</p>
<p style="text-align: left;">
Non-interface methods of the implementers are <i>already hidden</i>: callers have no access to them via the interface.&nbsp;
</p>
<p style="text-align: left;">
If you’re using the interface, and you press the dot, then only methods in the public interface are presented. The other methods of the implementer may as well not exist, because they are not available here.
</p>
<p style="text-align: left;">
If you have segregated interfaces, this is even nicer. It may be that two or three public interfaces are the right way to think and design interactions, but combining a few of those interfaces together is the better way to implement the behaviors. No user of one interface has any awareness that the other interfaces exist on the object, nor of the public methods of the other interfaces, nor any of the public methods of the implementers.
</p>
<p style="text-align: left;">
In order to reach the public methods of the implementer, a caller would have to <i><b>down-cast</b></i> from the interface to the implementation (a no-no that justifies a sharp crack across the knuckles with a yardstick) in order to even know that other methods exist.&nbsp;
</p>
<p style="text-align: left;">
This is convenient. This means that all methods of the implementers can be public without exposing those methods to callers.&nbsp; Since they’re public, you can write tests directly against them. Because the implementation is being tested also through the interface, it’s easy to ensure that it behaves as a whole implementation.
</p>
<p style="text-align: left;">
Why not make them private? Because it’s redundant and limits testing.&nbsp;
</p>
<p style="text-align: left;">
Without polluting the public interface, one has a fully open and testable class.
</p>
<p style="text-align: left;">
<br>
</p>
<h2 style="text-align: left;" class="anchored">
Thinking a little more deeply
</h2>
<div>
Private methods, when we choose to use them, may signal a need for us to think more deeply about our situation and strategies.
</div>
<p>
</p>
<ol style="text-align: left;">
<li>
<b>In a Rat’s Nest:</b><br>sometimes people are doing test-last (after coding) and they have a complex method. You shouldn’t have big, complex methods if you have any other choice. To try to manage the complexity, they may extract some private methods.<br>In order to test through the API, you have to navigate the rat’s nest. You will have to set up deep data structures and some combination of boolean conditions that will allow you to get to the private method’s function call, and then to exercise the code inside that method.<br>It’s easier to make the method’s access less restricted and test it directly than to have dozens of long and complicated tests. Perhaps package-public, perhaps protected so you can cheat with inherit-to-expose.&nbsp;<br>It’s better to test the code easily than to write awful, fragile, internals-aware tests.
</li>
<li>
<b>Missed Abstractions</b><br>Where one class has a bunch of private methods, often there is some cohesion between those methods. If one were to set the private methods side-by-side, one might recognize that there have been missed abstractions.<br>Maybe some of the methods are generic string, date, or math functions. These could be public methods in a utility package or more-primitive type. If you move them to the “right” place, they can be fully testable and can be reused within the codebase. They would not be public methods of the class you’re working on.<br>Perhaps some of those represent a lower-level concept that is munged into the current class. If they were pulled out, they could become testable, public methods on the new class. They would still not appear in the public interface of the class you’re working on.<br>
</li>
<li>
<b>In Languages without Private</b><br>In Python, smalltalk, and similar languages there’s no ‘private’ and we’ve been okay with that for a long time (since the 70s for Smalltalk).&nbsp;<br>While people say that encapsulation is a core feature of OOD (and it is) it isn’t the “private” keyword that causes encapsulation. It’s done via composition.<br>In a Python module, you can choose what classes you expose and which you don’t. You have a class with a public API, which is composed of classes/functions that aren’t part of the public API. They’re tested directly within the module and don’t have a “private” keyword associated with them. They might not have underscore-decorated names or any other semblance of access protections.&nbsp;<br>
</li>
<li>
<b>Other APIs</b><br>In any language, the Model class or the API class may have a simple interface into the module (as described above) but the module may have a lot of complicated functions and logic divided into multiple classes and functions.&nbsp;<br>The model class doesn’t have any ‘private’ methods at all - it just calls the public methods of other classes in the module. Those classes have copious tests and may not have any methods declared Private or Protected, because only the API and tests call those methods - they’re not visible to the outside world (protection from <a href="https://www.hyrumslaw.com/">Hyrum’s Law</a>)<br>
</li>
</ol>
<h2 style="text-align: left;" class="anchored">
So What Do You Do Instead
</h2>
<div>
<ul style="text-align: left;">
<li>
<b>Don’t pollute the public interface of a class with private methods.</b> If you simply flip the <b>private</b> methods to be <b>public</b>, you’ll lose understandability of the interface and create unwanted dependencies. This is what I recommend <b>not</b>&nbsp;doing. Keep interfaces clear and clean.
</li>
<li>
<b>Move your methods </b>to the places where they belong (where they have cohesion) and can be easily found by others.
</li>
<li>
<b>Try not to need private methods</b>. They should be rare. Remember, many OO languages don’t even have the concept of <i>private</i>&nbsp;and they’re just fine without them.
</li>
<li>
in some legacy code test-after situations, <b>you might raise accessibility of a method to public</b>, protected, or module-private in order to support refactoring via better tests (in the short term)
</li>
<li>
Consider<b> using encapsulation properly</b>: by composing behaviors under an API, rather than by housing all behaviors in the API’s class.
</li>
<li>
In some languages, you have ‘interface’ or ‘protocol’ classes that <b>declare an interface to use</b>. Do that when there is a clear public interface.&nbsp;
</li>
</ul>
<div>
And, of course, I would be remiss if I didn’t admit that I do sometimes create private methods. I try not to, and when I find a better way than settling on private, I am usually happier.&nbsp; I sometimes leave a little cruft like private methods until I have more information and can see a better design form; it may take weeks or months.&nbsp;<br><br>So yeah, there are private methods in my code. I just don’t see that as “good coding” and a “solution.” It’s temporary.
</div>
</div>
<p>
</p>



 ]]></description>
  <guid>https://tottinge.github.io/agile-otter-blog/posts/2022-03-14-what-does-tim-have-against-private.html</guid>
  <pubDate>Mon, 14 Mar 2022 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
