tag:blogger.com,1999:blog-68898840537985004132024-02-07T15:37:56.029-08:00The way things work in Llewellyn's worldLlewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.comBlogger65125tag:blogger.com,1999:blog-6889884053798500413.post-53541241547019258042022-09-21T09:37:00.004-07:002022-09-21T09:37:19.222-07:00Python Context Manager<h1><br /></h1>
<p>By Llewellyn Falco & <a href="https://twitter.com/mplavcan">Matt Plavcan</a></p>
<p>I've been doing a lot python lately and context Manager has thrown me for a bit of a loop. Here's what happened</p>
<h2>Context</h2>
<p>First, A ContextManager is what python uses for the <code>with</code> statement. It is the python equivalent of:</p>
<ul>
<li>java's <code>try with resources</code></li>
<li>c#'s <code>using</code></li>
</ul>
<p>It allows you to do the following:</p>
<pre><code class="language-python" lang="python">@contextmanager
def printer():
print("enter")
yield
print("exit")
if __name__ == '__main__':
with printer():
print("middle")
</code></pre>
<p>Which prints</p>
<pre><code class="language-text" lang="text">enter
middle
exit
</code></pre>
<h1>Problem 1) Yield fails with exceptions</h1>
<p>Let's say we have</p>
<pre><code class="language-python" lang="python">@contextmanager
def printer():
print("enter")
yield
print("exit")
if __name__ == '__main__':
with printer():
raise Exception("middle")
</code></pre>
<p>I would expect it to close the context and then pass on the Exception. Like such:</p>
<pre><code class="language-text" lang="text">enter
Exception: middle
exit
</code></pre>
<p>But it doesn't. Instead, I get:</p>
<pre><code class="language-text" lang="text">enter
Exception: middle
</code></pre>
<p>There is no <code>exit</code> printed.</p>
<h1>Solution 1) Use ContextManager class</h1>
<p>I need to expand the Printer to a full class. ContextManager is just an interface that assumes you have the <code>__enter__</code> and <code>__exit__</code> methods defined on a class.</p>
<p>For example:</p>
<pre><code class="language-python" lang="python">class Printer():
def __enter__(self):
print("enter")
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
if __name__ == '__main__':
with Printer():
print("Middle")
raise Exception("from middle")
</code></pre>
<p>Now I get the expected behavoir: </p>
<pre><code class="language-text" lang="text">enter
Middle
exit
</code></pre>
<h1>Problem 2) ContextManager is None?</h1>
<p>But what if I want to reference the ContextManager?
Python allows you to assign the object to a variable with the <code>as variable_name</code> syntax.</p>
<p>Let's try to print the ContextManager reference:</p>
<pre><code class="language-python" lang="python"> class Printer():
def __enter__(self):
print("enter")
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
def __str__(self):
return "<Printer>"
if __name__ == '__main__':
with Printer() as p:
print(f"p = {p}")
</code></pre>
<p>Surprisingly this produces:</p>
<pre><code class="language-text" lang="text">enter
p = None
exit
</code></pre>
<p>What is going on? The <code>__enter__</code> and <code>__exit__</code> work, but the value is somehow <code>None</code>? How can both be true?</p>
<h1>Solution 2) How assignment from ContextManager works.</h1>
<p>You would think that:</p>
<pre><code class="language-python" lang="python">with Printer() as p
</code></pre>
<p>is the same as </p>
<pre><code class="language-python" lang="python">p = Printer()
with p:
</code></pre>
<p>but it's not. It's actually</p>
<pre><code class="language-python" lang="python">_p = Printer()
p = p.__enter__()
</code></pre>
<p>Here's the solution</p>
<pre><code class="language-python" lang="python">class Printer():
def __enter__(self):
print("enter")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
def __str__(self):
return "<Printer>"
if __name__ == '__main__':
with Printer() as p:
print(f"p = {p}")
</code></pre>
<p>This produces the expected:</p>
<pre><code class="language-text" lang="text">enter
p = <Printer>
exit
</code></pre>
<p>What's different? The <code>__enter__</code> now returns self. Before it had no return, so there was an implicit <code>return None</code> that all python methods have as a minimum.</p>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-10004088684568438802022-08-17T17:17:00.002-07:002022-08-18T09:35:58.668-07:00Practice vs. Competition<h1 dir="auto" style="border-bottom: 1px solid var(--color-border-muted); box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; line-height: 1.25; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px !important; margin: 0px 0px 16px; padding-bottom: 0.3em;"><b style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.524px;">By<a href="https://www.blogger.com/#" style="color: #cc3300; text-decoration-line: none;"> Llewellyn Falco</a> & <a href="https://twitter.com/jmasonlee" style="color: #cc3300; text-decoration-line: none;">Jacqueline Bilston</a></b></h1><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">In any sport, you have practice and you have competitions. Practice helps you to improve, but what about competition? Is it just about ranking yourself against others? Or is it also a mechanism to improve?</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">We've done a lot of coderetreats, which are mainly about practice, but this February (2022), we did something different. We participated in a <a href="https://leanpoker.org/" rel="nofollow" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;">Lean Poker</a> event, which is much more of a competition.</p><blockquote style="border-left: 0.25em solid var(--color-border-default); box-sizing: border-box; color: var(--color-fg-muted); font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin: 0px 0px 16px; padding: 0px 1em;"><p dir="auto" style="box-sizing: border-box; margin-bottom: 0px; margin-top: 0px;">Everybody has a plan until they get punched in the mouth<br style="box-sizing: border-box;" />--Mike Tyson</p></blockquote><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">It turns out you <em style="box-sizing: border-box;">can</em> learn something from competition, but most of that learning doesn't come when you win, it comes after you lose and you reflect on what went wrong.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">So what was the result? We got punched in the face <em style="box-sizing: border-box;">(metaphorically)</em>...</p><h2 style="text-align: left;">Competition Format</h2><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;"><a href="https://leanpoker.org/" rel="nofollow" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;">Lean Poker</a> is a <i>battle royale</i> of poker bots. A new battle to the death commences every 30 seconds. The bots play poker until only 1 remains. The winning team gets 5 points added to their score on a global score board that determines the overall winner for the week. (The 2nd place player also gets 3 points).</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Every team starts with a fully functioning bot in the language of their choice, but the only thing this bot does is fold.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;"><span style="box-sizing: border-box; font-weight: 600;">Note:</span> <a href="https://leanpoker.org/" rel="nofollow" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;">Lean Poker</a> normally runs in a single day, but we decided to do it in one hour a day sessions over a 5 day week, to accommodate a remote global audience.</p><h2 style="text-align: left;">The Players</h2><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">We had 6 teams comprised of a total of 22 players. All of them were specially invited, and the teams were balanced according to competencies, <em style="box-sizing: border-box;">but the only two teams that matter are ours, so that's what we are going to tell you about</em> :-)</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Both of our teams chose a language where at least one team member was an expert (Ruby for one and Java for the other). Both of our teams chose to mob. Both of our teams followed most XP practices, including TDD.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">... things started out the same ...</p><h2 style="text-align: left;">Session 1</h2><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Moments after the competition started, we felt the pressure. All of our bots were folding and losing. Most teams released their first change within 5 minutes.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">After we had a bot that didn't just fold, we started to make it smarter. This involved crafting code and objects to represent our hands and help us decide on how much to bet. The bots were very basic, either betting on a good hand or folding on a bad hand.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">The logic defining a good or bad hand was also rather basic. At this point our logic was pretty close, but that's where things started to diverge.</p><h2 style="text-align: left;">The Middle</h2><h3 style="text-align: left;">Llewellyn's team</h3><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">We decided that we needed better logic to figure out better hands. We could easily detect a pair, and 3 of a kind and 4 of a kind includes a pair so we got that for free. We thought we could differentiate ourselves by being able to detect a straight.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">If you have only 5 cards ordered from low to high, a straight is easy to detect. [5, 6, 7, 8, 9] is a straight because each one is one more than the other. it's slightly harder with 7 cards [2, 5, 6, 6, 7, 8, 9], but we figured it out - eventually.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">However, even though we were deploying consistently, we weren't doing better in the battles.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Then we realized that none of the games were even getting to the point of having 5 cards in play. Other bots were going all in on the initial two cards, so it was impossible to raise after the 1st round.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;"><span style="box-sizing: border-box; font-weight: 600;">Everything</span> we had written was waste.</p><h3 style="text-align: left;">Jacqueline's team</h3><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">With a poker expert on our team, we realized the most important cards to assess were the initial 2 cards (the pocket cards). Our strategy focused on refining our bet based on these 2 cards, but we were still losing... Why?</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Our algorithm seemed solid, but when we finally looked at the playbacks, we realized we were consistently being overbet. We would have a good hand and bet 80%, only to have another team bet 100%, and then we would fold.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">This forced us to change our strategy to all-in or fold based on those first two cards.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">When we did this, we started to improve.</p><h2 style="text-align: left;">The End</h2><h3 style="text-align: left;">Llewellyn's team</h3><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">We now had a bunch of code, but we weren't getting the results we wanted, and we realized we needed a better understanding of what was happening in the battles. It was late to start adding logging to our system, but it was better late than never. Sometimes our logs didn't seem to match what our code should have done, so we also started labeling each version so we could better match the production to the code.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">This telemetry should have been one of the first things we did, but the other teams were already winning, and we didn't want to be left behind. Our early shortcuts ended up hurting us.</p><h3 style="text-align: left;">Jacqueline's team</h3><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Even in the short amount of time available we were able to write some fairly confusing code. We knew it did what we wanted, because we used TDD, but we had been skipping the refactoring step.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Everyone on the team wanted to refactor, and we didn't know why <em style="box-sizing: border-box;">everyone else</em> seemed to avoid it. Finally, we made time for a retrospective where we discovered that the pressure to release a better bot kept getting in the way. We decided to spend the last session cleaning the code.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Once we had finished refactoring, it became obvious and simple to improve the code. These improvements helped - we gained 30% on the competition, but by that point, it was too late.</p><h2 style="text-align: left;">After the Game</h2><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Neither of our teams won, but in our failures, there was a lot of learning. Some retrospectives lasted up to 6 hours after the final match. All of us agreed that we made stupid mistakes because of the pressure we were under to perform. All of us could relate to that pressure in our day-to-day jobs.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">This pressure resulted in cutting corners and preferencing short term wins which created long term problems (even just 5 hours later). It also dramatically reduced the amount of experimentation and exploration.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Worst of all, we all knew better, but we still didn't act better.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Ironically, at work, it often seems that this pressure is constructed artificially in the form of deadlines to try to drive better performance.</p><h3 style="text-align: left;">An odd observation</h3><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">One question that came up in the final retro was:</p><blockquote style="border-left: 0.25em solid var(--color-border-default); box-sizing: border-box; color: var(--color-fg-muted); font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin: 0px 0px 16px; padding: 0px 1em;"><p dir="auto" style="box-sizing: border-box; margin-bottom: 0px; margin-top: 0px;">"What if 1 team was only allowed to release every 30 minutes?"</p></blockquote><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Everyone agreed this would put that team at a major disadvantage.</p><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">It's obvious in the game that this restriction would be crippling. Yet we normalize monthly deploys in the business world, and no one seems to complain.</p><h3 style="text-align: left;">Details</h3><p dir="auto" style="box-sizing: border-box; color: #24292f; font-family: -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 0px; margin-top: 0px;">Just in case you'd like to see the <a href="https://live.leanpoker.org/tournament/621e76b469c6d30004af2f7d" rel="nofollow" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;">details of our match</a></p>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-2853984775337089632022-08-02T06:05:00.000-07:002022-08-02T06:05:05.473-07:00should_methods_be_named_like_this?<p>tl;dr: all method names that return a True/False setting should begin with the word <b><u>is</u></b></p><h2 class="code-line" data-line="2" dir="auto" id="the-problem" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-weight: normal; margin-bottom: 0.2em; margin-top: 0px; position: relative;">The Problem</h2><p class="code-line" data-line="4" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">The readability of code is <strong>very</strong> important to me. Unfortunately English is a remarkably complex language. This leads to a lot of variations on how you can ask a True/False question.</p><p class="code-line" data-line="7" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">Here are a few:</p><ul class="code-line" data-line="9" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;"><li class="code-line" data-line="9" dir="auto" style="position: relative;">am I allowed to write to files</li><li class="code-line" data-line="10" dir="auto" style="position: relative;">are files writable</li><li class="code-line" data-line="11" dir="auto" style="position: relative;">can I write to this file</li><li class="code-line" data-line="12" dir="auto" style="position: relative;">is this file writable</li><li class="code-line" data-line="13" dir="auto" style="position: relative;">should file writes be allowed</li><li class="code-line" data-line="14" dir="auto" style="position: relative;">was the file writable</li><li class="code-line" data-line="15" dir="auto" style="position: relative;">were the files writable</li><li class="code-line" data-line="16" dir="auto" style="position: relative;">will file writes be allowed</li><li class="code-line" data-line="17" dir="auto" style="position: relative;">would the file allow modification</li></ul><h2 class="code-line" data-line="19" dir="auto" id="consistency" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-weight: normal; margin-bottom: 0.2em; margin-top: 0px; position: relative;">Consistency</h2><p class="code-line" data-line="21" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">The issue with even considering which of these is the better way of expressing this question in English is Consistency.</p><blockquote class="code-line" data-line="23" dir="auto" style="border-color: var(--vscode-textBlockQuote-border); border-left-style: solid; border-left-width: 5px; font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin: 0px 7px 0px 5px; padding: 0px 16px 0px 10px; position: relative;"><p class="code-line" data-line="23" dir="auto" style="margin-bottom: 0.7em; margin-top: 0px; position: relative;">“A consistent experience is a better experience.” — Mark Eberman</p></blockquote><p class="code-line" data-line="25" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">Your API is the UX that programmers experience and a consistent UX is better, even when it's worse. Why? Because it lowers the cognitive load on a user. New things fit into your existing understanding, Things are where you expect them to be so you don't miss them and they are easy to discover. If I want to know what an object can do it is helpful to be able to ask it 3 general questions:</p><ol class="code-line" data-line="28" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;"><li class="code-line" data-line="28" dir="auto" style="position: relative;">is - What properties are True/False?</li><li class="code-line" data-line="29" dir="auto" style="position: relative;">get - What other properties can you give me?</li><li class="code-line" data-line="30" dir="auto" style="position: relative;">set - What properties can I change?</li></ol><p class="code-line" data-line="32" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">This convention has been decided decades ago. Furthermore, IDEs will often autocomplete in alphabetical order making things discoverable.</p><h2 class="code-line" data-line="34" dir="auto" id="the-answer-and-the-problem" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-weight: normal; margin-bottom: 0.2em; margin-top: 0px; position: relative;">The answer and the problem</h2><p class="code-line" data-line="36" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">This means if you have a method that answers a True/False question, the method should begin with the word <strong>is</strong>.</p><blockquote class="code-line" data-line="38" dir="auto" style="border-color: var(--vscode-textBlockQuote-border); border-left-style: solid; border-left-width: 5px; font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin: 0px 7px 0px 5px; padding: 0px 16px 0px 10px; position: relative;"><p class="code-line" data-line="38" dir="auto" style="margin-bottom: 0.7em; margin-top: 0px; position: relative;">But English can make this soooo ugly!<br />Yes<br />But...<br />... it doesn't matter :-(</p></blockquote><p class="code-line" data-line="43" dir="auto" style="font-family: -apple-system, "system-ui", "Segoe WPC", "Segoe UI", system-ui, Ubuntu, "Droid Sans", sans-serif; font-size: 14px; margin-bottom: 0.7em; margin-top: 0px; position: relative;">Yes the present singular form of the to-be verb can make for an awkard method name, but consistency is more important.</p><pre style="background-color: rgba(220, 220, 220, 0.4); border-radius: 3px; font-size: 14px; margin-top: 0px; overflow: auto; padding: 16px; white-space: pre-wrap;"><code class="code-line language-bash" data-line="44" dir="auto" style="color: var(--vscode-editor-foreground); font-family: var(--vscode-editor-font-family, "SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace); font-size: 1em; line-height: 1.357em; position: relative; tab-size: 4;">> isThisMethodNameInTheCorrectForm()
True</code></pre>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-76926527736469439442021-06-16T17:29:00.008-07:002021-06-23T07:06:21.051-07:00Hexploration<p><br /></p><div><b>By<a href="https://www.blogger.com/#" style="color: #cc3300; text-decoration-line: none;"> Llewellyn Falco</a> & <a href="https://twitter.com/jmasonlee" style="color: #cc3300; text-decoration-line: none;">Jacqueline Bilston</a></b></div><div><br /></div><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Over the past little while we've been exploring an alternative to the Game of Life with a hexagonal board. <a href="https://github.com/calgarysoftwarecrafters/coderetreatConstraints/blob/main/HexagonalBoard.md#hexagonal-board" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;">You can see the rules here</a>. This led us to some super interesting discoveries that we'd like to share.</p><h2 style="border-bottom: 1px solid var(--color-border-secondary); box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em;"><a aria-hidden="true" class="anchor" href="https://github.com/isidore/Blogs/blob/master/HexExploration.md#1-verifying-sequences" id="user-content-1-verifying-sequences" style="background-color: transparent; box-sizing: border-box; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" fill-rule="evenodd"></path></svg></a>1. Verifying Sequences</h2><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">The interesting part of the Game of Life is how it evolves over time. We wanted to write tests that could help us verify how the board changes frame to frame. You can do this by mapping time to space and creating a text file that prints out each frame one after the other, much like a comic book. Instead we decided to take advantage of the animated gif format, and play out the evolution much like a short film.</p><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Here's an example of one of those calls displaying the initial board plus 33 additional frames:</p><div class="snippet-clipboard-content position-relative" style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; position: relative;"><pre style="background-color: var(--color-bg-tertiary); border-radius: 6px; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow-wrap: normal; overflow: auto; padding: 16px;"><code style="background: transparent; border-radius: 6px; border: 0px; box-sizing: border-box; display: inline; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: visible; padding: 0px; word-break: normal;">verifySequence(board, 33, f -> board.advance())
</code></pre></div><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">which produces:</p><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;"><a href="https://github.com/isidore/HexGameOfLife/blob/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.testCompellingSequence.approved.gif?raw=true" rel="noopener noreferrer" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;" target="_blank"><img alt="" src="https://github.com/isidore/HexGameOfLife/raw/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.testCompellingSequence.approved.gif?raw=true" style="background-color: var(--color-bg-primary); border-style: none; box-sizing: content-box; max-width: 100%;" /></a></p><h2 style="border-bottom: 1px solid var(--color-border-secondary); box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; line-height: 1.25; margin-bottom: 16px; margin-top: 24px; padding-bottom: 0.3em;"><a aria-hidden="true" class="anchor" href="https://github.com/isidore/Blogs/blob/master/HexExploration.md#2-exploratory-testing-with-property-based-tests" id="user-content-2-exploratory-testing-with-property-based-tests" style="background-color: transparent; box-sizing: border-box; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" fill-rule="evenodd"></path></svg></a>2. Exploratory Testing with Property-Based tests</h2><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Once we could verify sequences, we could start hunting for initial layouts that produce interesting sequences. There are lots of documented scenarios in a traditional square board (blinkers, guns and flyers, etc.), but we couldn't find any for hexagonal space. We decided to search on our own.</p><h3 style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px;"><a aria-hidden="true" class="anchor" href="https://github.com/isidore/Blogs/blob/master/HexExploration.md#2a-generating-random-boards" id="user-content-2a-generating-random-boards" style="background-color: transparent; box-sizing: border-box; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" fill-rule="evenodd"></path></svg></a>2A. Generating Random Boards</h3><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">We took a page from property-based testing, and created a generator to randomly generate a board with a given number of live cells. We also printed out the board in a way that allowed us to capture and reproduce the ones we liked.</p><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Here's an example of a board we reproduced.</p><div class="snippet-clipboard-content position-relative" style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; position: relative;"><pre style="background-color: var(--color-bg-tertiary); border-radius: 6px; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow-wrap: normal; overflow: auto; padding: 16px;"><code style="background: transparent; border-radius: 6px; border: 0px; box-sizing: border-box; display: inline; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: visible; padding: 0px; word-break: normal;">new HexGameOfLife(_(2, 4), _(2, 6), _(1, 9), _(1, 3), _(5, 5), _(5, 1), _(3, 1))
</code></pre></div><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">This generated lots of results, and most of them were <span style="box-sizing: border-box; font-weight: 600;"><em style="box-sizing: border-box;">booooring</em></span>.</p><h3 style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px;"><a aria-hidden="true" class="anchor" href="https://github.com/isidore/Blogs/blob/master/HexExploration.md#2b-filtering-for-interesting" id="user-content-2b-filtering-for-interesting" style="background-color: transparent; box-sizing: border-box; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" fill-rule="evenodd"></path></svg></a>2B. Filtering for "Interesting"</h3><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Taking another page from property-based testing, we created a filter to remove boring results. To do this, we had to ask</p><blockquote style="border-left: 0.25em solid var(--color-markdown-blockquote-border); box-sizing: border-box; color: var(--color-text-tertiary); font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin: 0px 0px 16px; padding: 0px 1em;"><p style="box-sizing: border-box; margin-bottom: 0px; margin-top: 0px;">Q. What does interesting mean?<br style="box-sizing: border-box;" />A. We can see cells in every frame.</p></blockquote><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Fortunately, coding this was quite simple.</p><ol style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;"><li style="box-sizing: border-box;">Generate a board</li><li style="box-sizing: border-box; margin-top: 0.25em;">Advance a turn, and check that cells still exist</li><li style="box-sizing: border-box; margin-top: 0.25em;">Repeat until you get to the end of the frames</li><li style="box-sizing: border-box; margin-top: 0.25em;">If you make it to the end, return, otherwise <code style="background-color: var(--color-markdown-code-bg); border-radius: 6px; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;">GOTO 1</code></li></ol><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">With these steps, we found this board:</p><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;"><a href="https://github.com/isidore/HexGameOfLife/blob/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.testSymmetrical.approved.gif?raw=true" rel="noopener noreferrer" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;" target="_blank"><img alt="" src="https://github.com/isidore/HexGameOfLife/raw/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.testSymmetrical.approved.gif?raw=true" style="background-color: var(--color-bg-primary); border-style: none; box-sizing: content-box; max-width: 100%;" /></a></p><h3 style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 1.25em; line-height: 1.25; margin-bottom: 16px; margin-top: 24px;"><a aria-hidden="true" class="anchor" href="https://github.com/isidore/Blogs/blob/master/HexExploration.md#2c-the-blinker-search" id="user-content-2c-the-blinker-search" style="background-color: transparent; box-sizing: border-box; float: left; line-height: 1; margin-left: -20px; padding-right: 4px; text-decoration-line: none;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z" fill-rule="evenodd"></path></svg></a>2C. The Blinker Search</h3><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">In this process, we saw a simple blinker, but lost the board before we could capture it. We tried to get lucky again, but couldn't, so we decided to define what the properties of a blinker were, and then find one automatically.</p><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">Fortunately, coding this was quite simple.</p><ol style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;"><li style="box-sizing: border-box;">Generate a board</li><li style="box-sizing: border-box; margin-top: 0.25em;">Advance 12 turns, and check that the board is the same as the initial board.</li><li style="box-sizing: border-box; margin-top: 0.25em;">If it is, you have found something that repeats every 1,2,3,4,6, or 12 frames. Otherwise <code style="background-color: var(--color-markdown-code-bg); border-radius: 6px; box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; margin: 0px; padding: 0.2em 0.4em;">GOTO 1</code></li></ol><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 16px; margin-top: 0px;">In just under 300,000 randomized searches, this returned: <a href="https://github.com/isidore/HexGameOfLife/blob/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.testBlinker.approved.gif?raw=true" rel="noopener noreferrer" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;" target="_blank"><img alt="" src="https://github.com/isidore/HexGameOfLife/raw/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.testBlinker.approved.gif?raw=true" style="background-color: var(--color-bg-primary); border-style: none; box-sizing: content-box; max-width: 100%;" /></a></p><p style="box-sizing: border-box; color: #24292e; font-family: -apple-system, system-ui, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; margin-bottom: 0px; margin-top: 0px;">If you would like to check out the full code, <a href="https://github.com/isidore/HexGameOfLife/blob/master/src/test/java/org/gameoflife/hex/graphics/GameOfLifePanelTest.java#L122-L131" style="background-color: transparent; box-sizing: border-box; text-decoration-line: none;">start here</a></p>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-58967629181816560562021-05-03T16:18:00.007-07:002021-05-03T16:22:23.582-07:00 What is an Agile Technical Coach?<p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">What is an Agile Technical Coach?
<b style="font-family: Times; font-size: medium; white-space: normal;">By<a href="https://www.blogger.com/#"> Llewellyn Falco</a> & <a href="https://twitter.com/jmasonlee">Jacqueline Bilston</a></b>
</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; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></p><b>Note:</b> We originally wrote this as an internal memo. It's not meant to be a complete definition, but we thought it might be helpful to others so we are sharing it here.<div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><b><span style="font-size: medium;">TL;DR: </span></b>An agile technical coach writes code with programmers for the purpose of improving how the team programs. Common areas include:</p><ul style="text-align: left;"><li>Refactoring</li><li>Test Driven Development</li><li>DevOps</li></ul><span style="font-size: medium;"><b>Overview</b></span><p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">The focus of an agile technical coach is specifically on technical practices like refactoring, test driven development, and DevOps. This means that technical coaches are sitting with the programmers, writing code together. Their value is in the sustained behaviours the team continues using after they leave.</span></p><p><span style="font-family: Arial; font-size: 11pt; white-space: pre-wrap;">Although a coach is not a teacher (who works in practise problems), and a coach is not a consultant (whose main value is delivered while they are working with you), the roles sometimes overlap. A coach often wears the hat of a teacher in short bursts in order to enable a more productive coaching session while working with a team, and only rarely, if ever, acts as a consultant.</span></p><p><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Agile is about being able to respond to change. There are two parts that work hand-in-hand to allow this to happen in software. One side comes from the management side of </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">what and when to change</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. The other side comes from the technical side of having code that is </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">easy to change.</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Technical Agile Coaches empower Agile Coaches to be able to respond in the ways they want.</span></p></div>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-36198200035610446242021-04-08T16:37:00.010-07:002021-05-03T16:14:37.094-07:00 The 4 Benefits of Tests<span style="font-family: inherit;"><b>By<a href="https://www.blogger.com/#"> Llewellyn Falco</a> & <a href="https://twitter.com/jmasonlee" target="_blank">Jacqueline Bilston</a><br /></b><br /></span><p style="text-align: left;"><span style="font-family: inherit;">I’ve found that when I'm creating tests they provide 4 categories of benefits. Having these categories helps me to see how to write better tests and helps me see what to improve when I am feeling a particular pain. These benefits tend to occur in chronological order, which is how I’m going to lay out the explanations.</span></p><div><span style="font-family: inherit;"><br /><span style="color: #666666;">Note: This article is about tests as artifacts, not testing as performance. There is another area of testing known as exploratory testing. It is a different practice and provides different benefits.</span></span></div><div><span style="font-family: inherit;"><span style="color: #999999;"><br /></span></span><h2 style="text-align: left;"><span style="font-family: inherit;"><span style="font-size: 16pt; white-space: pre-wrap;">#1 Specification</span></span></h2></div><div><span id="docs-internal-guid-403c34db-7fff-0c58-2f93-f6d96f76e26b"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">“</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">What</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> am I building?”</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">At the very beginning, before any code is even written, writing a test scenario can help you understand what it is you’re trying to build. These scenarios often work much better than requirements, as the specifics of a scenario will often surface hidden issues. Programming is often done between two or more parties. Sometimes it can feel that way even if you are doing it by yourself. Scenarios will surface misunderstandings where you thought you were in agreement; edge cases you weren’t considering; and logical errors before they are written.</span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Even if this is as far as you proceed with your tests, they will still bring value.</span></p><span style="font-family: inherit;"><br /></span><h2 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">#2 Feedback</span></h2><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">“Does it </span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">work</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">?”</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">After you have a test scenario, you can immediately start getting feedback on whether or not it is completed. This feedback can come in many forms:</span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Programming by </span><span style="color: #980000; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">red</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">: Compiler errors can guide you on what needs to be built next. Failing tests can guide you on what needs to be implemented differently.</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Debugging / Logging / Inspecting: </span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Running code and seeing the results is critical to understanding that you’ve built what you meant to. Just imagine if you shipped code that you never ran :-/ </span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">People don’t know what they </span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">want</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"> until they see what they </span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">don’t</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> Showing the results to a customer will bring insight into if you are building the right thing.</span></span></p><span style="font-family: inherit;"><br /></span><h2 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">#3 Regression</span></h2><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">“Does it </span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">still</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> work?”</span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyrYvpR_iVljHWcJEoaW4sPbs7EvHFP6iuPUBadlQ2Vh5P3CaTjnFst7ETQg2epcFRq-bcPWuvCN69eKPsTi8ZjOxPvftY5cae1KhobOpLEspPMHyfi6Ijxwy5MDSVEnNXGfzkkvDBAOtw/" style="margin-left: 1em; margin-right: 1em;"><img alt="99 bugs in the code, 99 bugs in the code, take one down pass it around, 127 bugs in the code" data-original-height="320" data-original-width="639" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyrYvpR_iVljHWcJEoaW4sPbs7EvHFP6iuPUBadlQ2Vh5P3CaTjnFst7ETQg2epcFRq-bcPWuvCN69eKPsTi8ZjOxPvftY5cae1KhobOpLEspPMHyfi6Ijxwy5MDSVEnNXGfzkkvDBAOtw/w400-h200/image.png" width="400" /></a></div><br /><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Just because code worked yesterday does </span><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">NOT</span><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> mean it still works today. Rerunning your tests allows you to know that things still work. A suite of passing tests gives confidence that things still work. Better still, a single failing test </span><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">proves</span><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> that something doesn’t.</span><p></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #666666; font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Note: In my experience, you won’t get good regression without automated tests.</span></p></span><h2 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span><span style="font-family: inherit;"><br /></span></span><span style="font-family: inherit; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">#4 Granularity</span></h2><span><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: inherit;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">“</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Why</span><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> did it break?”</span></span></p><span style="font-family: inherit;"><br /></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Granularity can show up in many forms, but it’s always about figuring out how to fix what went wrong. I tend to see 2 main forms of it.</span></p><span style="font-family: inherit;"><br /></span><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">#1 Temporal Granularity: </span></h3><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">You just changed a line of code and it broke the build. That line is the problem. Maybe you just roll it back, maybe you fix it and roll it forward. Either way it’s fixed and it was easier than if you had changed 1,000 lines of code.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">or... </span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">5 people commit and the nightly build breaks, who caused it? </span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">vs.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">CI runs after each commit and Jonny's commit broke it.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">or ...</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The tests passed 2 minutes ago and now they are broken</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">vs.</span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The tests passed this morning and now they don't.</span></p><span style="font-family: inherit;"><br /></span><h3 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="font-family: inherit; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">#2 Differential Granularity</span></h3><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">‘</span><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Exception thrown</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">’ doesn’t help anybody</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">‘</span><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Array index out of bounds</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">’ is a little better.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">‘</span><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Array[10] is out of bounds for length 10</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">’ means you have an off-by-one error.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">‘</span><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Array[-2] is out of bounds for length 10</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">’ means you have calculation bug.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">‘</span><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Array[two] is out of bounds for length 10</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">’ means you have to verify user input .</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">‘</span><span style="font-family: "Courier New"; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Array[5] is out of bounds for length 0</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">’ means you have to check if result came back empty.</span></p><div><span><br /></span></div><div><span>Logs in JSON are queryable which helps you find issues faster.</span></div><div><span><br /></span></div><div>Objects with useful toStrings help you understand the state of your system.</div><div><br /></div><div>Diff tools help to find what changed between two outputs.</div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Giving meaningful output helps us understand the causes for failures and the potential fixes.</span></p><div><span style="background-color: transparent; color: #111111; font-family: Arial; font-size: 12pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span></div>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-69217044351612749402020-11-21T07:44:00.003-08:002020-11-21T07:58:07.522-08:00The Point of 'No Return'<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjty8NCBTnL2eGGxESXxvyDh_jaGXuJVDROVSAO1RYn8ynIB216Y1aujVhaEDm6hohTZP8TbzwXC8YIRn13wTXEdcHaecBcIjTHli9dXon-iY4IPjIKKAjcZT8EGzXjGrC_40MsssSRhw74/s1600/Screen+Shot+2014-08-28+at+7.56.45+AM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjty8NCBTnL2eGGxESXxvyDh_jaGXuJVDROVSAO1RYn8ynIB216Y1aujVhaEDm6hohTZP8TbzwXC8YIRn13wTXEdcHaecBcIjTHli9dXon-iY4IPjIKKAjcZT8EGzXjGrC_40MsssSRhw74/s1600/Screen+Shot+2014-08-28+at+7.56.45+AM.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
The Point of 'No Return'</div>
<div class="separator" style="clear: both; text-align: center;">
Welcome to <b>\n</b>ew world</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">I believe that <b>life is important</b>...</div>
<div class="separator" style="clear: both; text-align: left;">
...and way too much of it has been <b>wasted</b> on dealing with issues arising from inconsistencies between line endings.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
A modest proposal:</div>
<div class="separator" style="clear: both; text-align: left;">
In today's world most programs can handle the line ending \n correctly.</div>
<div class="separator" style="clear: both; text-align: left;">
The 'No Return' movement seeks to make inconsistent lines ends a thing of the past.</div><div class="separator" style="clear: both; text-align: left;">There are 3 practices on the path to achieve this:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ol>
<li>By default <b>never</b> use \r\n line ending in anything that it outputs.</li>
<li>Have a toggle to turn this off for people stuck in the past</li><li>(optional) On reading, replace all '\r\n' with a '\n' on any file used by the program</li>
</ol><div>But:</div><div><br /></div><h4 style="text-align: left;">Don't most programs already have the ability to toggle?</h4><div>Yes, but they tend to default to the version of the system. Meaning Windows perpetuates the line ending inconsistency problem. If you have dealt with this issue (which you probably have) this is why.</div><div>Most people don't change the defaults. We need to start making inconsistent line endings a very rare exception</div><div><br /></div><h4 style="text-align: left;">It's just two options, is it really such a big deal?</h4><div>It shouldn't be. But I personally have spent weeks of my life dealing with this issue. If you were to total up the hours of all programmers it's lifetimes of people, and it isn't going away. Our current path is pass this problem on to the next generation. We need a path to end it.</div><div><br /></div><h4 style="text-align: left;">But isn't there a reason for \r\n?</h4><div>Yes, it was based on the way typewriters worked. We are still dealing with legacy from type writers.</div><div><br /></div><h3 style="text-align: left;">Ok, you've convinced me, how do I signup?</h3><div>Simple, copy the above logo and add it to your site, link to this article and add the 3 rules to your code base.</div><div><br /></div><div><br /></div><div><br /></div><div>note: I originally wrote this in august of 2014. For some reason I never published this. I'm finally doing it in November 2020 because I'm <b>still dealing </b>with this issue....</div><div><br /></div><div><br /></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-24225512957472570012020-10-22T13:04:00.011-07:002020-10-22T13:22:24.144-07:00Online Remote Training: Lessons Learned<p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br />By Llewellyn Falco and <span class="s1" style="color: blue;"><a href="https://claremacrae.co.uk/" target="_blank">Clare Macrae</a></span>.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Here is what we learned about how to do effective online training, to help you run better courses yourselves, or to help you choose better courses to attend.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>TL;DR</b>: Take advantage of being able to spread classes out over time. When meeting virtually, don’t pretend that you can replicate what you do at in-person training. You will need to scale back and make accommodations for the added problems of remote training.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p3" style="color: blue; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s2" style="color: black;">See it for yourself at our November 2020 class “<span class="s3"><a href="https://bit.ly/LegacyCppNov2020" target="_blank">Testing Legacy C++ Code effectively with Approval Tests</a></span>”</span></p><h2 style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 18px 0px 6px; text-align: left;">Introduction</h2><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Over the last 6 months, we have been intensively learning how to create online training with a similar level of quality to in-person training. In this post, we share what we’ve learned so far. </p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Note: <b>Skills vs knowledge</b>. There are multiple types of training: many are focussed on transferring knowledge. But we believe that one of the big advantages of training is the ability to transfer skills. Teaching skills requires a lot of hands-on work from the participants. This is a different, and slower, process, but the one we are talking about today.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h1 style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 18px 0px 6px; text-align: left;">Benefits over in-person training</h1><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Fortunately, there are some advantages to online training, which can make them <b>better</b> than in-person courses. Let’s start with the positive.</p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Multiple Shorter Time Slots</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">If you remember back in school, we didn’t do a week of arithmetic, followed by a week of literature, followed by a week of physical education, followed by a week of art. This is by design. Humans learn better by <b>doing a little bit every day</b>. Part of this is how much we can learn in a given day, but the other part has to do with the need for periods of rest in between. Time in-between is where we can absorb and incorporate those skills into our being. Remember, exercise does not build muscles, it destroys muscles. It’s the rest afterwards where the muscles rebuild.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Spreading out a course of short periods on multiple days is never done during in-person training courses, because these typically involve the time and costs of hotels and planes. So instead we batch-up into a full day or a full week, with 8 to 40 hours of training. Sometimes we try to spin that as a good thing, with a title like “Boot Camp”.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">We have found that, rather than teaching an 8-hour class in a single day, it is better to teach an 8-hour class, split up into <b>2 hours per week over 4 weeks</b>. This yields much <b>better results</b> for the students. It not only gives them more time to absorb the information, and revisit it if needed. More importantly, they get to try out these skills during their normal activities.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Other bonuses are that it also makes it easier to maintain focus for the entire session, and even makes it <b>easier to deal with time-zones</b>. (I can easily wake up early for 2 hours every Monday without it disrupting my entire week. If I have to wake up early every day, my entire week is shot.)</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">This is true for both attendees and instructors.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Homework</h2><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">There are lots of benefits to homework, in deepening an understanding. Unfortunately, it is not practical to assign homework after an 8 hour day, that has to be completed by the next day.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">With short, weekly sessions, homework is now practical, useful and accessible.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">We have found these useful types of homework:</p><ol class="ol1"><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Repeat the exercises</b> that we did in class, to make sure that you can understand them, and get them working on your own computer.</li><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Homework that <b>expands your absorption</b>, such as actively trying to use the techniques you are learning, in your day-to-day work.</li><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Supplemental reading and videos</b>. Use this sparingly.</li></ol><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>You cannot make homework essential</b>, so we do not try to introduce new concepts via homework. This means that if a concept is introduced in supplemental reading or a video, we will always <b>re-introduce the concept in class</b>, as though it is the first time students are seeing it. This is important to not disadvantage students who don’t have the extra time to spare.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">A powerful motivation for doing this week’s homework is the fact that <b>other students</b> did last week’s homework. Be aware that even with very motivated people, some will still not do the homework because other important things took priority. So you <b>do not want to shame</b> anyone for not doing the homework, but at the same time, you want to make visible that the other students are. We have found this to be a better motivator than your instructor telling you to do your homework or grading the homework.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">To this end, these are the things that make it easier for the homework to be done:</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><ol class="ol1"><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">End each session with a <b>clear and consistent assignment</b>. It’s easier to do something if it’s clear what you have to do.</li><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Begin each session with a check-in</b>, where the students can see that (usually) the majority of the other students are doing the homework.</li></ol><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h1 style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 18px 0px 6px; text-align: left;">Constraints</h1><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Of course it’s not all better. We have found some serious constraints when running online courses.</p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">The need for video</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"> <br />One of the things we noticed is, as an instructor you are often helping people to accomplish tasks. Without video it’s almost <b>impossible to tell</b> the difference between “I’m not doing something because I have no idea where to start” and “I’m right at the edge, ready to jump, and i just need a little bit of encouragement to move”. These are huge extremes, and how you help an individual student at these moments greatly depends on where they are.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">We have found it to be so important that we have <b>made video a requirement for attending</b> our courses.</p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /><b>Protocol</b>: At the beginning of each course we state that, if for any reason you need to step away from your computer, that is OK. Simply turn off your camera and mute your mic, and we will assume that you are out of the room.</p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Smaller classes</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br />While it is possible to run a lab with 20, 30 or sometimes 40 people in a room, we have found it very <b>difficult to handle class sizes greater than 12 online</b>. The issue here is the inability to split the instructor’s attention. If you put people into break-out rooms, you are effectively blind to everyone, or blind to everyone else but those in the room you are in. If you keep them all in the same room, you can’t do small-group work. This is not the case in the real world, where you can see the whole room, and the tables can just focus on themselves. Some of this can be mitigated by having an extra person co-facilitate, but this also complicates things. You need to have smaller classes.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Have backup options</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br />“Anything that can go wrong will go wrong” (Murphy). Things go wrong all the time, even at in person events. But I’ve never been in a physical class where I just disappeared. Online, I have.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">You can <b>lose the internet</b>, your computer can die, you can be region-blocked, the student’s computer and internet can die, servers and services can go down. What do you do when this happens?</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">The best advice we have is to have backup options. <b>Two instructors</b> means one of you can lose the internet (if you make the other one a co-host). Having <b>multiple channels of communication</b> (Google docs, email, Zoom, remote-desktop to shared computer) not only means that you have a way to communicate when something goes wrong, but also makes it easier to figure out what went wrong, when the inevitable happens. Also have a <b>second internet connection</b> (usually a phone). </p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Checklist</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br />Backup options don’t work if they are not set up and tested. We have found that we need to make a checklist of things to do <b>before we start each class</b>. There are usually only 4 or 5 items, and we usually won’t remember to do all of them without the checklist.</p><h1 style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 18px 0px 6px; text-align: left;">Practicalities</h1><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Allow time on both sides</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">In the real world, many instructors and students arrive early to the room, and sometimes they hang around after the class has finished. But because of the ability to instantly teleport into a Zoom call, we have a tendency to start an 11am call at 11am, and to book a 12 o’clock call right after. From the instructor’s point of view, we recommend that you <b>open the call 10-15 minutes early</b>, to allow people to arrive at leisure, and to ensure you can <b>start on time</b>. Also, clear your schedule for another <b>30-45 minutes after the class</b>, to you to allow questions and discussion with students. </p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">We also recommend that our <b>students don’t book anything for 30-60 minutes after</b> the class. This isn’t so that they can have discussions with us (although that’s a benefit). It’s because they’re tired after the class, and they <b>need a break</b> before jumping into whatever their next thing is.</p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Breaks</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">An advantage of the real world is that while you are in class, the rest of your life is out-of-sight and out-of-mind. This is not true in the virtual world. The cognitive load we all feel from the rest of our household weighs on us, and we need small releases at regular intervals. For example, it is easier to tell a child “wait 10 minutes and I can take care of it” than “wait 2 hours”. We recommend a <b>5-10 minute break every hour</b>, without fail.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">When we are running breaks, we usually display a count-down timer in a web browser, so everyone knows when to return. Just <b>Google “5 minute timer”</b>.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Need for Activity</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">You are simply not as charismatic and engaging on video as you are in person. Remote calls need <b>more activities, and shorter periods of you talking</b>. This is good advice for skill-based training anyway, but is 10 times important when training remotely. We suggest breaking things down into <b>small exercises</b>, that you can start almost immediately. We try to use frequent changes in how the students are interacting, to <b>introduce variety</b> and hold engagement.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Not Seeking Volunteers</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Asking for volunteers tends to unintentionally exclude a fair amount of your class, and you may find one or two voices tend to dominate. This is true in-person, but it’s significantly worse in virtual classes, where it is easier to hide, and harder to jump in.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">We suggest using systematic methods of selection. For example:</p><ul class="ul1"><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Rotate in order:</b> from a list</li><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Randomly select:</b> the key here is make the random selector visible. For example, assign everybody a number, and use an online random-number generator.</li><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Mechanistic selection</b>: break into groups of two, and the person with the shortest name will go first, and then you will rotate.</li><li class="li1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Call on people who have <b>not yet contributed.</b></li></ul><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Requirements and Geographic Locations</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">It’s easy to think that now we are virtual, anyone from anywhere can attend a course. But this is not always true. Many software products and web sites are blocked or not available to certain geographical areas. Our best suggestion is to have a very clear list of requirements to attend the course, and let the attendees determine it for themselves.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">For example, our current course lists this at the top:</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p6" style="color: #6f7287; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><b>Course Requirements</b>: </p><p class="p6" style="color: #6f7287; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">To attend this course, you will need to be able to use the following:</p><ol class="ol1"><li class="li7" style="color: #6f7287; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="s5" style="color: #1155cc;">Zoom</span>, with a microphone and camera.</li><li class="li7" style="color: #6f7287; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="s5" style="color: #1155cc;">AnyDesk</span></li><li class="li7" style="color: #6f7287; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="Apple-tab-span" style="white-space: pre;"> </span><span class="s5" style="color: #1155cc;">Google Docs</span></li><li class="li7" style="color: #6f7287; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="Apple-tab-span" style="white-space: pre;"> </span>Basic understanding of C++ (creating strings, creating call functions, variable, loops, etc…)</li></ol><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><h2 style="color: #434343; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 16px 0px 4px; text-align: left;">Cloud-hosting and AWS</h2><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Having people work on virtual environments in the cloud is a huge help, for remote training. This is not as doable for in-person training, as reliable internet is not something that you can count on at a conference, but is something that you have to rely on, for people to attend a course virtually. To learn more about this, check out “<span class="s1" style="color: blue;"><a href="https://docs.google.com/document/d/1DyTemsYBu2LUhrwwCdNuPQDWj3f_yfMj3otaoEZZRC4/edit?usp=sharing" target="_blank">How to setup a Windows AWS EC2 instance for remote mobbing and pairing</a></span>”</p><h1 style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 18px 0px 6px; text-align: left;">See for yourself</h1><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">If you would like to experience how we are doing virtual training yourself, you can always sign up for our <b>November 2020 class</b> “<a href="https://bit.ly/LegacyCppNov2020">Testing Legacy C++ Code effectively with Approval Tests</a>”</p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">Alternatively, if your company would like a <b>private course</b>, we offer them in Java, C#, C++, JavaScript and Python, on a variety of topics relating to Agile Software Development and Code Quality, such as Unit Testing, Refactoring and Legacy Code.</p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p9" style="color: #1155cc; font-family: Helvetica; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s2" style="color: black;">Contact us at: <span class="s3"><a href="mailto:info@spunlabs.com">info@spunlabs.com</a></span> and <span class="s3"><a href="mailto:clare@claremacrae.co.uk">clare@claremacrae.co.uk</a></span></span><span style="color: black;"> </span></p><p class="p2" style="font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px 0px 3px; min-height: 14px;"><br /></p><p class="p10" style="font-family: Calibri; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px; min-height: 14px;"><br /></p>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-88777154918634817842020-07-29T08:53:00.001-07:002020-07-29T08:53:23.256-07:00Modified STUK storage to fit under a SÖDERHAMN Ikea couchWith the pandemic, I've been spending a <b>lot</b> more time in my house. One of the things I've been watching to entertain myself is the <a href="https://www.youtube.com/watch?v=d0b9UHSr8ck" target="_blank">tiny house videos </a>on youtube. While I don't think I would want to live in such a small space, it has gotten me thinking about the space I do live in, and how to make it better suited to me and less cluttered. And, of course, it's gotten me thinking about storage.<div><br /></div><div>In my home office I have an ikea SÖDERHAMN couch.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU3Th9KlqiYTtxjxVSoRJS3HbcY3KidJc4IQ0a7dCnHqd5hSNaG6BRTg00PVGzhq_6lBJUtHO1gfUVCMHKpwGrT-5fWwcKQwptKNFVwQHJv60RdhAFitpCOzwNFg2aEiOO9Pfen80jkTbE/s500/soederhamn-4-seat-sofa__0666469_PE713556_S5.webp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="500" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU3Th9KlqiYTtxjxVSoRJS3HbcY3KidJc4IQ0a7dCnHqd5hSNaG6BRTg00PVGzhq_6lBJUtHO1gfUVCMHKpwGrT-5fWwcKQwptKNFVwQHJv60RdhAFitpCOzwNFg2aEiOO9Pfen80jkTbE/s320/soederhamn-4-seat-sofa__0666469_PE713556_S5.webp" /></a></div><div>And I couldn't help notice that there is a decent amount of space under it that I could use for storage. Especially of the things I don't use very often. But with a height of just 5.5 inches there isn't many options I could find.</div><div><br /></div><div>At Ikea, the salesperson did say that the STUK storage would work. I should have doubled checked, but I was tired and just bought them.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3UksWuLf0XLmIiUSLQ_MSRJXVtp9gFR9MvS03kv5LFULPSleN6ctl0HoFAU-kQ3CR5sUGJl6Zjxe-lansoGZ8fCAfSFDuhp-wro7uq18qMPen5t1B3ZkGgDRu1GFoQRi2BVLKfnD-LC3d/s2000/stuk-storage-case__0711304_PE728142_S5.webp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2000" data-original-width="2000" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3UksWuLf0XLmIiUSLQ_MSRJXVtp9gFR9MvS03kv5LFULPSleN6ctl0HoFAU-kQ3CR5sUGJl6Zjxe-lansoGZ8fCAfSFDuhp-wro7uq18qMPen5t1B3ZkGgDRu1GFoQRi2BVLKfnD-LC3d/w200-h200/stuk-storage-case__0711304_PE728142_S5.webp" width="200" /></a></div><div class="separator" style="clear: both; text-align: left;">Unfortunately, it's too tall. But having already gotten it, I decided to look into modifying it to fit. My first hint came from the assembly itself.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrySxr1wmLxx45wcy2zccmizbVQug9pVe1oNexFWJCcPqlW1FLcFBAF2HekTcU94FcxvVsu6XaDqcuPvXAWdEHihz3qNCpom8imbvUHAHxAggfBfaYZmQ0VBdblQUfUYrtsURzutQNmU97/s2048/stuk+insert.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1964" data-original-width="2048" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrySxr1wmLxx45wcy2zccmizbVQug9pVe1oNexFWJCcPqlW1FLcFBAF2HekTcU94FcxvVsu6XaDqcuPvXAWdEHihz3qNCpom8imbvUHAHxAggfBfaYZmQ0VBdblQUfUYrtsURzutQNmU97/w200-h192/stuk+insert.jpg" width="200" /></a></div><div class="separator" style="clear: both; text-align: left;">I realised I could cut these to shorten it. It turns out to be easy to do with i sharp knife. Cut the top down the grove. Then bend it backwards and slice the knife between to fully separate it.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6av-_9cjj46WLmKqANRm68rRsRoU0ONuR959i_9kYqEkOUnWFwTMdSuwCV_MUnl9fjv32Mr8hT2s_ZSzS3OQ22Iq1xMGLHuxzCRLa0CcfclhwCwIS7xLZdCvyRFYIYLE_b0VsWzaTfjOg/s2048/insert+-+cut.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1674" data-original-width="2048" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6av-_9cjj46WLmKqANRm68rRsRoU0ONuR959i_9kYqEkOUnWFwTMdSuwCV_MUnl9fjv32Mr8hT2s_ZSzS3OQ22Iq1xMGLHuxzCRLa0CcfclhwCwIS7xLZdCvyRFYIYLE_b0VsWzaTfjOg/w200-h164/insert+-+cut.jpg" width="200" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFm8cIKLsVbgua9gIjeTokT5AacogQkR1szU87oZtfqN7IWjcGGe-u75aWTdickX7LFPfmpDqtp3DntotLCffDtWFt4Pd1N8whhJGnHyWYIxbebdcW5tA2z8xUFVn5am5dTVkuunt0n7XQ/s2048/stuk+-+slice.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1430" data-original-width="2048" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFm8cIKLsVbgua9gIjeTokT5AacogQkR1szU87oZtfqN7IWjcGGe-u75aWTdickX7LFPfmpDqtp3DntotLCffDtWFt4Pd1N8whhJGnHyWYIxbebdcW5tA2z8xUFVn5am5dTVkuunt0n7XQ/w200-h139/stuk+-+slice.jpg" width="200" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;">Now the only thing left to do is the 2 panels that are sewn into the walls of the box. For this I just cut them out, but I found it work better to cut a bit away form the edge so there is a little flap to hold it in when you replace it. </div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YHAn2x9rplBguCDiix3EeWFTiujwlRzT7VZ9iobWPv8sJzXj2xUYt2C-_B6xDLIjpWs1mSOoBUaCAiN5p571YZg9C5oITct8xYZKkulsLXJIv3X3GMFuqf2AfoFgc4sB-pih7BO1B5g-/s2048/stuk+cut+side.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1523" data-original-width="2048" height="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YHAn2x9rplBguCDiix3EeWFTiujwlRzT7VZ9iobWPv8sJzXj2xUYt2C-_B6xDLIjpWs1mSOoBUaCAiN5p571YZg9C5oITct8xYZKkulsLXJIv3X3GMFuqf2AfoFgc4sB-pih7BO1B5g-/w200-h149/stuk+cut+side.jpg" width="200" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD8YiByXMtyVuV5IfuLl934cVn9U7Ls6zaxEwCyATEse8vAW6u_-c-66xsOyo41NMXKpYAXRN5Tb68YMLkkBaNEl9z46vWOIr9LlwPyQioC9ZHZgCWYsQRpou4HJUMoUlz-HZKnsNGo1CE/s2048/stuk+overlap.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1719" data-original-width="2048" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD8YiByXMtyVuV5IfuLl934cVn9U7Ls6zaxEwCyATEse8vAW6u_-c-66xsOyo41NMXKpYAXRN5Tb68YMLkkBaNEl9z46vWOIr9LlwPyQioC9ZHZgCWYsQRpou4HJUMoUlz-HZKnsNGo1CE/w200-h168/stuk+overlap.jpg" width="200" /></a></div><div class="separator" style="clear: both; text-align: left;">Then just reassemble and it slides nicely under the couch.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOcMYXizzCFZ1heVItKLjX5lxBSzyG9sBwp2TUWUJoE__f8cQlSUnjjXlqZUUiqT49P7sfiiHXcTRvqfAkPNFDsXGOGEm5qPeM561ng3D5dMb0i2VN1wZDEBobsSqgMUJNAySjWW4W8fB/s2048/stuk+coach.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1437" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOcMYXizzCFZ1heVItKLjX5lxBSzyG9sBwp2TUWUJoE__f8cQlSUnjjXlqZUUiqT49P7sfiiHXcTRvqfAkPNFDsXGOGEm5qPeM561ng3D5dMb0i2VN1wZDEBobsSqgMUJNAySjWW4W8fB/s320/stuk+coach.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><h4 style="clear: both; text-align: left;">Aesthetics</h4><p style="clear: both; text-align: left;">I think the edges could be nicer, also more permanent. They sometimes slide out depend on how I'm holding it, but since it's mainly out of sight, this isn't something I'm worried about or planning on fixing. Likewise, the cuts to the fabric could have been cleaner, or repaired. but since no one ever see this, I'm not bothered.</p></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><br /></div>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-64828975593626479112020-03-25T10:55:00.000-07:002020-03-25T10:58:15.418-07:00Recovering a lost code baseTwice in my career I have realized that the code that was in production at a client did not match the code that was in source control. Of course if you have any type of automated deploy process this will not be the case, but if you have a manual deploy it can be.<br />
<br />
Yesterday, <a href="https://twitter.com/simoncropp">Simon Cropp</a> told me of an amazing technique to recover from this. I am writing this in the hope that it will <b>never</b> be of any use to <b>anyone</b>, <b>ever</b> :-)<br />
<br />
<br />
First, let's go thru my history of what I did.<br />
<br />
<h3>
The First Time: we found the code in the closet.</h3>
<br />
The first time this happen was over a decade ago. We were fortunate that the company was being sued and a court order forbid the destruction of data. The employee in question had been let go a month or two before but their computer was in lockdown storage. We were able to find the code and check it in to source code control. This is the ideal solution. We get everything we needed. The original source.<br />
We were lucky. Very lucky. The code hadn't been modified, since they weren't there to modify it. There was only 1 place the code could be because that module was only worked on by them. We didn't have to guess between versions. And, we didn't delete the code.<br />
<br />
<h3>
The Second Time: we decompiled the code</h3>
<div>
The next time we weren't as lucky. This was a VB.NET project and the latest in source control didn't match what was in production. Was it very different? Who knows. The employee in question had also been let go and when we realized this we ended up just decompiling the code that was in production. This creates <b>very bad</b> Visual Basic code, so we took advantage of it to create reasonably bad C# and move languages. This was nice, but we lost a lot of intent that was in the original source code. It would have been better if we could have gotten it back. However, we cut our losses and moved on.</div>
<div>
<br /></div>
<h3>
The Next Time: decompiled to detect and recover the source</h3>
<div>
Here is a better way. It's a mix between the first two.</div>
<div>
<ol>
<li>Decompile the production source</li>
<li>Also, compile and decompile the possible sources you have found.</li>
<li>Compare the decompiled sources with source control.</li>
<ol>
<li>Maybe there's a match? </li>
<ol>
<li>Yay! Then you have got the original source or it's equivalent </li>
</ol>
<li>Maybe you have partial matches?</li>
<ol>
<li>Create a new code base of patches from the matching places.</li>
<li>Repeat</li>
</ol>
<li>Maybe you have a section with no matches</li>
<ol>
<li>You can try to reproduce the code manually</li>
<li>or, you can copy and paste those sections into the new code base and small sections of decompiled code in large sections of original code.</li>
<li>repeat</li>
</ol>
</ol>
</ol>
<div>
<br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSZ5LE7m2RFgi3-ww9mMZCcTwVS_4O3jNPNXE54tLvdn5duZ22k792L78kHqvDIkH2mcdZK0a7agktBSHzNhGiNh2UrUAlYPwCF-PffbV0ATo2X-_SlmjzNduEheWJvPHvDH_fMHecsWOS/s1600/Screen+Shot+2020-03-25+at+10.54.07+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="652" data-original-width="935" height="446" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSZ5LE7m2RFgi3-ww9mMZCcTwVS_4O3jNPNXE54tLvdn5duZ22k792L78kHqvDIkH2mcdZK0a7agktBSHzNhGiNh2UrUAlYPwCF-PffbV0ATo2X-_SlmjzNduEheWJvPHvDH_fMHecsWOS/s640/Screen+Shot+2020-03-25+at+10.54.07+AM.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-35323148885007051242019-11-19T08:54:00.002-08:002019-11-19T08:54:39.016-08:00Thoughts on CodeRetreat<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Last weekend I attended a <a href="https://www.coderetreat.org/">Code retreat</a> as part of global day of code retreat. I love code retreat. I’ve been attending since 2010. I’ve organized and even facilitated some. But I was rather disappointed in this one. I wanted to write down the issues I saw, not as a criticism of code retreat, but in the hopes of bringing back the original feel of the event and to hopefully grow more of them. As such, I’m using each issue to better understand what I dislike and propose a change that will improve the experience.</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
What it is</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
CodeRetreat is a full day of practice. It focuses on TDD and design and you do the same problem over and over again in 40 minute bursts. Often there are small variations to help explore new areas of learning. There is often a small retrospective in between each session. </div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Issues:</h2>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Pairing</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
To be clear, I am a HUGE fan of pair programming. However, there is a skill to pair programming and many at a code retreat have never practiced it before. Having the 1st session default to the style where the driver (person at the keyboard) is typing and thinking tends to lead to a session where the navigator (the person not at the keyboard) is watching. It makes it hard to rotate, and discourages tring new languages. </div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution: I would have the 1st session be <a href="http://llewellynfalco.blogspot.com/2014/06/llewellyns-strong-style-pairing.html">strong style pairing</a>. The difference is that the person at the keyboard “is not thinking”. This makes it easy to work in a new language (you just type for the other person). It maximizes communication and helps people to connect.
After the 1st session. I would introduce the traditional style of pairing and open it up as to which they prefer.</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Retros</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Retros are a good way to learn from experience, but there are two issues with the current style. The first is we don’t really have a shared experience, so listening to each other talk full of misunderstandings. This is amplified by the deletion of code (more about that later). So that it was hard to get value out of the retros and they felt more like stand up status meetings. </div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution: I would advise a two phased retro. 1st the teams spend 5-10 minutes retroing their experience by themselves, then they choose the best insight and do a group share of a single insight. I would also include in this group share the language and number of tests written.</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Example group share: “We worked in java & wrote 9 tests. We were surprised by how hard it was to work around passing back booleans until we changed to passing in the if/else blocks to the method.”</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Deleting Code</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Code retreat has a rule that you delete your code at the end of a session. This is a rule that gets violated all the time, but has a good intention. It’s designed to make it safe to experiment. I believe in that safety. But I also believe in the ability to review and learn from the code you wrote. Deleting it prevents reviewing and sharing.</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution: First, wait until after the retro to delete the code. Second, make the deleting optional to the group, but allow anyone in the group to have the option to delete the code. In other words, unless it is unanimous to not delete the code, the code gets deleted.</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Mobbing</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
I’m surprised there isn’t at least one session of mobbing and a option for mobbing on most sessions. Although, I wouldn’t recommend it for the first session as it cheats people of a chance to struggle. </div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution, I would offer mobbing as a option.</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
TDD</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Test driven development is still very new for many people. I’m surprised by the number of pairs that don’t write any test even though it is stated as a constraint. I think you need sessions just to build this skill. Probably many sessions. In the retros it was common to hear they hadn’t written test. </div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution: Slow down on the addition of constraints. Talk about the testing cycle. Ask about the tests. Give people paper so they can write the test down before code. I would even make a place to post the paper to share.</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Constraints</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Constraints can be a great way to explore new areas of design. But too many remove all usefulness. This is used a lot in Code Retreat so I’m going to address them individually. But by the 4 session we were doing game of life with: no talking, no primitives across a border, and no if statements. We had not mastered any of these and most people didn’t actually follow the restrictions. It also massively discorages using a new language as it’s an advanced design session.</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Suggestion: make constraints optional, give a variety of choices. Encourage not using them if you are doing this session in a new language. The new language is the constraint.</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
<b>Constraint - Primitives: </b>This is open to a lot of misinterpretation. It’s designed to address coding smell of primitive obsession. Which means you shouldn’t pass around numbers and strings, but objects that have a meaning. Like Money instead of a double, or Name instead of a string. However, there is an interesting issue of constructors: is the code “new Money(100)” allowed? and there is a easy misinterpretation that the specific language definition of primitive is in play. This could just be an autoboxing exercises in java. Use Boolean instead of boolean, Integer instead of int.
</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Suggestion: have examples and a slide of the constraint.</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
<b>Constraint - Muted Ping pong Pair Programming.</b> This constraint removes communication in pair programming. It’s rather masochistic. I don’t understand why you would do this other than to show some of the pain, which can help learning, but contributes to the general issue of making the day less fun. Since these are usually saturdays, this should be the opposite of what you are striving for. </div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
“The most important part of practice is making sure you want to show up for practice tomorrow”</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution: remove this constraint entirely. At a minimum add it a possible minimum constraint</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
New languages</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
One of the things I loved most about code retreat was trying new languages. This time that was hard to do because of the amount of other constraints that where in play.</div>
<h2 style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Fun</h2>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
I also noticed that we ended with less people than we started with. This is amplified by the fact that my partner and I were the only 2 people that didn’t work for the company that hosted the code retreat and I live in a very programmer heavy area. Given the number of programmers in the bay area, there should be multiple code retreats and all of them should be overflowing.<br />I have had sooooo much fun at code retreats. Practice should be fun. I feel that some of that has gotten lost in translation. </div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
Solution: Bring back the focus on fun. Make it a stated objective.</div>
<div style="margin-bottom: 35px; margin-top: 35px; transition: margin-top 0.1s ease-out 0s, margin-bottom 0.1s ease-out 0s; white-space: pre-wrap;">
<br style="background-color: #fafafa; color: #3c3c3c; font-family: "Droid Serif", serif; font-size: 20px;" /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-45235835746904272022019-04-02T22:35:00.002-07:002019-04-02T22:45:29.681-07:00The Problem with HackathonsToday I went to TestBowl 2019 - Software Testing Competition.<br />
I had some reservations going into it, but it was in my neighborhood and only 3 hours so I thought "why not".<br />
<br />
It was disappointing, but the thing is, I've been to 40-50 practice events for programming. I've hosted quite a few of them myself. So why was this different?<br />
<br />
This blog is an exploration into that question...<br />
<br />
<h3>
The Event</h3>
The event had about 20 to 30 people. I believe all of them were at the conference anyways (meaning I was the only local). The had dinner and did some questions, that were stated to be ice breakers but didn't include things like actually talking to other people. There was some interesting trivia questions though.<br />
After that we broke into teams of 2 and where given a Test Target (a government website) and a Bug Tracking system (from the company that sponsored the event). This was a contest, so the points went to the most bugs submitted (this is an simplification, but basically true).<br />
<br />
We used a mindmap to log as we went and only entered the results into the tracking system in the last 15 minutes.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw36Zv0auMfTpB0oTUBzSR9uR6ZDCl7rRcqW78aCmCgtTfsksgXgc5coCo5pW1yQ5rFbB4_CKkDRm_XquxlPTuxEpS2VpZkhDnK7p8UPaH67KWPHQvOp0gKQIKh2OdUKTEWDdqE_wtSmgZ/s1600/Screen+Shot+2019-04-02+at+8.59.54+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1293" height="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw36Zv0auMfTpB0oTUBzSR9uR6ZDCl7rRcqW78aCmCgtTfsksgXgc5coCo5pW1yQ5rFbB4_CKkDRm_XquxlPTuxEpS2VpZkhDnK7p8UPaH67KWPHQvOp0gKQIKh2OdUKTEWDdqE_wtSmgZ/s320/Screen+Shot+2019-04-02+at+8.59.54+PM.png" width="320" /></a></div>
<br />
<br />
We tested for around 90 minutes. Then it was over and I went home.<br />
<br />
<h2>
What was wrong</h2>
<h3>
Testing</h3>
<div>
One very possible reason I didn't enjoy this very much is that it was just exploratory testing. While I admire exploratory testing, it doesn't bring me the joy that programming does. While I <b>do not </b>believe this to be the reason, I think it's important to acknowledge this bias in me as it could color my impressions.</div>
<div>
<br /></div>
<div>
Conversely, I do think it is this bias that is allowing me to see the issues in this event more clearly. It was lacking the "spoonful of sugar" making the distasteful parts more salient.</div>
<div>
<br /></div>
<h3>
Contest considered Harmful</h3>
<div>
The single most harmful thing about this event to me was that it was a contest. The reason I enjoy, attend and participate in hands-on practice sessions is the <b>learning</b>. That's always where the value and focus is. The contest changes that focus and obscures the focus.</div>
<div>
<br /></div>
<div>
For example, there was the option to work alone. I think some of the other teams or even most of the other teams worked separately. This is <b>much </b>worse for learning, but it is understandable that people would prioritise that when "the goal" is number of bugs in 2 hours.</div>
<div>
<br /></div>
<div>
Let's imagine working alone. It's rather hard to see what you would learn if you don't have anyone to learn from. But even with just 2 people there is less chances to learn tricks you can use later. Also, there weren't constraints which are usually helpful when learning. Forcing you to work in a new way and discover new techniques.</div>
<div>
<br /></div>
<h3>
Alternative Motivations </h3>
<div>
It's obvious that some of the motivation for the hosts was to get people to try out their software. This isn't inherently bad, learning new tools is often useful. However, because contest was drawing attention away from learning we used the tool but without really learning it. I didn't come away with ways the tool could help me to test. This is something that could be addressed better if the focus was solely on learning.</div>
<div>
<br /></div>
<h3>
No Retrospective</h3>
<div>
So another downside of the contest is there isn't much sharing between teams. There was sharing of the score, but this didn't pass along learning just increased focus on the scoring and task. The competitive aspect tends to prevent sharing and reflection . The goal being "to win" instead of 'to learn" also means that when it the work is over you are tempted to leave because it feels like the event is over. You don't stick around to learn because that wasn't the point.</div>
<div>
<br /></div>
<h3>
No Space for Stretching</h3>
<div>
<i>"Hard in training, easy in combat"</i></div>
<div>
Another element that was missing was the space to try new things. Humans tend to either be in a state of practicing or preforming. Part of fitting into the time limit was prioritizing for getting everything done in the time limit. This left little space for actual practice.</div>
<div>
<br /></div>
<h3>
In conclusion...</h3>
<div>
The reason I enjoyed the other practice sessions is the hands on learning. I hadn't realized the amount of effort that was put into making sure this was happening. </div>
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-22328270058507179472018-12-03T13:47:00.000-08:002018-12-03T13:55:58.936-08:00Safeguarding: A step-by-step guide<div dir="ltr" style="line-height: 1.38; margin-bottom: 3pt; margin-top: 0pt;">
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="375">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Unresolved Mention"/>
</w:LatentStyles>
</xml><![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;
mso-font-charset:2;
mso-generic-font-family:decorative;
mso-font-pitch:variable;
mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:727612947;
mso-list-template-ids:-842229852;}
@list l0:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l0:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l0:level3
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level4
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level5
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level6
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level7
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level8
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l0:level9
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1
{mso-list-id:1373772278;
mso-list-template-ids:1218484234;}
@list l1:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l1:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l1:level3
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level4
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level5
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level6
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level7
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level8
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l1:level9
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2
{mso-list-id:1405254923;
mso-list-template-ids:-1002035066;}
@list l2:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l2:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l2:level3
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level4
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level5
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level6
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level7
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level8
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l2:level9
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l3
{mso-list-id:1507984093;
mso-list-template-ids:29240468;}
@list l4
{mso-list-id:2100055031;
mso-list-template-ids:-127921314;}
@list l4:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l4:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l4:level3
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level4
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level5
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level6
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level7
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level8
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l4:level9
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5
{mso-list-id:2144154101;
mso-list-template-ids:-1928943796;}
@list l5:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l5:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:"Courier New";
mso-bidi-font-family:"Times New Roman";}
@list l5:level3
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level4
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level5
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:2.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level6
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level7
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:3.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level8
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level9
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:4.5in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Wingdings;}
@list l5:level4 lfo4
{mso-level-start-at:0;
mso-level-numbering:continue;
mso-level-text:;
mso-level-tab-stop:2.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
ol
{margin-bottom:0in;}
ul
{margin-bottom:0in;}
</style>
</div>
<span style="font-size: xx-small;"><span style="color: black; font-family: "arial" , sans-serif;">By: </span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><a href="https://twitter.com/llewellynfalco"><span style="color: #1155cc; font-family: "arial" , sans-serif;">Llewellyn Falco</span></a></span><span style="color: black; font-family: "arial" , sans-serif;">, Josh
Widzer, </span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><a href="https://twitter.com/jaybazuzi"><span style="color: #1155cc; font-family: "arial" , sans-serif;">Jay
Bazuzi</span></a></span></span><br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">TL;DR:</span></b><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<b><span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Bugs happen. While you could simply fix them, you could instead
take an extra step to prevent similar mistakes from occurring again. This
25-minute process will do that.</span></b><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">We will go in to the philosophies and reasons to do this in other
articles.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 20.0pt; mso-outline-level: 1;">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">1.
When to do it</span><b><span style="font-family: "times new roman" , serif; font-size: 24.0pt;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Do safeguarding right after you’ve fixed a bug. The same day or
next is good. This is when it’s fresh in your mind and when improving the
system still feels relevant.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">The key roles that need to be in the room are the people who:</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<ol start="1" style="margin-top: 0in;" type="1">
<li class="MsoNormal" style="color: black; mso-list: l3 level1 lfo1; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">understand
what happened and why<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l3 level1 lfo1; tab-stops: list .5in; vertical-align: baseline;"><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">wrote</span></b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;"> the bug<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l3 level1 lfo1; tab-stops: list .5in; vertical-align: baseline;"><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">detected</span></b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;"> the bug<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l3 level1 lfo1; tab-stops: list .5in; vertical-align: baseline;"><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">fixed</span></b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;"> the bug<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l3 level1 lfo1; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">project
manager (someone who can approve the time required to work on the fixes)<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l3 level1 lfo1; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">might
resist the proposed remediation <o:p></o:p></span></li>
</ol>
<div class="MsoNormal" style="margin-bottom: 12.0pt;">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">2. Root Cause Analysis (RCA)</span></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">We are going to gather impartial observations about what happened.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Create a Google Doc that everyone can access, with with the
following tree:</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style="color: black; mso-list: l2 level1 lfo2; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">What
caused us to write the bug?<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l2 level1 lfo2; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Why
didn’t it get caught sooner?<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l2 level1 lfo2; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">What
made it hard to fix?<o:p></o:p></span></li>
</ul>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Everybody is going to start adding nodes under these three
headings. They will also add questions in response to the nodes. All of this is
done at the same time by all attendees without any talking. </span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">This section is timeboxed to <b>10 minutes</b>.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">3. Vote</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">We will do a version of dot voting. Everyone will vote on as many
items as they want but no more than once per item. Voting is done by putting
your initials at the front of any item.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Example:</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<ul style="margin-top: 0in;" type="disc">
<li>What caused us to write the bug?</li>
<ul style="margin-top: 0in;" type="circle">
<li><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">[JW, LF] </span></b><span style="font-family: "arial" , sans-serif; font-size: 11pt;"> requirements
were unclear</span></li>
<li><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">[LF]</span></b><span style="font-family: "arial" , sans-serif; font-size: 11pt;"> Name of a
function lies about what it does.</span></li>
<ul style="margin-top: 0in;" type="square">
</ul>
</ul>
<li>Why didn’t it get caught right
away?</li>
<ul style="margin-top: 0in;" type="circle">
<li>No automated Tests</li>
<li><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">[JW]</span></b><span style="font-family: "arial" , sans-serif; font-size: 11pt;"> Hard to
write automated tests for this section of the code</span></li>
<ul style="margin-top: 0in;" type="square">
</ul>
</ul>
</ul>
<ul style="margin-top: 0in;" type="disc">
<li>What caused debugging time /
cost?</li>
<ul style="margin-top: 0in;" type="circle">
<li>Logs were too verbose, so we
didn’t see what was going wrong.</li>
<li><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">[JHB, JW] </span></b><span style="font-family: "arial" , sans-serif; font-size: 11pt;">Hard to
redeploy site</span></li>
<ul style="margin-top: 0in;" type="square">
</ul>
</ul>
</ul>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">After voting, copy the top 3-4 items into a section labeled: <b>Remedations</b></span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">This section is timeboxed to <b>3 minutes</b>.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">4. Budget</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "arial" , sans-serif;"><span style="font-size: 14.6667px;">Before we come up with solutions, start by asking: was the total impact of this bug small, medium, or large? Have everyone hold up 1, 2, or 3 fingers. Pick the most common answer. Then propose an initial time box:</span></span></div>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style="color: #333333; margin-top: 16.0pt; mso-list: l1 level1 lfo5; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 10.5pt;">Small = 1/2 person-day<o:p></o:p></span></li>
<li class="MsoNormal" style="color: #333333; mso-list: l1 level1 lfo5; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 10.5pt;">Medium = 2 person-days<o:p></o:p></span></li>
<li class="MsoNormal" style="color: #333333; mso-list: l1 level1 lfo5; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 10.5pt;">Large = person-sprint.<o:p></o:p></span></li>
</ul>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Since we execute
solutions immediately, this is the point where we need the approval of the
project manager.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Because we intend to do 3
solutions, each solution can only be ¼ of the total budget (to allow some
slack). This means that each item will be budgeted to:</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style="color: #333333; margin-top: 16.0pt; mso-list: l0 level1 lfo6; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 10.5pt;">Small = 1 hour<o:p></o:p></span></li>
<li class="MsoNormal" style="color: #333333; mso-list: l0 level1 lfo6; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 10.5pt;">Medium = 1/2 day<o:p></o:p></span></li>
<li class="MsoNormal" style="color: #333333; mso-list: l0 level1 lfo6; tab-stops: list .5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 10.5pt;">Large = 2.5 days<o:p></o:p></span></li>
</ul>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">This section is timeboxed to <b>2 minutes</b>.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 16.0pt; mso-outline-level: 1;">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">5.
Identify Remediations</span><b><span style="font-family: "times new roman" , serif; font-size: 24.0pt;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Next we are going to
brainstorm improvements to our system to reduce the chances of this issue
happening again. Going back to the Google Doc, everyone will silently add ideas
to the second section that we copied from the top brainstorming section.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Solutions that require
extra discipline are bad solutions. We are looking for ways to make success
easier.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Remember to keep in mind
these are timeboxed solutions meant to improve our system and environment as
opposed to solve everything. Often small improvements yield big returns and if
the problem still persists, we will get another chance to do a safeguarding in
the future.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Example </span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<ul style="margin-top: 0in;" type="disc">
<li class="MsoNormal" style="color: black; mso-list: l4 level1 lfo7; tab-stops: list .5in; vertical-align: baseline;"><b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Remediations</span></b><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;"><o:p></o:p></span></li>
<ul style="margin-top: 0in;" type="circle">
<li class="MsoNormal" style="color: black; mso-list: l4 level2 lfo7; tab-stops: list 1.0in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Requirements were unclear<o:p></o:p></span></li>
<ul style="margin-top: 0in;" type="square">
<li class="MsoNormal" style="color: black; mso-list: l4 level3 lfo7; tab-stops: list 1.5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Bring users into our grooming
sessions<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l4 level3 lfo7; tab-stops: list 1.5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Earlier usability tests<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l4 level3 lfo7; tab-stops: list 1.5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Do earlier demos<o:p></o:p></span></li>
</ul>
<li class="MsoNormal" style="color: black; mso-list: l4 level2 lfo7; tab-stops: list 1.0in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Hard to redeploy site<o:p></o:p></span></li>
<ul style="margin-top: 0in;" type="square">
<li class="MsoNormal" style="color: black; mso-list: l4 level3 lfo7; tab-stops: list 1.5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Write down checklist of
deployment steps<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l4 level3 lfo7; tab-stops: list 1.5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Automate build/test/upload
sequence<o:p></o:p></span></li>
<li class="MsoNormal" style="color: black; mso-list: l4 level3 lfo7; tab-stops: list 1.5in; vertical-align: baseline;"><span style="font-family: "arial" , sans-serif; font-size: 11.0pt;">Get a second server to deploy
blue/green<o:p></o:p></span></li>
</ul>
</ul>
</ul>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">After 7 minutes, everyone
votes again just as we did in the last section.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">This section is timeboxed to <b>10 minutes [7 brainstorming, 3
voting]</b>.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 16.0pt; mso-outline-level: 1;">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">6.
Add items to task board and <b>do them!</b></span><b><span style="font-family: "times new roman" , serif; font-size: 24.0pt;"><o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Because safeguarding
already has time approved work on them immediately.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-top: 16.0pt;">
<span style="color: #333333; font-family: "arial" , sans-serif; font-size: 10.5pt;">Nothing we’ve done so far
matters if we don’t implement any of the solutions. Make sure that useful
action comes from this exercise, immediately add them to the taskboard (budget
has already been approved in step 4) and start working on them. Remember that
these items are timeboxed and are not meant to <i>completely </i>prevent the
problems in the future, but rather to lessen the chances.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 16.0pt; mso-outline-level: 1;">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 20.0pt;">Final
Notes</span><b><span style="font-family: "times new roman" , serif; font-size: 24.0pt;"><o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">It is important to remember that safeguarding is a skill. The
first time you do it, be patient and give yourself extra time, maybe an hour.
Also, remember to practice it regularly, usually once per week, as you will get
better at doing the process and finding good remediations.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal" style="margin-bottom: 12.0pt;">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">Special Thanks to </span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><a href="https://twitter.com/arlobelshee"><span style="color: #1155cc; font-family: "arial" , sans-serif; font-size: 11.0pt;">Arlo Belshee</span></a></span><span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;"> for
creating Safeguarding.</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="color: black; font-family: "arial" , sans-serif; font-size: 11.0pt;">More at:</span><span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><a href="http://jay.bazuzi.com/Safeguarding/"><b><span style="color: #1155cc; font-family: "arial" , sans-serif; font-size: 11.0pt;">http://jay.bazuzi.com/Safeguarding/</span></b></a><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: "times new roman" , serif; mso-fareast-font-family: "Times New Roman";"><a href="http://arlobelshee.com/safeguarding-culture-is-a-process/"><b><span style="color: #1155cc; font-family: "arial" , sans-serif; font-size: 11.0pt;">http://arlobelshee.com/safeguarding-culture-is-a-process/</span></b></a><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<!--EndFragment--><br />Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-36231544973383724942017-08-15T09:14:00.000-07:002017-08-15T09:14:40.415-07:00Mindmap retrospectiveOne common way I do a quick retrospective after exercises to "burn the fuel of experience" is a observation retro. I first learned to do these via post-it notes and then grouping them into clusters based on similarity. I still like and do this method a lot but find myself doing a mindmap version very often because of the ease and iterative nature of it. This is a short write up on how to do one.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1d1JGgH3ty6sva9y0h0J1a6xbE7XrAPBqt20b4EIsbRzZkD_hON7T9tLg6i2VMIwvvt07AReG8fIEE7V9UkMncd7nv6svy2LkV3YtdVLdkQXxH_oRcLDjPeJ3EiY9DhmtBUm1WDdFJJXW/s1600/Screen+Shot+2017-08-15+at+11.47.01+AM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="736" data-original-width="1600" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1d1JGgH3ty6sva9y0h0J1a6xbE7XrAPBqt20b4EIsbRzZkD_hON7T9tLg6i2VMIwvvt07AReG8fIEE7V9UkMncd7nv6svy2LkV3YtdVLdkQXxH_oRcLDjPeJ3EiY9DhmtBUm1WDdFJJXW/s640/Screen+Shot+2017-08-15+at+11.47.01+AM.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mindmap from Agile2017 session "The ROI of Learning Hour"</td></tr>
</tbody></table>
<br />
<ol>
<li>Open a mind map<br />(I use <a href="http://mindmup.com/" target="_blank">mindmup</a> )</li>
<li>Label middle (blue) node</li>
<li>Collect observations from the audience </li>
<li>Add structure as needed</li>
</ol>
<h3>
Collecting Observations</h3>
<div>
<br /></div>
<div>
This is pretty simple. Ask for observations. When someone shouts them out add them to the mind map. It's ok to rephrase them, try to get them as short as possible (1-2 words) but if you can't add a whole sentence if needed. For example someone might say "the chart with urgent things getting in the way of important things" for which I would type up as "Important vs urgent"</div>
<div>
Another side note is to ask for "observations" rather than "learnings". This might seem small but it can make a large difference to the amount of feedback you get. Learnings can be intimidating and makes it seem like there are right and wrong answers.</div>
<div>
<br /></div>
<h3>
Adding Structure</h3>
<div>
Anytime I saw 2 or more concepts that had a similar base or extended an idea I would add that node and move around the map. I highlighted these examples in yellow above. This does a couple of things</div>
<div>
<ol>
<li>Calls out abstractions</li>
<li>Triggers more observations</li>
</ol>
You might notice I also added "thresholds" even though there was only 1 idea under it. Or that I didn't add small changes over time, but did extend the ideas of 300 pushups, micro habits & change blindness to it. </div>
<div>
<br /></div>
<div>
Abstractions also trigger variations. If we are looking at this blog post and someone points out the Labels, I could abstract it to fonts. In which case they might also point out the bold or normal fonts. But I could also abstract it to "Formatting' in which case I might get color (black, blue), Numeric lists, tabs, images and text justification. </div>
<div>
Either way more of the experiences is being inspected.</div>
<div>
<br /></div>
<div>
This process of adding structure to the observations is an interesting way of facilitating. Sort of reminds me of 'training from the back of the room' (although I am clearly at the front of the room during this)</div>
<div>
<br /></div>
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com1tag:blogger.com,1999:blog-6889884053798500413.post-30652199522954857872017-07-09T21:13:00.000-07:002017-07-09T21:13:17.700-07:00On InvestingA while back I started really looking into the math of compound interest. <a href="https://www.youtube.com/watch?v=1Bv1-6EX70s" target="_blank">I even made a video about it.</a> All of this got me thinking about my own financial investments. While I've always been good at saving I've never been that good about investing so I did a little reading and then ran an experiment: I took my money, divided it into thirds and tried out 3 investment ideas. I also setup a calendar alert for 1 year in the future to review the results. Today that calendar alert went off, here are the results.<br />
<br />
<h3>
Betterment</h3>
<a href="https://www.betterment.com/" target="_blank">Betterment</a> is a robot trader. The idea is to be like an index fund but a bit better. My results where the opposite. It was like an index fund but a bit worse. Still this isn't to say it was bad, just the that it always lagged a bit behind the index fund I bought.<br />
<br />
Results: 11.4%<br />
<br />
<br />
<h3>
S&P 500 Index Fund</h3>
<div>
<a href="https://investor.vanguard.com/home/" target="_blank">Vanguard's</a> S&P 500 index was a solid choice. Like Betterment it also has extremely low fee's and consistently gave slightly better results.</div>
<div>
<br /></div>
<div>
While it seemed almost the same, I would like to point out that results vary with compounding and the 1.5% difference over 40 years would add up. Let's take $1,000 for 40 years</div>
<div>
At 11.5% = $77,800</div>
<div>
At 13% = $132,781</div>
<div>
So 70% better over 40 years.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Results: 13%</div>
<br />
<h3>
Stocks</h3>
<div>
The remainder I split equally into 5 companies. This requires a fair amount of explanation, so I'll start with the basics and go into detail afterwards. The main takeaway here is that it's very volatile with swings as much as 10% in a given week. Compared to either betterment or vanguard this is a rather extreme change. I also feel there is just straight out a bunch of luck involved and that I might regret this at any moment. However, so far it's been the best investment of the three.</div>
<div>
<br /></div>
<div>
Results: 32.6%</div>
<div>
<br /></div>
<h3>
Stocks - My rationale/rationalization</h3>
<div>
I had a fairly simple investment philosophy: Invest long term in companies with smart people doing smart things.<br />
<br />
As such I bought 5 companies:<br />
<b>Facebook</b> - Impressed by developer culture, CI practices & the hiring of Kent Beck<br />
<b>Google</b> - Impressed by 20% time, Go, Kubernetes, AI and culture continuously refined by Larry Page<br />
<b>Amazon</b> - Impressed by microservices, continuous focus on market growth, and AWS<br />
<b>Netflix</b> - Impressed by Devops, open source, pivots and team cultures.<br />
<b>Tesla</b> - Impressed by the products and CI in cars (actually know very little about the company inside)<br />
<br />
I only bought once. Didn't do any day trading. Didn't do any financial investigation. This might seem a bit irresponsible, but my theory is that it's all a bit of gamble and I'm more likely to over value my understanding than gain real insight. I'm also not doing any market analyst of how the companies 'fit' into the bigger market. I'm simply trusting that smart people doing smart things is going to win.<br />
<br />
I would also like to state that I think I might have just gotten lucky. I think it's easy to fall prey to survival bias and assume that success is somehow predestine.<br />
<br />
The stocks make me a bit nervous, but I also realize that they have a much larger potential to generate real wealth; $1,000 for 40 years at 32.6% = $79,751,886<br />
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-75286966583516188322017-03-13T03:18:00.000-07:002020-01-12T21:43:40.489-08:00Why we did a speed meet at our conference and why you should too!<br />
At<a href="http://europeantestingconference.eu/2017/" target="_blank"> European Testing Conference 2017</a>, we had a full session devoted to a speed meet.
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-12VA_mGjrBX5LDDb43Cf4SerYzVFu49ovyt6MmU8M81c04rlx1jAi9jG1r6LmJoK9r6YajKZI_Rd76gBaT8NEjQg6MXyo8_J1Y_CYGTerzZKM-ux7rvFrqSxEjMC6mWICv0qT8Sjfjm6/s1600/Screen+Shot+2017-03-09+at+7.09.51+PM.png" imageanchor="1"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-12VA_mGjrBX5LDDb43Cf4SerYzVFu49ovyt6MmU8M81c04rlx1jAi9jG1r6LmJoK9r6YajKZI_Rd76gBaT8NEjQg6MXyo8_J1Y_CYGTerzZKM-ux7rvFrqSxEjMC6mWICv0qT8Sjfjm6/s640/Screen+Shot+2017-03-09+at+7.09.51+PM.png" width="640" /></a> <br />
<br />
What is a speed meet? At its most basic it's talking to someone new for 5 minutes, then rotating and doing it again 9 times.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK41BWrXtbGRhESLLVNMrmLWLfLyzA-03XvY150GLTPSeh7yOVapzrXkRgyN5GmiPvrTJ1zeyROr_4jKokhbnmqZLW-1yH7et312pRIhfnGtsAwmk2dTLtKLfdVLJrNDv4zPE7c0sd9kQP/s1600/Screen+Shot+2017-03-09+at+7.20.57+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK41BWrXtbGRhESLLVNMrmLWLfLyzA-03XvY150GLTPSeh7yOVapzrXkRgyN5GmiPvrTJ1zeyROr_4jKokhbnmqZLW-1yH7et312pRIhfnGtsAwmk2dTLtKLfdVLJrNDv4zPE7c0sd9kQP/s640/Screen+Shot+2017-03-09+at+7.20.57+PM.png" width="640" /></a></div>
Here's what it looked like:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAwluiuwadXxv-ZCWqGgysUzZWm6v97I3QUL70zv2HI-ivrkg074c5rDoITr3MOgxXl-yxRFPNrZpng0jfyAPoh2YCTBCqUG0q_Kcm8wqE1qdnCyaqY4E50rCbrpdj6-GpyP1TOCWX7vYR/s1600/Photo-by-Daniel-Schildt-_MG_2210.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAwluiuwadXxv-ZCWqGgysUzZWm6v97I3QUL70zv2HI-ivrkg074c5rDoITr3MOgxXl-yxRFPNrZpng0jfyAPoh2YCTBCqUG0q_Kcm8wqE1qdnCyaqY4E50rCbrpdj6-GpyP1TOCWX7vYR/s320/Photo-by-Daniel-Schildt-_MG_2210.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl5AMkfzmMyVPvzme-eMG9IZ1b233fUr7L24xpNzaxaYIP0SKMIggRWfsn6G5IYfWVtiV0n3Y4Z9GSbsJnqyfvty_vSd5SLRQnubMeCzZSLQsdWOsbWspNmH7ihzAyswOCbnBpB701R-JV/s1600/Photo-by-Daniel-Schildt-_MG_2141.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl5AMkfzmMyVPvzme-eMG9IZ1b233fUr7L24xpNzaxaYIP0SKMIggRWfsn6G5IYfWVtiV0n3Y4Z9GSbsJnqyfvty_vSd5SLRQnubMeCzZSLQsdWOsbWspNmH7ihzAyswOCbnBpB701R-JV/s320/Photo-by-Daniel-Schildt-_MG_2141.jpg" width="211" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkEL-92Vn5Rsshk4uu8fZcBqjrsLr-mWyk9WtLrJDCgEnJ-goUEs2bqblzzZJjdO5Z2U0iBMiiZmO78nkCbk6WrCtANKOZgoge-HZ2uwpavgd1SJaq81QYB6h6ni5veyMF_pLR5zApwxy6/s1600/Photo-by-Daniel-Schildt-_MG_2194.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkEL-92Vn5Rsshk4uu8fZcBqjrsLr-mWyk9WtLrJDCgEnJ-goUEs2bqblzzZJjdO5Z2U0iBMiiZmO78nkCbk6WrCtANKOZgoge-HZ2uwpavgd1SJaq81QYB6h6ni5veyMF_pLR5zApwxy6/s320/Photo-by-Daniel-Schildt-_MG_2194.jpg" width="213" /></a></div>
<h2>
<br />Mind Maps: What do you talk about?</h2>
<div>
Of course this raises the question of what to talk about? To solve this, we took a suggestion from Jurgen Appelo and had everyone make a small mindmap about themselves. When you sat down you handed your map to the other person. Therre is a lot of information between the 2 mind maps and people would easily find something that they were interested in. And this is the rather amazing thing about geeks; </div>
<h4>
<div style="text-align: center;">
5 minutes <span style="font-weight: normal;">to make </span>small talk <span style="font-weight: normal;">is </span>terrifying <span style="font-weight: normal;">for geeks.</span></div>
<div style="text-align: center;">
<span style="font-weight: normal;">Given a topic they care about</span> 5 hours isn't enough <span style="font-weight: normal;">time</span></div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;">Here's an example of one of the participants mind maps:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwbI6H_l52ShbGLAI244JRrBMvfcYECJADv8Sj8kYnDmOsJ0_0nKuxVzV8mHS3vDSO1Cznq-AaPjqqrEOrjuW0HSgr_k5GajBZu0v2pAhyphenhyphenHu7GAxzOPw0ltHUgSo3FfLeCxiGqD5YdF_aT/s1600/Matt+Mindmap+ETC+2017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwbI6H_l52ShbGLAI244JRrBMvfcYECJADv8Sj8kYnDmOsJ0_0nKuxVzV8mHS3vDSO1Cznq-AaPjqqrEOrjuW0HSgr_k5GajBZu0v2pAhyphenhyphenHu7GAxzOPw0ltHUgSo3FfLeCxiGqD5YdF_aT/s400/Matt+Mindmap+ETC+2017.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</h4>
<h2 style="clear: both; text-align: left;">
Why do this?</h2>
<div>
<span style="font-weight: normal;">Conferences are amazing places. It's a great opportunity to mix and talk with many people you wouldn't normally get a chance to interact with. However, if you are new to a conference this can be a overwhelming and terrifying prospect. While most people are friendly after you meet them, strangers never seem that way. We wanted to make it easier to have a good 'hallway track'. After talking to 9 people everyone had at found at least 1 person they liked. The conference became a lot more friendly. We also heard more things like:</span></div>
<div>
<span style="font-weight: normal;"><br /></span></div>
<h4 style="text-align: center;">
"Kara! Have you met Matt?"</h4>
<div>
<br /></div>
<h2>
Lunch</h2>
<div>
<span style="font-weight: normal;">Lunch time can be especially uncomfortable if you don't know anyone at a conference. Finding a place when every table is full of strangers already talking? Often we can just try to find a place to hide away and eat quietly. This is why we did the speed met in the morning the first day of the conference. Lunch was right afterwards, and it was nice to know at least 1 person to eat with.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_dK-tidzuo87wmQnB0y-ANrG9-42E17dm49gsoYZISAWCI802Coa5V4PTCTbffQVKK2ugfuZmI7V94X1yXoaFiHR-HczREBq7femqBilchxZLk5c0V_XVfnvRhp2JFpfZluLZZsGM6J9P/s1600/Photo-by-Daniel-Schildt-_MG_2224.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_dK-tidzuo87wmQnB0y-ANrG9-42E17dm49gsoYZISAWCI802Coa5V4PTCTbffQVKK2ugfuZmI7V94X1yXoaFiHR-HczREBq7femqBilchxZLk5c0V_XVfnvRhp2JFpfZluLZZsGM6J9P/s320/Photo-by-Daniel-Schildt-_MG_2224.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-weight: normal;">lunch should be</span> friendly, <span style="font-weight: normal;">not</span> scary</div>
<div>
</div>
<div>
<span style="font-weight: normal;"><br /></span></div>
<h2>
Details:</h2>
<div>
<h4>
<span style="font-weight: normal;">Just do it</span></h4>
<span style="font-weight: normal;">Structure and lack of choice is your friend here. Notice that while we normally had 3 tracks, we only had 1 during the speed meet. We didn't want to encourage people to skip it. We also spoke to the speakers to encourage them to participate. It can be a special treat for a newbie to get a chance to speak 1 on 1 with a presenter. </span><br />
<span style="font-weight: normal;">We also didn't do it as an 'optional' morning session. These sessions usually have a very low percentage of the conference attending. For example, many conferences have a lean coffee morning session. But, for a 1000 person conference it isn't unusual to have 20-30 people at these. </span><br />
<span style="font-weight: normal;"><br /></span>
<br />
<h4>
Homework</h4>
<span style="font-weight: normal;">We gave multiple chances to create the mind maps beforehand </span><br />
<br />
<ul>
<li>Emailed the day before conference</li>
<li>Mentioned at Speakers dinner</li>
<li>Mentioned in opening slides for the conference</li>
</ul>
<div>
Nonetheless, there are still a bunch of people that put theirs together as the sessions started. That's ok, it's meant to be quick and easy. We provided lots of paper and pens.</div>
<div>
<br /></div>
<div>
<h4>
<span style="font-weight: normal;">Rotations</span></h4>
</div>
<div>
I highly suggest a few (4-5) practice rounds of moving 1 seat to the left. It's amazing that if you wait for the seat next to you to become empty ( X 150 people) this can take a few minutes to move people. If everyone stands, moves & sits it takes 3 seconds. </div>
<div>
<br /></div>
<div>
<h4>
<span style="font-weight: normal;">Early</span></h4>
</div>
<div>
This sets the tone for the conference. Do it early, not at the end of the conference.</div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h2>
How did it work out?</h2>
</div>
<div>
Excellence! It can be hard to judge the effectiveness of an activity. We do a retrospective and we got many notes about liking it, but is liking it the same as it being good? Maybe they just remember it because it was different?<br />
I had a bit of an advantage as this is the second year for ETC and we could compare it to last year. I also have all the other conference I attend to compare it with.<br />
However, the biggest indicator for me was the party the first night. While it's hard to articulate, it just felt friendlier. People moved between tables more, talked more. The whole atmosphere felt warmer. </div>
<div>
<br /></div>
<div>
10 / 10 Would repeat!</div>
<div style="text-align: left;">
<span style="font-weight: normal;"><br /></span></div>
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com6tag:blogger.com,1999:blog-6889884053798500413.post-74696527058952080342017-02-01T23:50:00.000-08:002017-02-01T23:50:40.960-08:00Thoughts on conference design <div class="MsoNormal">
Next week is the <a href="http://europeantestingconference.eu/2017/" target="_blank">European Testing Conference</a>.<span style="font-size: 12pt;"> </span></div>
<div class="MsoNormal">
We do a lot of things to make this conference better </div>
<div class="MsoNormal">
<br /></div>
<blockquote class="tr_bq" style="font-size: medium;">
<o:p><br /></o:p><a href="http://europeantestingconference.eu/2017/" target="_blank">European Testing Conference</a><br />Feb 9<sup>th</sup> & 10<sup>th</sup> (Pre-conference Trainings on the 8<sup>th</sup>)<br />Helsinki, Finland<br />25% off discount code: FRIENDSOFLLEW</blockquote>
<div class="MsoNormal" style="font-size: medium;">
<o:p></o:p></div>
<div class="MsoNormal" style="font-size: medium;">
<o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Here are some of the things we do to make a better
conference for the attendees:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoListParagraph" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<!--[if !supportLists]--><span style="mso-bidi-font-family: Cambria; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Cambria; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">1)<span style="font: 7.0pt "Times New Roman";">
</span></span></span><!--[endif]-->Facilitate meeting other people<o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .25in;">
We all know that one of the best
parts of conferences is the people you meet but it can be hard to strike up a
conversation with complete strangers.<span style="mso-spacerun: yes;"> </span><o:p></o:p></div>
<div class="MsoNormal" style="margin-left: .25in;">
Knowing this, we set up 2 events
structured to introduce you to new people.<o:p></o:p></div>
<div class="MsoListParagraphCxSpFirst" style="mso-list: l0 level1 lfo2; text-indent: -.25in;">
<!--[if !supportLists]--><span style="mso-bidi-font-family: Cambria; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Cambria; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">a)<span style="font: 7.0pt "Times New Roman";"> <a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">
</a></span></span></span><!--[endif]--><a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">Speed Meeting</a>:<br />
This occurs at 11:00 the first day and is the only session at that time. The
whole conference sits and talks to a new person for 5 minutes. Then rotates and
does it again. 45 minutes later, you have talked to 9 new people. Sometimes
that is enough to help you find the right person, sometimes it’s one of friends
of those 12 that you get introduced to. Either way the conference becomes a lot
friendlier afterwards.<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="mso-list: l0 level1 lfo2; text-indent: -.25in;">
<!--[if !supportLists]--><span style="mso-bidi-font-family: Cambria; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Cambria; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">b)<span style="font: 7.0pt "Times New Roman";"> <a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">
</a></span></span></span><!--[endif]--><a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">Facilitated Discussion</a><br />
Later that day we will do on other 45 minutes of round table discussions (8
people per table). This will follow the lean coffee format and allows people to
talk about the subjects they are interested in with each other. It is also a
chance to speak with the speakers your are interested in, as each speaker will
facilitate one table.<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle">
<br /></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<!--[if !supportLists]--><span style="mso-bidi-font-family: Cambria; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Cambria; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">2)<span style="font: 7.0pt "Times New Roman";">
</span></span></span><!--[endif]--><a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">Workshops</a><br />
One of the challenging things about workshops is it’s hard to actually go to
them when there is the easier choice of just listening to a talk. The lazy part
of us wins out so much of the time despite our best intentions. Know this, when
never run the workshops sessions at the same time as normal lecture sessions.
So you don’t have to decide *if* you do some hands on learning, you only have
to decide which one you want to do.<o:p></o:p></div>
<div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto;">
<br /></div>
<div class="MsoListParagraphCxSpLast" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo1; text-indent: -.25in;">
<!--[if !supportLists]--><span style="mso-bidi-font-family: Cambria; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: Cambria; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">3)<span style="font: 7.0pt "Times New Roman";"> <a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">
</a></span></span></span><!--[endif]--><a href="http://europeantestingconference.eu/2017/schedule/" target="_blank">Hallway track</a><br />
Meeting new people and doing hands on learning has a way of stirring up ideas.
Many experienced conference goers talk about the ‘Hallway Track’ as valuable
part of conferences but new people often are let out on this aspect. Knowing
this, at 14:15 on the last day, we set aside 3 sessions of open space, where
you can announce the topics you’re interested in and then hold mini-sessions
with like minded people. This helps in ensure everybody gets the most out of
the new ideas they have had.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
We hope you agree that these steps help to create a better conference
and hope to see you there!<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
We also do a lot to make it better for the speakers, but that's another blog post.</div>
<div class="MsoNormal">
<br /></div>
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>0</o:Revision>
<o:TotalTime>0</o:TotalTime>
<o:Pages>1</o:Pages>
<o:Words>422</o:Words>
<o:Characters>2408</o:Characters>
<o:Company>Spun Laboratories </o:Company>
<o:Lines>20</o:Lines>
<o:Paragraphs>5</o:Paragraphs>
<o:CharactersWithSpaces>2825</o:CharactersWithSpaces>
<o:Version>14.0</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>JA</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="276">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 134676480 16 0 131072 0;}
@font-face
{font-family:"MS 明朝";
mso-font-charset:78;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:1 134676480 16 0 131072 0;}
@font-face
{font-family:Cambria;
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:-536870145 1073743103 0 0 415 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
mso-style-unhide:no;
mso-style-qformat:yes;
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
mso-add-space:auto;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst
{mso-style-priority:34;
mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-type:export-only;
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
mso-add-space:auto;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle
{mso-style-priority:34;
mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-type:export-only;
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
mso-add-space:auto;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast
{mso-style-priority:34;
mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-type:export-only;
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
mso-add-space:auto;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"MS 明朝";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:1390881836;
mso-list-type:hybrid;
mso-list-template-ids:-2075644766 67698711 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-number-format:alpha-lower;
mso-level-text:"%1\)";
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-.25in;}
@list l0:level2
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-.25in;}
@list l0:level3
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level4
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-.25in;}
@list l0:level5
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-.25in;}
@list l0:level6
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l0:level7
{mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-.25in;}
@list l0:level8
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-.25in;}
@list l0:level9
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
text-indent:-9.0pt;}
@list l1
{mso-list-id:2009558058;
mso-list-type:hybrid;
mso-list-template-ids:-744320410 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
{mso-level-text:"%1\)";
mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:.25in;
text-indent:-.25in;}
@list l1:level2
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:.75in;
text-indent:-.25in;}
@list l1:level3
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
margin-left:1.25in;
text-indent:-9.0pt;}
@list l1:level4
{mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:1.75in;
text-indent:-.25in;}
@list l1:level5
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:2.25in;
text-indent:-.25in;}
@list l1:level6
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
margin-left:2.75in;
text-indent:-9.0pt;}
@list l1:level7
{mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:3.25in;
text-indent:-.25in;}
@list l1:level8
{mso-level-number-format:alpha-lower;
mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:3.75in;
text-indent:-.25in;}
@list l1:level9
{mso-level-number-format:roman-lower;
mso-level-tab-stop:none;
mso-level-number-position:right;
margin-left:4.25in;
text-indent:-9.0pt;}
ol
{margin-bottom:0in;}
ul
{margin-bottom:0in;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:Cambria;
mso-ascii-font-family:Cambria;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Cambria;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->
<!--StartFragment-->
<!--EndFragment--><br />
<div class="MsoListParagraph">
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com1tag:blogger.com,1999:blog-6889884053798500413.post-616908395377557022017-01-09T21:53:00.003-08:002017-01-09T21:59:11.281-08:00Is there a perfect API Design?<h2>
Part I:The Problem</h2>
<br />
I write a verification framework called <a href="http://approvaltests./">ApprovalTests.</a> It uses itself to test itself and is generally bug free. So when exploratory tester extraordinaire <a href="https://twitter.com/maaretp" target="_blank">Maaret Pyhäjärvi </a>wanted to use it as a test target we were both rather excited. I was excited to show off how good automated testing and TDD can be. She was excited to show off how much it still failed to cover.<br />
<br />
She won.<br />
<br />
To be clear, the stuff I tested was pretty solid. However, I was woefully incomplete on the system as a whole. A mere hour of testing discovered gaping holes in different environments, documentation and onboarding of new users, and usability issues with my API.<br />
<br />
These are hard problems, many of them still haven't been solved and I wanted to talk about one in particular that I am still struggling with today:<br />
<br />
<h3>
Naming</h3>
<br />
I use something called reporters and annotations in ApprovalTests. It means you can write code like<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: large;">[<b><span style="color: #76a5af;">UseReporter</span></b>(<span style="color: blue;">typeof</span>(<b><span style="color: #76a5af;">DiffReporter</span></b>))]</span><br />
<br />
The issue was in discoverability. If you start typing this you get very little help from your editor:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC9y051uCr7nSkgyg0djAIQmVe-aUl6WW_3fw0WnCKY5tmpO5_vsmqBIrmeRMq5Nbxfu9YzzZ1cayAZfi1i5VdRaN8OC90Gfm3usRY5dDFlhx14b2Qgp0p86QYYeP5NbrigK6507z-9Eqf/s1600/Screen+Shot+2017-01-10+at+6.47.42+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC9y051uCr7nSkgyg0djAIQmVe-aUl6WW_3fw0WnCKY5tmpO5_vsmqBIrmeRMq5Nbxfu9YzzZ1cayAZfi1i5VdRaN8OC90Gfm3usRY5dDFlhx14b2Qgp0p86QYYeP5NbrigK6507z-9Eqf/s640/Screen+Shot+2017-01-10+at+6.47.42+AM.png" width="640" /></a></div>
<br />
You get some other reporters [KDiff, Tortoise] but not many and these happen to be useless and DiffReporter will use them if they exist on your system anyways.<br />
<br />
If you typed "Reporter" instead this goes away and the over 50 options will present themselves to you, but it's not intuitive to this and a few painful usability tests showed this to me over and over as I watch is silence and frustration.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN-htZZTwelLrl8eIlfi7s87ThJnwBR6VXIByhyphenhyphenWy8Tiw4vA8Lzj16qswVhWsn7H6miJcjObkaOjkUfM2i0DkRad9LU5HFI_TAR6iu0343RwNIATSvuRFqxowTUwL6aXmDwE-23Jd9gQee/s1600/Screen+Shot+2017-01-10+at+6.49.42+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN-htZZTwelLrl8eIlfi7s87ThJnwBR6VXIByhyphenhyphenWy8Tiw4vA8Lzj16qswVhWsn7H6miJcjObkaOjkUfM2i0DkRad9LU5HFI_TAR6iu0343RwNIATSvuRFqxowTUwL6aXmDwE-23Jd9gQee/s640/Screen+Shot+2017-01-10+at+6.49.42+AM.png" width="640" /></a></div>
<br />
<br />
Renaming can fix this<br />
<br />
<span style="background-color: #f5f8fa; color: #292f33; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;"><span style="color: black; font-family: "courier new" , "courier" , monospace; font-size: large; white-space: normal;">[</span><b style="color: black; font-family: "Courier New", Courier, monospace; font-size: x-large; white-space: normal;"><span style="color: #76a5af;">OnFailure</span></b><span style="color: black; font-family: "courier new" , "courier" , monospace; font-size: large; white-space: normal;">(</span><span style="color: blue; font-family: "courier new" , "courier" , monospace; font-size: large; white-space: normal;">typeof</span><span style="color: black; font-family: "courier new" , "courier" , monospace; font-size: large; white-space: normal;">(</span><b style="color: black; font-family: "Courier New", Courier, monospace; font-size: x-large; white-space: normal;"><span style="color: #76a5af;">ReportWithDiffTool</span></b><span style="color: black; font-family: "courier new" , "courier" , monospace; font-size: large; white-space: normal;">))]</span></span><br />
<span style="background-color: #f5f8fa; color: #292f33; font-family: "helvetica neue" , "helvetica" , "arial" , sans-serif; font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="font-size: 14px; white-space: pre-wrap;">I ran an online poll, most people preferred this. 70% vs the 30% that preferred the previous version. </span><br />
<span style="font-size: 14px; white-space: pre-wrap;">I think I'm in the 30%, I prefer my classes to have Noun names, but I might be partial because this is what I'm used to.</span><br />
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="font-size: 14px; white-space: pre-wrap;">So I'm faced with changing a lot of the API. </span><br />
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="font-size: 14px; white-space: pre-wrap;">The issue is:</span><br />
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span>
<br />
<h4 style="text-align: center;">
<span style="font-size: 14px; white-space: pre-wrap;">How do I know which one is the right answer?</span></h4>
<h4 style="text-align: center;">
<span style="font-size: 14px; white-space: pre-wrap;"> </span><span style="font-size: 14px; white-space: pre-wrap;">How do I know there *is* a right answer?</span></h4>
<h2>
<br />Part II: 2 Pepsis and the world of choice</h2>
<a href="https://www.ted.com/talks/malcolm_gladwell_on_spaghetti_sauce">Malcolm Gladwell did a great Ted Talk on choice.</a> In it he talks about a taste test to find the perfect sweetness for Pepsi. There were 2 peaks, so they averaged them out, but this isn't the right answer, the right answer is there are 2 preferences for sweetness. Because of this as a culture we have changed from a single 'perfect' spaghetti sauce to an aisle of choices<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioMq0ZktIP2E-M8pZ6tn4i5ISqU_ArVbcjMUWfVU_C6qN7wPqBymjEPxkygrM5QoXRyms6yTumwDocxA6z2yhPtmcmoQlhnpGuI8TteWY_8VbhQgrMAVaefAI-6DsZTwIfwPxPc3I6J6w4/s1600/wall_of_spaghetti_sauce1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="470" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioMq0ZktIP2E-M8pZ6tn4i5ISqU_ArVbcjMUWfVU_C6qN7wPqBymjEPxkygrM5QoXRyms6yTumwDocxA6z2yhPtmcmoQlhnpGuI8TteWY_8VbhQgrMAVaefAI-6DsZTwIfwPxPc3I6J6w4/s640/wall_of_spaghetti_sauce1.jpg" width="640" /></a></div>
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span><span style="font-size: 14px; white-space: pre-wrap;">Maybe we should have the same occur with API's?</span><br />
<span style="font-size: 14px; white-space: pre-wrap;">Maybe the issue isn't to have either UseReporter or OnFailure. Maybe I need to have both.</span><br />
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="font-size: 14px; white-space: pre-wrap;">This requires a bit of finesse. I don't yet have answers on how to version and package these solutions.</span><br />
<span style="font-size: 14px; white-space: pre-wrap;">Should they be in separate nuget packages? Should they interplay with each other?</span><br />
<span style="font-size: 14px; white-space: pre-wrap;">How to I balance having a clear way with <a href="https://en.wikipedia.org/wiki/Analysis_paralysis" target="_blank">choice paralysis</a>.</span><br />
<span style="font-size: 14px; white-space: pre-wrap;"><br /></span>
<span style="font-size: 14px; white-space: pre-wrap;">I don't know the answers to these questions, but I am beginning to see that maybe there isn't the one perfect API...</span>Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com2tag:blogger.com,1999:blog-6889884053798500413.post-88359368798999990612016-07-30T03:51:00.000-07:002016-07-30T03:51:00.833-07:005 ways to do Decision trees in C#At <a href="https://www.agilealliance.org/agile2016/" target="_blank">Agile2016 </a>we spent the mornings doing <a href="https://leanpub.com/mobprogrammingguidebook" target="_blank">Mob Programming</a> working on the <a href="https://github.com/emilybache/Tennis-Refactoring-Kata" target="_blank">Tennis Refactoring Kata</a> from<a href="https://twitter.com/emilybache" target="_blank"> Emily Bache</a>.<br />
<br />
Thursday we ran accross this issue:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhESD-sRORTupB_lbBS0ZfiqGVB7GhAy_0kzs42WqWUYDptusw36keQzS0eWqYgzLUEktPwCE4r-FDM4Rzy9uF9bjUo9c9Nk2aai0trPNXoFJlKA8kdXwyNW1Yzhi9AjB4e769bhKwped7/s1600/Screen+Shot+2016-07-30+at+6.13.05+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhESD-sRORTupB_lbBS0ZfiqGVB7GhAy_0kzs42WqWUYDptusw36keQzS0eWqYgzLUEktPwCE4r-FDM4Rzy9uF9bjUo9c9Nk2aai0trPNXoFJlKA8kdXwyNW1Yzhi9AjB4e769bhKwped7/s640/Screen+Shot+2016-07-30+at+6.13.05+AM.png" width="640" /></a></div>
<h2>
#1. If Structure</h2>
This is fairly easy to code as is, the trouble is it looks horrible:<br />
<br />
<script src="https://gist.github.com/isidore/038dcf92a6f3d40afd3e055eee9dbc7c.js"></script>
So we started to play around with alternative structures...<br />
<h2>
<br />#2. Pass in result</h2>
One solution is to call all the methods but abort early if you've already found a solution.<br />
<script src="https://gist.github.com/isidore/323f89491e869e22529ab4a1945bda1b.js"></script>
This looks a lot nicer, the problem is it leaks into the underlying methods<br />
<script src="https://gist.github.com/isidore/8636fd80b0bbd584157c53826988329e.js"></script>
So we keep looking..<br />
<br />
<h2>
#3. Linq</h2>
<div>
If you like linq you can solve this with a bit of functional code</div>
<div>
<br /></div>
<script src="https://gist.github.com/isidore/78c61f790ac304b622ab55e9df84e07f.js"></script>
<br />
<div>
This reads nicely, but is a bit confusing as to why it works and means all your methods must not use any parameters.<br />
<br />
but It can also be used with the yield keyword, which is neat and allows parameters but splits logic.<br />
<script src="https://gist.github.com/isidore/e821db16b14ce5514986939038070b35.js"></script>
so we kept looking...<br />
<br />
<h2>
#4. Do If Null</h2>
We were able to get closer to the 'Pass in result' without leaking with the addition of an extension method.<br />
<script src="https://gist.github.com/isidore/f55c5455a2de28e483fef7f09b881dde.js"></script>
at this point someone pointed out the ?? operator...<br />
<br />
<h2>
#5. ?? Operator</h2>
The ( a ?? b ) operator says if a is null do b. The resulting code is rather nice<br />
<script src="https://gist.github.com/isidore/3cf1087fe8bd237575ab1d2234860f89.js"></script>
It's worth noting that if your language has 'truthiness' (like javascript) you can also do this with the or (||) operator<br />
<br />
<br />
<script src="https://gist.github.com/isidore/6a48b6dd7febc6385206492b0e45b020.js"></script>
</div>
<h2>
Which is Best?</h2>
<div>
Of course that's up to you. For us most liked the ?? operator best, while a few thought the Linq solution was the nicest. <br /><br />Which one do you like? </div>
<br />Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com4tag:blogger.com,1999:blog-6889884053798500413.post-19255303346044382972016-06-15T06:39:00.001-07:002016-06-15T06:39:05.174-07:00Interview with Bryan Beecham about Pairing w/me the first timeI put a interview <a href="http://visible-quality.blogspot.fi/" target="_blank">Maaret</a> recorded with <a href="https://twitter.com/BillyGarnet" target="_blank">Bryan Beecham</a> online yesterday.<br />
It's about the first time Bryan paired with me using <a href="http://llewellynfalco.blogspot.fi/2014/06/llewellyns-strong-style-pairing.html" target="_blank">Strong-Style Pairing</a>.<br />
<br />
<h3>
Here's the video:</h3>
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/T39EOU9pn2Y" width="420"></iframe>
<h4>
and the Transcript:</h4>
<span style="font-family: Courier New, Courier, monospace;"> So the first time i met llewellyn I was in a session at an agile conference.</span><span style="font-family: "Courier New", Courier, monospace;"> They were talking about a developer and tester pairing and the benefits of that</span><span style="font-family: "Courier New", Courier, monospace;"> and it was a great session and the really cool thing was that it was very hands on </span><span style="font-family: "Courier New", Courier, monospace;">so I ended up pairing at a table and I had this guy. This guy there with like kinda a little cocky </span><span style="font-family: "Courier New", Courier, monospace;">he's got blue hair and I'm pairing with him. </span><span style="font-family: "Courier New", Courier, monospace;">And I'm like great, I'll learn. I know how to code a bit... but we are using eclipse (i think) </span><span style="font-family: "Courier New", Courier, monospace;">and I don't know eclipse that well...</span><span style="font-family: "Courier New", Courier, monospace;"> and he asked me that, maybe he noticed my hesitation and he said how well do you know this IDE?</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> and I said "ah, it's not my thing"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> and he said "that's ok, because I'm going to tell you what to type."</span><br />
<span style="font-family: Courier New, Courier, monospace;"> and I thought maybe he thinks I'm new to pair programming or something and I don't know about this</span><span style="font-family: "Courier New", Courier, monospace;"> but no, I was in for a whole new world of understanding because the person, who turned out to be llewellyn,</span><span style="font-family: "Courier New", Courier, monospace;"> introduced me to some, I guess now it's been modified to strong pairing which has some other meanings to it,</span><span style="font-family: "Courier New", Courier, monospace;"> but he told me what to do and told me what to type and when you think</span><span style="font-family: "Courier New", Courier, monospace;"> </span><br />
<span style="font-family: "Courier New", Courier, monospace;"> oh yeah, type something very high high level, but no he was telling me on a very</span><span style="font-family: "Courier New", Courier, monospace;"> low level of type this word. press enter press semicolon you need a curly brace</span><span style="font-family: "Courier New", Courier, monospace;"> there and I was not allowed to use the mouse it's like no, no no no it's</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> ctrl+shift+r</span><br />
<span style="font-family: Courier New, Courier, monospace;"> ctrl+shift+m </span><br />
<span style="font-family: Courier New, Courier, monospace;"> alt+r for that</span><br />
<span style="font-family: Courier New, Courier, monospace;">and word by word, </span><span style="font-family: "Courier New", Courier, monospace;">but I'm like 'keep it cool' 'keep it cool' because inside i'm about to boil over</span><span style="font-family: "Courier New", Courier, monospace;"> and just be furious, right, but then I noticed something was happening.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> I was noticing that I started to know what extract method was I started to pickup on somethings</span><span style="font-family: "Courier New", Courier, monospace;"> I started to understand the syntax better</span><span style="font-family: "Courier New", Courier, monospace;"> and his language started changing as this happened and he started talking</span><span style="font-family: "Courier New", Courier, monospace;"> at a more abstract level and his instructions got moved to a higher level</span><span style="font-family: "Courier New", Courier, monospace;"> and we were actually picking up speed and I was like 'holy smokes</span><span style="font-family: "Courier New", Courier, monospace;"> there's something to this' so although he's like completely obnoxious</span><span style="font-family: "Courier New", Courier, monospace;"> and annoying at first that there's really something here.</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><br /></span>
<span style="font-family: "Courier New", Courier, monospace;"> So I that was my introduction to Llewellyn and I would like to say</span><span style="font-family: Courier New, Courier, monospace;"> that as this point I feel like he is becoming a very good good friend of mine </span><br />
<div>
<br /></div>
<br />Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-10825851102555944382016-06-03T03:25:00.000-07:002016-06-03T03:29:09.267-07:00Using intellisense for documentationA few days ago I created an open <a href="https://github.com/LearnWithLlew/EclipseTips" target="_blank">source project called EclipseTips </a>with help from <a href="https://twitter.com/rinkkasatiainen" target="_blank">Aki Salmi</a><br />
<br />
It's a small jar that has classes without implementation that provide useful cheat sheet hints while you are working.<br />
<br />
Here's what it looks like<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_jMOdN6pFwszwj8zhxizfwWv00JsvPq36O08IvOCr6aagHHnjl5gmfkOuThFBlfhQpWw9Nz2eitVEsA0j4ZC4trgWtVl2N7SRInYCBubHzM6mv50UAKthWsrGbrDYLK-IFRfOWZ64da6F/s1600/example_screen_shot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_jMOdN6pFwszwj8zhxizfwWv00JsvPq36O08IvOCr6aagHHnjl5gmfkOuThFBlfhQpWw9Nz2eitVEsA0j4ZC4trgWtVl2N7SRInYCBubHzM6mv50UAKthWsrGbrDYLK-IFRfOWZ64da6F/s640/example_screen_shot.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The really interesting thing about this is it is a hack about using editor inline help solely for the purposes of help. This is something I have not seen done before.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Keep in mind that these java classes serve no purpose other than to provide documentation.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Because this is a new area, I wanted to share some lessons learned as well as places I think this could be expanded to.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 style="clear: both; text-align: left;">
Lessons Learned from version 1</h2>
<h3>
Hack then Generate</h3>
<div>
Javadocs is a reasonable place to add documentation when coding, but it is not a good place write real documentation. Once you get the general idea and a few working prototypes, you are going to want to create a way to generate the documentation classes. </div>
<div>
<br /></div>
<div>
For example, here's how we created the Completions Tips data. We then generated both the mac and windows tip objects from here.</div>
<div>
<br /></div>
<script src="https://gist.github.com/anonymous/3e8eb61253b4ba8c3f47d6131f37796c.js"></script>
<br />
<div>
<br /></div>
<div>
You can take a full look at the <a href="https://github.com/LearnWithLlew/EclipseTips/blob/master/src/test/java/eclipse_tips/generation/TipsGeneration.java" target="_blank">generation process here.</a><br />
<h3>
Simple Html</h3>
</div>
<div>
While the documentation rendering doesn't support much, you can use simple html like tables and images and UTF8 characters to make your text more readable. Just keep it simple.</div>
<h3>
<br />Use <a href="https://github.com/tldr-pages/tldr" target="_blank">tl;dr curation</a></h3>
<div>
A lot of the value is in the discoverability and quick readability. We approached this in a couple ways.</div>
<div>
<ul>
<li>We don't show all the tips, only the ones we judge 'most' useful</li>
<li>We grouped things so you could focus on pieces, but we also had a full listing under .Mac()</li>
<li>We named the groups starting with an underscore ( _Lines ) so they would be together in the editor</li>
</ul>
<div>
<br /></div>
</div>
<h2>
Possible Next Steps</h2>
<h4>
Other Editors</h4>
<div>
<ul>
<li>Visual Studio / Resharper (for vs keybindings & R# keybindings)</li>
<li>IntelliJ</li>
</ul>
<h4>
Example / Starter / Cookbooks for Api</h4>
</div>
<div>
When you are getting started you often find your way to websites to lookup quick getting started examples. This as stuff that doesn't exactly belong in the actual code itself. Especially as the examples might be <b><i>how</i></b> you discover the packages, class and methods you want to call.</div>
<div>
<br /></div>
<div>
I could easily see documentation classes for things like linq, unit testing, markdown, regex, etc.</div>
<div>
<br /></div>
<div>
Of course, you might want to put that directly on the methods (as documentation was originally intended) but this also opens up the ability to write a documentation project for a project you don't actually own yourself.</div>
<div>
<br /></div>
<h2>
Let's see what the future will hold...</h2>
<div>
I'm excited to see what will come out of this discovery. If you have ideas please reach out to me on twitter ( <a href="https://twitter.com/llewellynfalco" target="_blank">@LlewellynFalco </a>) Share what you've created, or ping me and we can pair and create it together.</div>
<div>
<br /></div>
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-82312859016895314742016-03-22T03:36:00.000-07:002016-03-22T09:47:22.672-07:00The coordination tax of working aloneIf you have team members working together on a project but separately on their own piece of the project then you need to coordinate that work.<br />
<br />
There are lots of interestingly different ideas on how much 'cost' there is to this coordination. Ranging from it's a very low overhead, to it requires a full time manager who is the highest paid person on the team. Often these drastically different opinions are held on the same teams by the same people.<br />
<br />
What I want to explore today however is what does the actual coordination looks like and what it would mean to get it right.<br />
<br />
To start off with, there are a few types of coordination:<br />
<br />
<h3>
Multi-functional coordination</h3>
<div>
If someone is building the database and someone is building the UI those things need to talk to each other; usually through a middleware build by a third person. If they don't line up the costs are large indeed, ranging from "we need to redo this" to the far worse "Let's ship the wrong thing". </div>
<div>
<br /></div>
<div>
The coordination includes:</div>
<div>
<ul>
<li>knowing what each piece looks like</li>
<li>which functionality goes where</li>
<li>how to connect them</li>
</ul>
<div>
If you know the answers to all of this, then I believe you can make a fairly good assembly line fashion process. </div>
</div>
<div>
<br /></div>
<div>
However, I would like to state categorically </div>
<div style="text-align: center;">
<i>"If you have not yet built it, you don't know everything involved"</i></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
or as the great Woody Zuill said</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<i>"It's in the doing of the work that we discover the work that needs to be done"</i></div>
<div style="text-align: center;">
<i><br /></i></div>
<div style="text-align: left;">
And I don't mean done 'something like it'. If you've ever done a remodel on your house you will notice the estimates don't match the end result. It's not that this is the first remodel the contractor has ever done. Each situation has it own unique unknown unknowns.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Unfortunately, in software we are always doing something new because duplication is a copy and paste away.</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Coordination of these types of tasks is expensive. You need an level of detail and level of oversight that is time consuming to obtain. If you don't get it right there is a lot of waste in the process that is silent.</div>
<div style="text-align: left;">
<br /></div>
<h3>
Multi-person coordination</h3>
<div>
Even if you have people with the exact same skill set you will often have them working separately in an effort to maximize throughput. Here the coordination is in reducing duplication and keeping the code united. You don't want different people creating the same things or worst the same things in a different way where it's hard to realize they are even the same things. Ideally you want everyone producing unique work in the best possible way.</div>
<div>
<br /></div>
<h3>
Perfect coordination </h3>
<div>
I think perfect coordination is easiest to picture in a single entity. This entity is aware of the details and the larger picture. It has the skill sets for all aspects of the code. It incorporates new knowledge and processes the moment it learns them. It has a memory of the previous work and knows when it should reuse pieces. It has high self awareness and doesn't have to spend a lot of time in meeting talking about work.</div>
<div>
<br /></div>
<div>
For many small projects this entity has been a single person.</div>
<div>
<br /></div>
<div>
I hypothesise that it is also the reason a Mob can be effective.</div>
<div>
<br /></div>
<div>
</div>
<br />
<br />Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-50506466191948091192016-03-06T04:47:00.004-08:002016-03-06T04:47:52.994-08:00Two people working on the same thingOne of the most common objections to Pair or Mob Programming is<br />
<i><br /></i>
<br />
<div style="text-align: center;">
<i>"How can more than one people working on the same thing be productive?"</i></div>
<div style="text-align: center;">
<i><br /></i></div>
<div style="text-align: left;">
Let's put pairing that aside for a second though and look at common scenario:<br />
<br />
<h3>
Duplication in the average code base</h3>
<br />
You have a fairly big system, maybe 300,000 lines of code. How much of that is some form of duplication? Keep in mind that duplication is more than just copy and paste. It's anytime you need to change something in more than 1 place. This inconsistency is particularly insidious because it means new creative solutions for each one, plus a harder time identifying the problems later.<br />
<br />
Note: I have seen cases of over 1500 instances of duplication in a single code base of this size. (If this seems familiar, hire me :-)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This duplication is one of the main causes of technical debt.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Obviously, you should remove this. You can see some techniques to do just that in our <a href="https://www.youtube.com/watch?v=aWiwDdx_rdo">Practical Refactoring video </a>but let's instead focus on the reason this duplication get created in the first place.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Keep in mind that often this duplication isn't written by the same single person. Often in is many people, over many months. Often they aren't even aware there is simular code somewhere else in the system. Who has time to just read over 300 thousand lines of code? [this is roughly 15 copies of the last Harry Potter Book] </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
I doubt anyone would actively say "Please have a couple people write the same thing over 4-5 places in different ways". But, of course, no one is saying that. These areas of duplication are smaller than the tasks that are ever discussed. It's just something that happens but is unaccounted for. So let's account for it:</div>
<h3 style="text-align: left;">
Time to do the Math</h3>
<div style="text-align: left;">
We need an amount of duplication which is a bit of a problem as there isn't a nice industry number for this. So I'll use a range from 5%-50% for the common scenario of 300,000 Lines of Code (LOC). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<h4>
5%</h4>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
300,000 * 0.05 = 15,000 LOC. </div>
<div style="text-align: left;">
15,000 LOC / (100 LOC/Day) = <b>150 days to create</b>.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<h4>
<br />50%</h4>
</div>
<div style="text-align: left;">
<br /></div>
300,000 * 0.50 = 150,00 LOC.<br />
150,000 LOC / (100 LOC/Day) = 1500 days / (300 day/year) = <b>5 years to create</b>.<br />
<br />
Meaning the average project has inadvertently budgeted between 1/2 man year to 5 man years to have 2 people work on the same thing for the purpose of making the code worse.<br />
<br />
For which I have to ask:<br />
<br />
<div style="text-align: center;">
<i>"How can more than one people working on the same thing to be productive?"</i></div>
<div>
<br /></div>
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-70338683507789885652016-03-03T06:16:00.000-08:002016-03-03T06:36:23.502-08:00Defining 'Technical'<h4>
TL;DR: Technical can mean advanced, lingo and/or labs.</h4>
<br />
I'll like to a moment to get technical about the concept of technical talks...<br />
<br />
It is often discussed before, during and after a conference about the 'right' amount of 'technical' talks. This is a very hard subject and in some of my recent discussion I started to get a glimpse into why:<br />
<br />
<div style="text-align: center;">
<i>"Technical is a poorly defined umbrella term."</i></div>
<br />
As I started to break down what it means to be a technical talk, I started to see 3 axis emerge on aspects of a talk that can be considered technical.<br />
<br />
<h2>
The aspects of Technical</h2>
<br />
<h3>
1) Lingo vs. Clear Words</h3>
"When my WCF backed by a RDMS wasn’t rendering in WPF I opened MSDN and said WTF"<br />
If you are a .net developer this statement makes perfect sense, but everyone can understand<br />
"When my program wasn’t connecting to the database I had to read the documentation online"<br />
<br />
Pros: Lingo conveys large info in small words.<br />
Cons: It isolates many people and makes them feel stupid while making the speaker look smart.<br />
<br />
<h3>
2) Advanced vs. Beginner</h3>
How many prerequisite do you need to attend this session?<br />
<br />
If you hear the statement<br />
"Then just apply your basic differential equations..."<br />
you better have taken a few years of math. Whereas<br />
<br />
"With just your basic arithmetic you can..."<br />
is probably accessible to most people.<br />
<br />
To be clear, I'm not trying to put a value judgement on the topic. Advanced topics don't inherently hold more value than beginner topics, but they do have more barriers to entry.<br />
<br />
Pros: There are many great and valuable things in the advanced space.<br />
Cons: Understanding the prerequisite most people have is very difficult and error prone. These sessions also have a limited audience by their very nature.<br />
<br />
<br />
<h3>
3) Labs vs. Concepts</h3>
Is this where the rubber meets the road or a 10,000 foot overview?<br />
<br />
Will the presenter just mention that<br />
"It’s saved in a settings configuration" or are we going to the command line and opening emacs?<br />
<br />
It's worth mentioning that there is a fairly solid middle ground between concepts and labs that I would refer to as examples/demos. Like a lab where you are watching rather than doing.<br />
<br />
Pros: Labs get to the real knowledge that concepts simply gloss over. For example: I understand the concept of flying a plane, but you don't want me to be your pilot.<br />
Cons: Labs cover a much smaller space in a much larger time scale than concepts do. They are also very specific to a particular context that might not transfer to your own.<br />
<br />
<br />
In the end we have a complicated 3D space looking something like this:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiemllYyIa-2Atwekz4RoWYv-mufFYYzmZME66z30IO_VYNHIpE3s5zHxHzJP0QnQOS6MT1sdg-OWUBZBZNIHRNlJvP-NXQXiwBV3QlKi5h6WFXI7vRYB9HVJtDC36WDYIzGpSZQoBO1-HV/s1600/Techinical+3D+Space+Overview.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiemllYyIa-2Atwekz4RoWYv-mufFYYzmZME66z30IO_VYNHIpE3s5zHxHzJP0QnQOS6MT1sdg-OWUBZBZNIHRNlJvP-NXQXiwBV3QlKi5h6WFXI7vRYB9HVJtDC36WDYIzGpSZQoBO1-HV/s400/Techinical+3D+Space+Overview.png" /></a></div>
This is a very complicated space and most talks lie somewhere in between. However, I have found the most value from examining the 8 outermost points.
<br />
<br />
<h2>
The 8 Extremes of Technical</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3OXcxTuVZz9YLyCl6sUHaLq11Vii_wb5imUDhm4KCgp6eQSsoY44oB7M16YG0xwOrlX1ZDYbUSy3G0fShWt0cKJO0zNocEFCcRs8q79CoqXdWsJIF_DnXGD8wpbYF_Wez9tEuzPgtvkss/s1600/The+8+extremes+of+Techinical+.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3OXcxTuVZz9YLyCl6sUHaLq11Vii_wb5imUDhm4KCgp6eQSsoY44oB7M16YG0xwOrlX1ZDYbUSy3G0fShWt0cKJO0zNocEFCcRs8q79CoqXdWsJIF_DnXGD8wpbYF_Wez9tEuzPgtvkss/s400/The+8+extremes+of+Techinical+.png" /></a></div>
<h3>
1) Clear Beginner Concepts</h3>
<br />
This the least technical presentation.<br />
That's not to demean the presentation. These talks for valuable and deliver a lot of (albeit shallow) understanding to a large audience.<br />
This is the most common type of talk at most conferences.<br />
<h3>
<br />2) Clear Advanced Concepts (GOOD)</h3>
<br />
This is technical in that you need a fair amount of knowledge to get into the conversation.<br />
I have seen a fair amount of these talks at strangeloop. They are the kind of conversation where you understand every word but your head is still hurting.<br />
These can also be the topics that open your eyes and stick with you for ages.<br />
<br />
<h3>
3) Advanced Concepts with lot’s of lingo</h3>
These are error prone. Like the above they make your head hurt but there is a good chance you didn't understand every word and you are too embarrassed to ask for clarification.<br />
While Academic conferences seem to have a bunch of these the truth is they are everywhere.<br />
<br />
<h3>
4) Beginner Concepts with lingo (BAD)</h3>
I can see no use for this. Lingo implies a prerequisite for understanding but beginner states none is needed.<br />
Obviously there is some use of this from a dark place where the speaker wants to feel superior or confuse the listener, but I believe more of this happens by accident because of<br />
'the curse of knowledge'. Namely, once you internalize the lingo you forget that it is even is lingo; It's meaning just seems so clear.<br />
<br />
<h3>
5) Beginner Labs with lot’s of lingo (BAD)</h3>
See above, except because you are in the details the confusion is even more damaging.<br />
<br />
<h3>
6) Advanced Labs with lot’s of lingo</h3>
Interestingly, this seems to be a fairly good place for lingo. While I would still suggest brief definitions when introducing the terms (to avoid having people too embarrassed to ask) the efficiency that is provided by lingo is very beneficial here, you have people that have been in the space a while to fulfill their prereqs and you are using specific technology that needs names and labels.<br />
<h3>
<br />7) Clear Advanced Labs </h3>
Even better.<br />
<br />
<h3>
8) Clear Beginner Labs (GOOD) </h3>
Beginner and Introductory talks are fantastic. They are heavily attended and help bring up new people (Doubles every 5 years means 50% of industry is less than 5 years of experience). Making these labs clear welcomes newbies and gives them a good experiences and solid learning. Labs help to make the learning concrete. I personally really enjoy these type of presentations and give many of them myself (so I'm a bit biased).<br />
They do a have a couple pitfalls though.<br />
<br />
<br />
<ul>
<li><b>They require more effort on the student. </b>This is particularly bad if they are held right after lunch or competing with an easier session.</li>
<li><b>Sometimes you can't see the forest for the trees</b>. Students will feel that they are missing out on the big important stuff because they are struggling with the details.</li>
<li><b>Experts like to discount them</b>. "that's too basic" or "We've all seen that before" is the most common thing I hear from experienced people.</li>
</ul>
<br />
<br />
<br />
So those are my thoughts into everything that usually gets wrapped up in the term 'technical'.<br />
Hopefully this blog post rates as a Clear, Advanced and somewhere in between Concepts/Lab.<br />
If not, let me know in the comments.<br />
<br />
<br />
<br />
<br />
<br />
<div>
<br /></div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com0tag:blogger.com,1999:blog-6889884053798500413.post-24873545210439275642016-02-21T08:30:00.000-08:002016-02-21T08:48:55.228-08:00Don't use the greater than sign in programming<br />
One simple thing that comes up time and time again is the use of the greater than sign as part of a conditional while programming. Removing it cleans up code, here's why:<br />
<br />
<h2>
Conditionals can be confusing</h2>
<div>
Let's say that I want to check that something is between 5 and 10. </div>
<div>
There are many ways I can do this</div>
<script src="https://gist.github.com/anonymous/78109a10db73b95a3007.js"></script>
<br />
<div>
All of these mean the same thing... Wait, did I actually do all that right? Sorry, one of those is incorrect. Go ahead and find out which one, I'll wait...<br />
<br />
If you remove the use of the greater than sign then only 2 options remain:<br />
<span style="background-color: white;"></span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; font-size: 12px; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">(x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">10</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">&&</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">5</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> x) </span><br />
which is a stupid option because it implies 10 < 5 and<br />
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> (</span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">5</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">&&</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">10</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">)</span><br />
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><br /></span>
This is a nice way of expressing <i>"x is between 5 and 10"</i> because it is <b>literally between</b> 5 and 10.</div>
<div>
<br /></div>
<div>
It's also a nice way of expressing that <i>"x is outside the limits of 5 and 10"</i></div>
<div>
<div>
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> (x </span><span style="background-color: white; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">< </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">5</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">||</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">10 </span><span style="background-color: white; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">< </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">x</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">)</span></div>
<div>
</div>
<br />
Again, this expresses it nicely because x is <b>literally outside</b> of 5 to 10.<br />
<br />
<div style="text-align: center;">
<span style="font-size: large;">Simple. Clear. Consistent.</span></div>
<br />
This is such a nice way to express numbers I wonder why programming languages allow for the greater than sign ( > ) at all.<br />
<br />
But why is this so expressive?<br />
<br />
<h2>
The Number line</h2>
<div>
Here's how you represent between 5 and 10 on a number line vs code:</div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2nbVOIoesIHMxntJnI_QQxflU7Ptqhv70jR15k_Zp5qGS-Ga4X0h1fDGtxfG48Z_Fl-5z7iOW4CQMJPjZXLzFu-y4oPPQu6eJXtXfewzWJUt3hrLMV6qQPG4DLaMtSoeClMlOXcHZ88Zm/s1600/Screen+Shot+2016-02-21+at+11.11.06+AM.png" imageanchor="1"><img alt="number line of between 5 to 10" border="0" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2nbVOIoesIHMxntJnI_QQxflU7Ptqhv70jR15k_Zp5qGS-Ga4X0h1fDGtxfG48Z_Fl-5z7iOW4CQMJPjZXLzFu-y4oPPQu6eJXtXfewzWJUt3hrLMV6qQPG4DLaMtSoeClMlOXcHZ88Zm/s320/Screen+Shot+2016-02-21+at+11.11.06+AM.png" title="" width="320" /></a></div>
<div>
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> (</span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">5</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">&&</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">10</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">)</span></div>
<div>
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><br /></span></div>
<div>
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><br /></span></div>
<div>
<div>
<div style="text-align: left;">
Here's how you represent outside of 5 and 10 on a number line vs code:</div>
</div>
</div>
<div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMfF5NFDzDxJY-bIhhJgkbDR4xCmHmDBrdsP88QQobQPfl7al7FVwBmlf0q0eIe42339l-VzZeac4LqJi53jU-EopfsOPDrVFaKPw_FwZdUW18e3WbqHcymTyagq-Yur-i0XT0UGwtfAE3/s1600/Screen+Shot+2016-02-21+at+11.12.01+AM.png" imageanchor="1"><img alt="number line of outside 5 to 10" border="0" height="71" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMfF5NFDzDxJY-bIhhJgkbDR4xCmHmDBrdsP88QQobQPfl7al7FVwBmlf0q0eIe42339l-VzZeac4LqJi53jU-EopfsOPDrVFaKPw_FwZdUW18e3WbqHcymTyagq-Yur-i0XT0UGwtfAE3/s320/Screen+Shot+2016-02-21+at+11.12.01+AM.png" title="" width="320" /></a></div>
</div>
<div>
<div style="text-align: left;">
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> (x </span><span style="background-color: white; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">< </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">5</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">||</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">10 </span><span style="background-color: white; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">< </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">x</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">)</span></div>
</div>
<div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><br /></span></div>
</div>
<div>
<div style="text-align: left;">
On a number line everything to the left is <b>less than</b> the numbers to the right, so these two ways of representing the relationship between things matches up.</div>
</div>
<div>
<br /></div>
<h2>
Combinatorics</h2>
This problem gets much worse as the conditional grows. For example<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilMoel80yJzyiG1P2zolDlsdLU6drtNWrl9qHwwK_fmrKp2UpTcN6Rggwd_P8sdrDkMpC6_QJBArfh1dGyWfaRZ9RP4OjUAHqI7WQUo1fQdTm9g6uDCFco5yqtKfV3aT8I8t5FpcNxupcM/s1600/Screen+Shot+2016-02-21+at+11.22.54+AM.png" imageanchor="1"><img alt="number line of between -5 and -1 or between 2 and 4" border="0" height="68" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilMoel80yJzyiG1P2zolDlsdLU6drtNWrl9qHwwK_fmrKp2UpTcN6Rggwd_P8sdrDkMpC6_QJBArfh1dGyWfaRZ9RP4OjUAHqI7WQUo1fQdTm9g6uDCFco5yqtKfV3aT8I8t5FpcNxupcM/s320/Screen+Shot+2016-02-21+at+11.22.54+AM.png" title="" width="320" /></a><br />
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">((-</span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">5</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">&&</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> -</span><span class="pl-c1" style="background-color: white; box-sizing: border-box; color: #0086b3; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">1</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">)</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">||</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">(</span><span style="background-color: white; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><span style="color: #0086b3;">2</span></span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">&&</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">x </span><span class="pl-k" style="background-color: white; box-sizing: border-box; color: #a71d5d; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><</span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"> </span><span style="background-color: white; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><span style="color: #0086b3;">4</span></span><span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;">))</span><br />
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><br /></span>
Has <b><span style="font-size: large;">15</span></b> other possible ways to be expressed if you include the greater than sign and don't make your expressions conform to the number line.<br />
<div>
<span style="background-color: white; color: #333333; font-family: "consolas" , "liberation mono" , "menlo" , "courier" , monospace; line-height: 16.8px; white-space: pre;"><br /></span></div>
<div>
<br /></div>
<div>
<br /></div>
<br />
<br /></div>
<div>
</div>
Llewellyn Falcohttp://www.blogger.com/profile/11668997629228826023noreply@blogger.com27