<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>(import this)</title>
    <subtitle>From ideas to tech and the life in-between</subtitle>
    <link href="https://bryan-lott.github.io/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://bryan-lott.github.io/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-12-01T00:00:00+00:00</updated>
    <id>https://bryan-lott.github.io/atom.xml</id>
    <entry xml:lang="en">
        <title>Trail Fixes</title>
        <published>2024-12-01T00:00:00+00:00</published>
        <updated>2024-12-01T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/trail-fixes/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/trail-fixes/</id>
        
        <content type="html">&lt;h1 id=&quot;trail-fixes&quot;&gt;Trail Fixes&lt;&#x2F;h1&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Cost Center or Loss Prevention Center</title>
        <published>2024-01-08T00:00:00+00:00</published>
        <updated>2024-01-08T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/cost-center/" type="text/html"/>
        <id>https://bryan-lott.github.io/cost-center/</id>
        
        <content type="html">&lt;h1 id=&quot;changing-the-narrative-around-business-cost-centers&quot;&gt;Changing the Narrative Around Business Cost Centers&lt;&#x2F;h1&gt;
&lt;p&gt;In the business&#x2F;accounting world there&#x27;s this concept of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Revenue_center&quot;&gt;Revenue Centers&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Cost_center&quot;&gt;Cost Centers&lt;&#x2F;a&gt;. Revenue Centers are used to track revenue and Cost Centers are used to track costs. This is great until you start applying it to the intrinsice value of those groups of &lt;em&gt;people&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Example: multiple companies that I&#x27;ve worked for in the past have treated Security, DevOps, QA&#x2F;QC, and Technical Support as Cost Centers. While this may be true in a strictly accounting sense, is that really the case in a practical sense?&lt;&#x2F;p&gt;
&lt;p&gt;If so, then a quick way to cut costs is to cut out those business units. Very quickly you&#x27;ll see the quality of what you produce drop, customer confidence in the product go into the toilet and you&#x27;re left wonder &amp;quot;what happened?!&amp;quot;&lt;&#x2F;p&gt;
&lt;p&gt;What happened is the same thing you see in a retail store if you get rid of your loss prevention specialists. I.e., the people you hire to reduce the amount of products stolen (&amp;quot;shrink&amp;quot; in the industry).&lt;&#x2F;p&gt;
&lt;p&gt;Loss prevention is just that. It&#x27;s not a &amp;quot;Cost Center&amp;quot;, it&#x27;s a &amp;quot;Loss Prevention Center&amp;quot;. This equates to more revenue.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s not a far stretch to say that it&#x27;s a revenue center. Though I know some will balk at that.&lt;&#x2F;p&gt;
&lt;p&gt;What is loss prevention but the simple act of capturing revenue that would have otherwise been lost?&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m sure it&#x27;s not hard to see the parallels to the software world, Security, DevOps, QA&#x2F;QC, and Technical Support. Especially Security, that&#x27;s a little on the nose if you ask me.&lt;&#x2F;p&gt;
&lt;p&gt;These are your &amp;quot;loss prevention specialists&amp;quot;. They&#x27;re a loss prevention center, not a cost center. They help you capture revenue you would have otherwise lost out the door &lt;em&gt;unnoticed&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And you know what? In a lot of cases these are the most important people in your organization. Treat them as so.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>What I&#x27;m Currently Doing</title>
        <published>2023-12-31T00:00:00+00:00</published>
        <updated>2023-12-31T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/now/" type="text/html"/>
        <id>https://bryan-lott.github.io/now/</id>
        
        <content type="html">&lt;h1 id=&quot;what-i-m-currently-doing&quot;&gt;What I&#x27;m currently Doing&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;work&quot;&gt;Work&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Fantastic company (&lt;a href=&quot;https:&#x2F;&#x2F;rechargepayments.com&#x2F;&quot;&gt;Recharge&lt;&#x2F;a&gt;) that really cares about the people that work for them and their clients&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;learning&quot;&gt;Learning&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Offroad vehicle recovery, maintenance, driving (perpetually)&lt;&#x2F;li&gt;
&lt;li&gt;Mindfulness Meditation&lt;&#x2F;li&gt;
&lt;li&gt;Stoic Philosophy&lt;&#x2F;li&gt;
&lt;li&gt;Welding&lt;&#x2F;li&gt;
&lt;li&gt;Rust&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hobbies&quot;&gt;Hobbies&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Volunteering with Colorado 4x4 Rescue and Recovery (&lt;a href=&quot;https:&#x2F;&#x2F;co4x4rnr.org&quot;&gt;CO4x4RnR&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Active volunteer with &lt;a href=&quot;https:&#x2F;&#x2F;burningman.org&#x2F;&quot;&gt;Burning Man&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Center Camp Guardian&lt;&#x2F;li&gt;
&lt;li&gt;Temple Guardian&lt;&#x2F;li&gt;
&lt;li&gt;Black Rock City Ranger&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&amp;quot;Making&amp;quot; in general, there&#x27;s a wonderful feeling when there&#x27;s a thing you made that wasn&#x27;t a thing before.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tools I Use</title>
        <published>2023-12-31T00:00:00+00:00</published>
        <updated>2023-12-31T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/uses/" type="text/html"/>
        <id>https://bryan-lott.github.io/uses/</id>
        
        <content type="html">&lt;h1 id=&quot;uses&quot;&gt;Uses&lt;&#x2F;h1&gt;
&lt;p&gt;A succinct overview of tools I use on a regular basis, mostly focused on my day job of software development but possibly other random stuff thrown in.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;software&quot;&gt;Software&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Editor
&lt;ul&gt;
&lt;li&gt;NeoVim (AstroNvim)&lt;&#x2F;li&gt;
&lt;li&gt;VSCode: rarely used now&lt;&#x2F;li&gt;
&lt;li&gt;~Emacs (Doom) https:&#x2F;&#x2F;github.com&#x2F;doomemacs&#x2F;doomemacs~&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Browser
&lt;ul&gt;
&lt;li&gt;Brave&lt;&#x2F;li&gt;
&lt;li&gt;~Firefox~&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Utilities
&lt;ul&gt;
&lt;li&gt;DevUtils: One-off tools, base64 encode&#x2F;decode, format and validate JSON, etc, really handy to have always running.&lt;&#x2F;li&gt;
&lt;li&gt;Amethyst: Automatically size&#x2F;move windows&lt;&#x2F;li&gt;
&lt;li&gt;Raycast: Quick switcher and finder of files&lt;&#x2F;li&gt;
&lt;li&gt;GitKraken: The best (IMO) GUI git client&lt;&#x2F;li&gt;
&lt;li&gt;Syncthing: Dropbox kinda-sorta replacement&lt;&#x2F;li&gt;
&lt;li&gt;Blurred: Darken windows that aren&#x27;t the active one (i.e., know where your cursor focus is)&lt;&#x2F;li&gt;
&lt;li&gt;Zola: Static site&#x2F;blog generator&lt;&#x2F;li&gt;
&lt;li&gt;~Finda: Find anything on your computer + quick switcher~&lt;&#x2F;li&gt;
&lt;li&gt;~Quicksilver: Quick switcher~&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Terminal
&lt;ul&gt;
&lt;li&gt;Alacritty w&#x2F; tmux or zellij&lt;&#x2F;li&gt;
&lt;li&gt;Wezterm&lt;&#x2F;li&gt;
&lt;li&gt;FishShell&lt;&#x2F;li&gt;
&lt;li&gt;Starship: Enhance your command line&lt;&#x2F;li&gt;
&lt;li&gt;~zsh: Better than bash, more posix compliant than fish~&lt;&#x2F;li&gt;
&lt;li&gt;~iTerm2: I&#x27;d like to use something else, but this works the best for now~&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;services&quot;&gt;Services&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;ProtonMail: Personal email&lt;&#x2F;li&gt;
&lt;li&gt;YouNeedABudget: Finance tracking&lt;&#x2F;li&gt;
&lt;li&gt;Deezer: Music&lt;&#x2F;li&gt;
&lt;li&gt;Github: Off-computer code backup&lt;&#x2F;li&gt;
&lt;li&gt;Gitlab: Off-computer code backup, blog&lt;&#x2F;li&gt;
&lt;li&gt;Kagi: Search engine&lt;&#x2F;li&gt;
&lt;li&gt;Dropbox: Backup &amp;amp; sync&lt;&#x2F;li&gt;
&lt;li&gt;Bitwarden: Password manager&lt;&#x2F;li&gt;
&lt;li&gt;xBrowserSync: Sync your bookmarks across multiple devices and multiple browsers.  Also offers a pretty killer search.&lt;&#x2F;li&gt;
&lt;li&gt;A Fine Start: pseudo-bookmarks on your new tab screen&lt;&#x2F;li&gt;
&lt;li&gt;~1Password: If you&#x27;re not using a password manager, you&#x27;ve already been compromised and just don&#x27;t know it yet~&lt;&#x2F;li&gt;
&lt;li&gt;~Feedly: I love my RSS feeds~&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hardware&quot;&gt;Hardware&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;MacBook Pro (i.e., whatever work provides me)&lt;&#x2F;li&gt;
&lt;li&gt;Alienware R7 (desktop&#x2F;personal machine)&lt;&#x2F;li&gt;
&lt;li&gt;ZSA Voyager Keyboard&lt;&#x2F;li&gt;
&lt;li&gt;Streamdeck&lt;&#x2F;li&gt;
&lt;li&gt;Kensington Slimblade Trackball&lt;&#x2F;li&gt;
&lt;li&gt;Logitech MX Master 3&lt;&#x2F;li&gt;
&lt;li&gt;Remarkable2&lt;&#x2F;li&gt;
&lt;li&gt;Pixel 7 Pro&lt;&#x2F;li&gt;
&lt;li&gt;~Ultimate Hacking Keyboard https:&#x2F;&#x2F;ultimatehackingkeyboard.com&#x2F;~&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Log all (fish) commands</title>
        <published>2023-04-08T00:00:00+00:00</published>
        <updated>2023-04-08T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/log-all-commands/" type="text/html"/>
        <id>https://bryan-lott.github.io/log-all-commands/</id>
        
        <content type="html">&lt;h1 id=&quot;log-all-non-sudo-commands-in-fish-shell&quot;&gt;Log all non-sudo commands in fish-shell&lt;&#x2F;h1&gt;
&lt;p&gt;All credit (and inspiriation) to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;www.justinjoyce.dev&#x2F;save-your-shell-history-to-log-files&#x2F; (zsh version)&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;spin.atomicobject.com&#x2F;2016&#x2F;05&#x2F;28&#x2F;log-bash-history&#x2F; (bash version)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tl-dr&quot;&gt;tl;dr:&lt;&#x2F;h2&gt;
&lt;p&gt;Copy this into your &lt;code&gt;~&#x2F;.config&#x2F;fish&#x2F;fish.config&lt;&#x2F;code&gt; file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;shell&quot; class=&quot;language-shell &quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;# log every command
function cmd_log --on-event fish_preexec
  if test (id -u) -ne 0 # if we&amp;#x27;re already sudo, don&amp;#x27;t log
    echo $(date &amp;quot;+%Y-%m-%d.%H:%M:%S&amp;quot;): $(pwd): $argv &amp;gt;&amp;gt; ~&amp;#x2F;.logs&amp;#x2F;cmd-history-$(date &amp;quot;+%Y-%m-%d&amp;quot;).log
  end
end
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;explanation&quot;&gt;Explanation&lt;&#x2F;h2&gt;
&lt;p&gt;Note: I&#x27;m no fish&#x2F;bash&#x2F;zsh scripting expert so take this with a grain of salt!&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;function cmd_log&lt;&#x2F;code&gt;: Create a new fish function.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--on-event fish_preexec&lt;&#x2F;code&gt;: Fire this function before every command.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;if test (id -u) -ne 0&lt;&#x2F;code&gt;: If we&#x27;re not &lt;em&gt;already&lt;&#x2F;em&gt; sudo, then log. Note, this won&#x27;t prevent &lt;code&gt;sudo ls&lt;&#x2F;code&gt; commands from being logged as we weren&#x27;t sudo at the time the command &lt;em&gt;started&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;echo&lt;&#x2F;code&gt;: Don&#x27;t run, instead spit the output out.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$(date &amp;quot;+%Y-%m-%d.%H:%M:%S&amp;quot;)&lt;&#x2F;code&gt;: Current date&#x2F;time in descending format (sortable).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$(pwd)&lt;&#x2F;code&gt;: Print the working directory.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$argv&lt;&#x2F;code&gt;: Grab the entire command and all args.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&amp;gt;&lt;&#x2F;code&gt;: Append stdout (the entire echo command) to the end of...&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;~&#x2F;logs&#x2F;cmd-history-$(date &amp;quot;+%Y-%m-%d&amp;quot;)&lt;&#x2F;code&gt;: Today&#x27;s log file.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;end&lt;&#x2F;code&gt;: End the &lt;code&gt;if&lt;&#x2F;code&gt; statement.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;end&lt;&#x2F;code&gt;: End the function.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bolt Grades</title>
        <published>2022-08-09T00:00:00+00:00</published>
        <updated>2022-08-09T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/bolt-grades/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/bolt-grades/</id>
        
        <content type="html">&lt;h1 id=&quot;bolt-grades&quot;&gt;Bolt Grades&lt;&#x2F;h1&gt;
&lt;p&gt;Bolts and Hitch Pins come in both unrated and rated.  For the 4x4 application we&#x27;ll be attempting to deal with rated gear only.  Most hitch pins are not rated, however rated pins can be found, normally called Tractor Hitch Pins or Farm Hitch Pins.
In a pinch, a properly rated bolt can be used as a hitch pin.&lt;&#x2F;p&gt;
&lt;p&gt;Below you&#x27;ll find common grades of bolts&#x2F;pins, identifying characteristics, and strength.  In use as a hitch pin the important rating to look for is the &lt;em&gt;Double Shear&lt;&#x2F;em&gt; strength.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;common-grades&quot;&gt;Common Grades&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;grade-5-8-8-1-4-1&quot;&gt;Grade 5 (8.8) 1&#x2F;4&amp;quot; - 1&amp;quot;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Identification
&lt;ul&gt;
&lt;li&gt;3 hash marks 120 degrees apart&lt;&#x2F;li&gt;
&lt;li&gt;Grey&#x2F;Silver in color&lt;&#x2F;li&gt;
&lt;li&gt;Breaks suddenly&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Strength
&lt;ul&gt;
&lt;li&gt;Proof Load: 85,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Tensile: 120,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Yield: 92,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Shear: 72,000psi (~60% of Tensile)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Max Force (lbs)&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Diameter&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Single Shear&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Double Shear&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&#x2F;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;3,534&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;7,069&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;5&#x2F;16&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;5,522&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;11,045&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;3&#x2F;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;7,952&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;15,904&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&#x2F;2&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;14,137&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;28,274&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;5&#x2F;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;22,089&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;44,179&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;3&#x2F;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;31,809&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;63,617&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;7&#x2F;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;43,273&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;86,546&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;56,549&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;113,097&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1 1&#x2F;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;77,313&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;154,625&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1 1&#x2F;2&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;111,330&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;222,660&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;grade-8-10-9&quot;&gt;Grade 8 (10.9)&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Identification
&lt;ul&gt;
&lt;li&gt;6 hash marks, one for each side of the bolt&lt;&#x2F;li&gt;
&lt;li&gt;Bronze&#x2F;Gold in color&lt;&#x2F;li&gt;
&lt;li&gt;Yields before breaking&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Strength
&lt;ul&gt;
&lt;li&gt;Proof Load: 120,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Tensile: 150,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Yield: 130,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Shear: 90,000psi (~60% of Tensile)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Max Force (lbs)&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Diameter&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Single Shear&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Double Shear&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&#x2F;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;4,418&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;8,836&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;5&#x2F;16&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;6,903&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;13,806&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;3&#x2F;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;9,940&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;19,880&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&#x2F;2&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;17,671&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;35,343&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;5&#x2F;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;27,612&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;55,223&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;3&#x2F;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;39,761&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;79,522&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;7&#x2F;8&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;54,095&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;108,190&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;70,686&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;141,372&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1 1&#x2F;4&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;110,447&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;220,893&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1 1&#x2F;2&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;159,043&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;318,086&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;grade-9-12-9&quot;&gt;Grade 9 (~12.9)&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Identification
&lt;ul&gt;
&lt;li&gt;9 hash marks&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Strength
&lt;ul&gt;
&lt;li&gt;Proof Load: 145,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Tensile: 180,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Yield: 155,000psi&lt;&#x2F;li&gt;
&lt;li&gt;Shear: 108,000psi (~60% of Tensile)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;definitions&quot;&gt;Definitions:&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Tensile Strength: The resistance of a material to breaking under tension&lt;&#x2F;li&gt;
&lt;li&gt;Yield Strength: The stress at which a specific amount of deformation is produced&lt;&#x2F;li&gt;
&lt;li&gt;Proof Load: An axial tensile load which the product must stand without evidence of any permanent set.&lt;&#x2F;li&gt;
&lt;li&gt;Single Shear:&lt;&#x2F;li&gt;
&lt;li&gt;Double Shear:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;sources&quot;&gt;Sources:&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.aftfasteners.com&#x2F;grades-of-bolts-bolt-grade-markings-bolt-strength-chart&#x2F;&quot;&gt;Bolt Grade Markings &amp;amp; Strength Chart&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;The Tractor Hitch Pin A Critical Component in Keeping Control of Implements - Purdue Extension PPP-94 (special thanks to Chad A. for the recommendation)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Driving</title>
        <published>2022-08-09T00:00:00+00:00</published>
        <updated>2022-08-09T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/driving/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/driving/</id>
        
        <content type="html">&lt;h1 id=&quot;driving&quot;&gt;Driving&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;driver-position&quot;&gt;Driver Position&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Dead&amp;quot; Pedal&lt;&#x2F;li&gt;
&lt;li&gt;Right foot&#x2F;leg braced against the transmission tunnel&lt;&#x2F;li&gt;
&lt;li&gt;Hips pushed back into the seat&lt;&#x2F;li&gt;
&lt;li&gt;Seatbelt ON
&lt;ul&gt;
&lt;li&gt;Only exception is when making a water crossing (roll down all windows as well)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;steering&quot;&gt;Steering&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Thumbs out&amp;quot;&lt;&#x2F;li&gt;
&lt;li&gt;If airbags hands at 9 o&#x27;clock and 3 o&#x27;clock&lt;&#x2F;li&gt;
&lt;li&gt;If not airbags, hands at 10 and 2 or 9 and 3&lt;&#x2F;li&gt;
&lt;li&gt;Shuffle steering
&lt;ol&gt;
&lt;li&gt;Hands move from resting position to the top of the steering wheel in a &amp;quot;pushing&amp;quot; motion.&lt;&#x2F;li&gt;
&lt;li&gt;Hands then move back from top of steering wheel back down to resting position in a &amp;quot;pulling&amp;quot; motion.&lt;&#x2F;li&gt;
&lt;li&gt;Repeat&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Bump steer
&lt;ul&gt;
&lt;li&gt;When the terrain or wheel pushes against the steering, turning the wheel.&lt;&#x2F;li&gt;
&lt;li&gt;More prominent in solid-front axles than IFS.&lt;&#x2F;li&gt;
&lt;li&gt;Resist the bump steer.&lt;&#x2F;li&gt;
&lt;li&gt;Keep thumbs outside the steering wheel.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;technique&quot;&gt;Technique&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;left-foot-braking-brake-throttle-modulation&quot;&gt;Left Foot Braking&#x2F;Brake Throttle Modulation&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Using your left foot to add back-pressure to the drivetrain, equalizing torque bias, and reducing throttle lag.
&lt;ul&gt;
&lt;li&gt;In an automatic, place your left foot covering the brake pedal. Leave your right foot on the throttle.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Before&lt;&#x2F;em&gt; getting to an obstacle, apply enough brake pressure to engage the brakes, but not so much that the engine bogs down or is unable to sustain forward momentum.
&lt;ul&gt;
&lt;li&gt;This may require increasing the throttle to maintain momentum.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Feather the brake with your left foot to adjust your forward velocity and momentum while keeping tension in the drivetrain.&lt;&#x2F;li&gt;
&lt;li&gt;This takes a lot of practice to develop a good feel for it and will be different in each vehicle.&lt;&#x2F;li&gt;
&lt;li&gt;Once you have a good feel for controlling your momentum with the brake, add in the throttle foot.&lt;&#x2F;li&gt;
&lt;li&gt;The goal is to keep the engine RPM&#x27;s stable while making forward progress.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Can act as a &amp;quot;variable locker&amp;quot; to provide enough resistance on a wheel that is losing or has lost traction to equalize the torque bias and provide enough torque to the wheel that has grip to propel the vehicle forward.
&lt;ul&gt;
&lt;li&gt;If the wheel that has lost traction is a rear wheel, adding hand brake may be the better option than foot brake due to front&#x2F;rear brake bias (discussed below).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;hand-parking-emergency-brake&quot;&gt;Hand&#x2F;Parking&#x2F;Emergency Brake&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Adjusting the front&#x2F;rear brake bias
&lt;ul&gt;
&lt;li&gt;Brake bias is anywhere from 60-80% biased to the front. This means that when using the foot brake, 60-80% of the braking force goes to the front wheels and only 20-40% to the rear.&lt;&#x2F;li&gt;
&lt;li&gt;On-highway driving this serves to stop the vehicle faster as the weight transfer puts most of the vehicle weight onto the front wheels.&lt;&#x2F;li&gt;
&lt;li&gt;When using left foot braking&#x2F;brake throttle modulation, can be used to adjust the back-pressure in the drive train.&lt;&#x2F;li&gt;
&lt;li&gt;Off-highway when backing down a slope, this bias can cause the vehicle to be unstable and lurch or lose traction as a large percentage of the weight of the vehicle is now on the rear wheels, reducing the effective stopping power.
&lt;ul&gt;
&lt;li&gt;The most common symptom of this is the front wheels lock up when braking while backing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Adding a couple of clicks to the handbrake (also called emergency or e-brake) and engaging the rear brakes partway can shift the bias from the front to the rear. When backing down, aim to bias around 60% to the rear. This will provide better braking control.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Starting from a dead stop on a slope
&lt;ul&gt;
&lt;li&gt;In a manual transmission, pulling up on the hand brake can provide enough braking force that the vehicle no longer rolls backward while transitioning from the foot brake to the throttle. This can act as a &amp;quot;third foot&amp;quot;. If there is a floor-activated parking brake, this technique isn&#x27;t effective.&lt;&#x2F;li&gt;
&lt;li&gt;In an automatic transmission, this can also help allow the torque converter to build up enough pressure to move the vehicle forward without spinning tires.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;philosophy&quot;&gt;Philosophy&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Driving by the rear wheels
&lt;ul&gt;
&lt;li&gt;Front wheels can turn, rear wheels can&#x27;t&lt;&#x2F;li&gt;
&lt;li&gt;Rear wheels track inside the front wheels in a turn, this is known as &amp;quot;wheel cheat&amp;quot;.&lt;&#x2F;li&gt;
&lt;li&gt;Visualizing where the rear wheels go provides a better sense of the overall position of the vehicle through an obstacle&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Reading the terrain
&lt;ul&gt;
&lt;li&gt;Look 10&#x27; out, then 50&#x27;, then 100&#x27;, repeat&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;GOAL: Get Out and Look
&lt;ul&gt;
&lt;li&gt;If you can&#x27;t remember where your vehicle is, lose your line, stop the vehicle for any length of time, etc&lt;&#x2F;li&gt;
&lt;li&gt;Your vision is much better outside the vehicle than inside&lt;&#x2F;li&gt;
&lt;li&gt;Make sure to look under your vehicle and do a full 360. There is a tendency to only look forward.&lt;&#x2F;li&gt;
&lt;li&gt;This includes after getting out of the vehicle for lunch or to take pictures. If enough time has passed for you to forget your line, what was under your vehicle, etc, do a full 360 again. This will help prevent mistakes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Drivetrain</title>
        <published>2022-05-27T00:00:00+00:00</published>
        <updated>2022-05-27T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/drivetrain/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/drivetrain/</id>
        
        <content type="html">&lt;h1 id=&quot;drivetrain&quot;&gt;Drivetrain&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;engine&quot;&gt;Engine&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;transmission&quot;&gt;Transmission&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;manual&quot;&gt;Manual&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;automatic&quot;&gt;Automatic&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;cvt&quot;&gt;CVT&lt;&#x2F;h3&gt;
&lt;h2 id=&quot;transfer-case&quot;&gt;Transfer Case&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Part-time 4WD&lt;&#x2F;li&gt;
&lt;li&gt;Engages the (almost always) front driveshaft&lt;&#x2F;li&gt;
&lt;li&gt;Front and rear driveshaft spin in step with one another&lt;&#x2F;li&gt;
&lt;li&gt;If rear driveshaft goes, can drive out in FWD w&#x2F; the transfer case engages&lt;&#x2F;li&gt;
&lt;li&gt;Various gear reductions are available at the transfer case
&lt;ul&gt;
&lt;li&gt;Jeep Wrangler Rubicon: 4:1
&lt;ul&gt;
&lt;li&gt;Can roughly treat 4-low - 2nd gear as 4-low - 1st gear in other Jeeps&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Other Jeeps: 2.6:1 or 2.72:1&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;center-differential&quot;&gt;Center Differential&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Full-time 4WD&lt;&#x2F;li&gt;
&lt;li&gt;Locking the center diff locks the front and rear driveshaft in step with one another&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;driveshaft-propshaft&quot;&gt;Driveshaft&#x2F;Propshaft&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Rzeppa Joint
&lt;ul&gt;
&lt;li&gt;Continuous Velocity (CV) joint&lt;&#x2F;li&gt;
&lt;li&gt;Consists of 6 large ball bearings running in grooves along with a containing &amp;quot;cage&amp;quot;&lt;&#x2F;li&gt;
&lt;li&gt;Allows 45-48 degrees of articulation while some can give up to 54 degrees&lt;&#x2F;li&gt;
&lt;li&gt;Can be a weak point in the front driveshaft of lifted Jeeps as the front driveshaft angle changes significantly more than the rear when lifting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Birfield Joint
&lt;ul&gt;
&lt;li&gt;CV joint&lt;&#x2F;li&gt;
&lt;li&gt;Consists of 6 large ball berings running in eliptical tracks.&lt;&#x2F;li&gt;
&lt;li&gt;Improved efficiency upon the Rzeppa joint&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Continuous-Velocity (CV) Joint
&lt;ul&gt;
&lt;li&gt;Need to be matched or driveshaft loping occurs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Cardian (also called double cardian) Joint
&lt;ul&gt;
&lt;li&gt;Consists of two paired CV joints and a centering mechanism that prevent loping and tend to be stronger at larger angles.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;axle-l-r-differential&quot;&gt;Axle (L&#x2F;R) Differential&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Locking the axle differential locks the left and right axles&#x2F;wheels in step with one another&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;solid-axle&quot;&gt;Solid Axle&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;full-float&quot;&gt;Full Float&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Axle shaft only serves to transmit rotational force from the differential to the wheel&lt;&#x2F;li&gt;
&lt;li&gt;&amp;quot;Fully floats in the axle housing&amp;quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;semi-float&quot;&gt;Semi Float&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Axle shaft serves to support the weight of the vehicle and transmits rotational force&lt;&#x2F;li&gt;
&lt;li&gt;Axle shaft is held in the housing by a c-clip at the differential. This c-clip can be a weak point and upon failure the entire axle, wheel, and brake assembly will walk out of the housing.
&lt;ul&gt;
&lt;li&gt;Trail fix for this is to use a long rigid &amp;quot;bar&amp;quot; (hi-lift standards work well for this) strapped to the vehicle to keep the wheel from walking out of the housing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ifs&quot;&gt;IFS&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;other&quot;&gt;Other&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;portal-hubs&quot;&gt;Portal Hubs&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;A planetary gear set is located at the wheel and provides the final gear reduction.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;pinzgauer&quot;&gt;Pinzgauer&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=G9wNbXZf6wU&quot;&gt;Youtube: Pinz Driveline Operation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;2 differentials &amp;quot;merged together&amp;quot;&lt;&#x2F;li&gt;
&lt;li&gt;2 ring gears offset with a center set of spider gears
&lt;ul&gt;
&lt;li&gt;TODO: understand how the spider gears interact with the ring gears&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Allows each side of the axle (halfshaft) to rotate independently&lt;&#x2F;li&gt;
&lt;li&gt;Can bust 1 pinion and a ring gear and still keep going w&#x2F; lockers engaged&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Adult Education</title>
        <published>2022-05-10T00:00:00+00:00</published>
        <updated>2022-05-10T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/adult-education/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/adult-education/</id>
        
        <content type="html">&lt;h1 id=&quot;adult-education&quot;&gt;Adult Education&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;communication&quot;&gt;Communication&lt;&#x2F;h2&gt;
&lt;p&gt;Notes from &lt;em&gt;The First Minute: How to Start Conversations that Get Results&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Intro
&lt;ul&gt;
&lt;li&gt;The first 60s are what matter when communicating professionally&lt;&#x2F;li&gt;
&lt;li&gt;Have clear intent&lt;&#x2F;li&gt;
&lt;li&gt;Talk on one topic at a time&lt;&#x2F;li&gt;
&lt;li&gt;Focus on solutions&lt;&#x2F;li&gt;
&lt;li&gt;Steps
&lt;ol&gt;
&lt;li&gt;Frame the conversation in &amp;lt; 15s&lt;&#x2F;li&gt;
&lt;li&gt;Create a structured summary of the entire message&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Causes of miscommunication
&lt;ul&gt;
&lt;li&gt;Lack of context&lt;&#x2F;li&gt;
&lt;li&gt;Unclear purpose&lt;&#x2F;li&gt;
&lt;li&gt;Not getting to the point&lt;&#x2F;li&gt;
&lt;li&gt;Mixing up multiple topics in the same conversation&lt;&#x2F;li&gt;
&lt;li&gt;Giving lengthy, unclear summaries&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Framing
&lt;ul&gt;
&lt;li&gt;Context&lt;&#x2F;li&gt;
&lt;li&gt;Intent&lt;&#x2F;li&gt;
&lt;li&gt;Key message&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Summarization
&lt;ul&gt;
&lt;li&gt;Goal&lt;&#x2F;li&gt;
&lt;li&gt;Problem&lt;&#x2F;li&gt;
&lt;li&gt;Solution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Chapter 1
&lt;ul&gt;
&lt;li&gt;The first minute starts when the work conversation starts&lt;&#x2F;li&gt;
&lt;li&gt;Only 8 good conversations can turn around a &amp;quot;bad first impression&amp;quot;
&lt;ul&gt;
&lt;li&gt;These chances happen continuously during the work day and doesn&#x27;t take that long to add up&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Chapter 2: Framing
&lt;ul&gt;
&lt;li&gt;Preparing your audience to receive your message&lt;&#x2F;li&gt;
&lt;li&gt;First 15s of conversation&lt;&#x2F;li&gt;
&lt;li&gt;Start with 3 statements:
&lt;ul&gt;
&lt;li&gt;Context
&lt;ul&gt;
&lt;li&gt;What is the topic?&lt;&#x2F;li&gt;
&lt;li&gt;Never assume the other person knows what you&#x27;re talking about&lt;&#x2F;li&gt;
&lt;li&gt;Name what the topic&#x2F;tool&#x2F;subject you&#x27;re going to talk about&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Intent
&lt;ul&gt;
&lt;li&gt;What to do with the information?&lt;&#x2F;li&gt;
&lt;li&gt;Categories of intent
&lt;ol&gt;
&lt;li&gt;Needing help&#x2F;advice&#x2F;input&lt;&#x2F;li&gt;
&lt;li&gt;Requesting action&lt;&#x2F;li&gt;
&lt;li&gt;Wanting a decision&lt;&#x2F;li&gt;
&lt;li&gt;Letting somebody know that something is going to happen&lt;&#x2F;li&gt;
&lt;li&gt;Provide information&#x2F;input&lt;&#x2F;li&gt;
&lt;li&gt;Just chatting&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Key message
&lt;ul&gt;
&lt;li&gt;What is the &amp;quot;headline&amp;quot;?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;notes-from-previous-tfc&quot;&gt;Notes from Previous TFC&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;want&#x2F;need
&lt;ul&gt;
&lt;li&gt;invoke peer pressure&lt;&#x2F;li&gt;
&lt;li&gt;team, family, children&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;solving problems
&lt;ul&gt;
&lt;li&gt;constructionist (build puzzle)&lt;&#x2F;li&gt;
&lt;li&gt;destructionist (removing things)&lt;&#x2F;li&gt;
&lt;li&gt;cause &amp;amp; effect&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;instruction
&lt;ul&gt;
&lt;li&gt;list of steps&lt;&#x2F;li&gt;
&lt;li&gt;recipe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;education
&lt;ul&gt;
&lt;li&gt;enabling problem solving&lt;&#x2F;li&gt;
&lt;li&gt;get people to think&lt;&#x2F;li&gt;
&lt;li&gt;what gaps need to be filled&lt;&#x2F;li&gt;
&lt;li&gt;providing knowledge&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;training
&lt;ul&gt;
&lt;li&gt;repetition&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;experience
&lt;ul&gt;
&lt;li&gt;anchoring effect&lt;&#x2F;li&gt;
&lt;li&gt;make a connection&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;feedback
&lt;ul&gt;
&lt;li&gt;becomes a conversation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;problem students
&lt;ul&gt;
&lt;li&gt;be humble&lt;&#x2F;li&gt;
&lt;li&gt;be a human being&lt;&#x2F;li&gt;
&lt;li&gt;allow connection&lt;&#x2F;li&gt;
&lt;li&gt;group dynamics&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;additional-notes&quot;&gt;Additional Notes&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Be mindful of the tone you end a sentence with.
&lt;ul&gt;
&lt;li&gt;Ending with an upward inflection is less threatening but also can make you sound weak or less informed.&lt;&#x2F;li&gt;
&lt;li&gt;Ending with a neutral or downward inflection lends a sense of confidence in the information you are providing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introduction to 4 Wheel Drive</title>
        <published>2022-05-10T00:00:00+00:00</published>
        <updated>2022-05-10T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/intro-to-4-wheel-drive/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/intro-to-4-wheel-drive/</id>
        
        <content type="html">&lt;h1 id=&quot;introduction-to-4-wheel-drive&quot;&gt;Introduction to 4 Wheel Drive&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;notes-from-previous-tfc&quot;&gt;Notes from Previous TFC&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;transfer case
&lt;ul&gt;
&lt;li&gt;full-time&#x2F;part-time - selectable&lt;&#x2F;li&gt;
&lt;li&gt;u-joint: 4 points of connection&lt;&#x2F;li&gt;
&lt;li&gt;birfield: 6 points of connection&lt;&#x2F;li&gt;
&lt;li&gt;no center differential&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;IFS
&lt;ul&gt;
&lt;li&gt;lower unsprung weight&lt;&#x2F;li&gt;
&lt;li&gt;isolates bumps&lt;&#x2F;li&gt;
&lt;li&gt;as one side compresses, the other side does as well&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Traction Aids
&lt;ul&gt;
&lt;li&gt;differential lock
&lt;ul&gt;
&lt;li&gt;selectable&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;center differential failures happen in actuator&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;bearings vs. axel shaft
&lt;ul&gt;
&lt;li&gt;semi float supports weight and rotation&lt;&#x2F;li&gt;
&lt;li&gt;full float only provides rotation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;tires
&lt;ul&gt;
&lt;li&gt;bias ply (not used anymore)&lt;&#x2F;li&gt;
&lt;li&gt;radial&lt;&#x2F;li&gt;
&lt;li&gt;caster F&#x2F;R &amp;quot;casters&amp;quot;&lt;&#x2F;li&gt;
&lt;li&gt;camber L&#x2F;R &amp;quot;off camber&amp;quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>About this Blog</title>
        <published>2022-05-06T00:00:00+00:00</published>
        <updated>2022-05-06T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/about/" type="text/html"/>
        <id>https://bryan-lott.github.io/about/</id>
        
        <content type="html">&lt;h3 id=&quot;why-import-this&quot;&gt;Why (import this)?&lt;&#x2F;h3&gt;
&lt;p&gt;Have always loved easter eggs, open a python terminal and type &lt;code&gt;import this&lt;&#x2F;code&gt; ;). At the same time, I love the simplicity of Clojure and feel like it has embodied, even more-so than Python, the principals in the Zen of Python. Also, it’s a lisp, so you know, parentheses everywhere!  They&#x27;re like ((hugs)) for your code.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;potential-blog-topics&quot;&gt;Potential Blog Topics&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Python&lt;&#x2F;li&gt;
&lt;li&gt;Rust&lt;&#x2F;li&gt;
&lt;li&gt;Clojure&lt;&#x2F;li&gt;
&lt;li&gt;Functional Programming&lt;&#x2F;li&gt;
&lt;li&gt;AWS Technologies&lt;&#x2F;li&gt;
&lt;li&gt;Non-technology specific programming topics (otherwise known as rants)&lt;&#x2F;li&gt;
&lt;li&gt;RPG’s&lt;&#x2F;li&gt;
&lt;li&gt;Tabletop Gaming&lt;&#x2F;li&gt;
&lt;li&gt;4x4 Search and Rescue&lt;&#x2F;li&gt;
&lt;li&gt;Some personal stuff every once in a while&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;about-me&quot;&gt;About Me&lt;&#x2F;h3&gt;
&lt;p&gt;I’m a professional software developer that’s been coding since I ruined gorillas.bas when I was about 8. Currently, I work primarily in Python, SQL, and with Google Cloud technologies focusing on backend&#x2F;data processing.&lt;&#x2F;p&gt;
&lt;p&gt;Known Biases:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Prefers Functional over Object Oriented&lt;&#x2F;li&gt;
&lt;li&gt;Prefers Clojure and Python over Java&lt;&#x2F;li&gt;
&lt;li&gt;Prefers Tabletop Gaming (RPG and Board Games) over Video Games&lt;&#x2F;li&gt;
&lt;li&gt;Socially Liberal&lt;&#x2F;li&gt;
&lt;li&gt;Fiscally Realist&lt;&#x2F;li&gt;
&lt;li&gt;Black Lives Matter&lt;&#x2F;li&gt;
&lt;li&gt;People are people&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hi-Lift Jack</title>
        <published>2022-05-06T00:00:00+00:00</published>
        <updated>2022-05-06T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tfc/hilift/" type="text/html"/>
        <id>https://bryan-lott.github.io/tfc/hilift/</id>
        
        <content type="html">&lt;h1 id=&quot;hi-lift-jack&quot;&gt;Hi-Lift Jack&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;parts&quot;&gt;Parts&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;2r572y21vf2s1oltxh158y45-wpengine.netdna-ssl.com&#x2F;wp-content&#x2F;uploads&#x2F;2016&#x2F;07&#x2F;hilift-parts-diagram.png&quot; alt=&quot;hilift-parts-diagram&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;1. Top clamp-clevis&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;8. Handle socket&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;15. Cross pin&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;2. Top clamp-clevis bolt &amp;amp; nut&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;9. Pitman pin&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;16. Climbing pin&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;3. Standard&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;10. Pitman&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;17. climbing pin spring&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;4. Reversing latch&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;11. Hex bolt &amp;amp; nut&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;18. Small running gear&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;5. Handle clip spring&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;12. Large running gear&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;19. Shear bolt &amp;amp; nut&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;6. Cap screw with washer&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;13. Reversing switch spring&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;20. Foot&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;7. Handle (w&#x2F; cotter pin)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;14. Reversing switch cam bar&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;21. Handle&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;2r572y21vf2s1oltxh158y45-wpengine.netdna-ssl.com&#x2F;wp-content&#x2F;uploads&#x2F;2016&#x2F;07&#x2F;hilift-runninggear-diagram.png&quot; alt=&quot;running-gear-diagram&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;accessories&quot;&gt;Accessories&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Lift Mate
&lt;ul&gt;
&lt;li&gt;Single most useful accessory&lt;&#x2F;li&gt;
&lt;li&gt;Used for lifting wheels&lt;&#x2F;li&gt;
&lt;li&gt;Substitution: a soft shackle, endless loop, or an appropriate length strap&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Off-Road Base
&lt;ul&gt;
&lt;li&gt;Prevents the foot&#x2F;base pushing into the ground&lt;&#x2F;li&gt;
&lt;li&gt;Substitution: a piece of &amp;gt; 3&#x2F;4&amp;quot; plywood&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Off-Road Kit (winching kit)
&lt;ul&gt;
&lt;li&gt;Mostly worthless unless you carry chain with removable hooks of the correct size.&lt;&#x2F;li&gt;
&lt;li&gt;Substitution: 3 carabiners, 2 x-locks, synthetic extensions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Bumper-Lift
&lt;ul&gt;
&lt;li&gt;Mostly worthless unless you have the specific ARB bumpers it was made for.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Handle-Keeper
&lt;ul&gt;
&lt;li&gt;Worth buying, keeps the handle upright and locked to the standard&lt;&#x2F;li&gt;
&lt;li&gt;The newer &amp;quot;quick-fist&amp;quot; style is even better than the kind that slides over the standard and handle&lt;&#x2F;li&gt;
&lt;li&gt;Substitution: anything to keep the handle in the upright position&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;FK-1 Fix-It-Kit
&lt;ul&gt;
&lt;li&gt;Worth buying for the shear pin alone&lt;&#x2F;li&gt;
&lt;li&gt;Cannot swap the shear pin for any bolt from the hardware store&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;First Reponder Jack Conversion Kit
&lt;ul&gt;
&lt;li&gt;The base is the primary thing here, the top clamp clevis comes with the Hi-Lift Extreme as well&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Rescue 42 Jack Mate
&lt;ul&gt;
&lt;li&gt;Worth it if you can find it.&lt;&#x2F;li&gt;
&lt;li&gt;Significantly improved top clamp clevis that is rated for more than the jack&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ratings&quot;&gt;Ratings&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;7,000lb tested capacity (shear bolt)&lt;&#x2F;li&gt;
&lt;li&gt;4660lb WLL (rated capacity)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;uses&quot;&gt;Uses&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;lifting&quot;&gt;Lifting&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Secure the vehicle so as to prevent it from moving once lifted.&lt;&#x2F;li&gt;
&lt;li&gt;Verify the reversing latch is in the upright position.&lt;&#x2F;li&gt;
&lt;li&gt;Bring the jack to the lifting point.&lt;&#x2F;li&gt;
&lt;li&gt;Pull the handle straight up until the nose of the jack is close or in contact with the lifting point.&lt;&#x2F;li&gt;
&lt;li&gt;Holding the standard with one hand (keep thumbs out of pinch zones), cycle the handle through 2-3 clicks until the jack will stand on its own.&lt;&#x2F;li&gt;
&lt;li&gt;Step back from the jack and verify it is in line with gravity (using trees nearby as a gauge if necessary).&lt;&#x2F;li&gt;
&lt;li&gt;Continue cycling the jack putting two hands on or finding a second person to help cycle the jack until the necessary lifting is complete.&lt;&#x2F;li&gt;
&lt;li&gt;Use the handle keeper to keep the jack in the upright position while working with the vehicle elevated. Caution! The jack and vehicle are both now unstable.&lt;&#x2F;li&gt;
&lt;li&gt;When ready to lower, take off the handle keeper and keep the handle in the upright position. Verify your body is out of the way of the jack and vehicle. Smack the reversing latch with the palm of your hand.&lt;&#x2F;li&gt;
&lt;li&gt;Carefully lower the handle until the trigger point. Put both hands on and push down, this will feel very weird until you&#x27;ve done it a few times.&lt;&#x2F;li&gt;
&lt;li&gt;Resist the handle until it has cycled back to the &amp;quot;click&amp;quot; point.&lt;&#x2F;li&gt;
&lt;li&gt;Repeat until the vehicle only has a little weight on the jack.&lt;&#x2F;li&gt;
&lt;li&gt;Once the nose no longer has much weight on it, it will free fall. Make sure any body parts are out of the way.&lt;&#x2F;li&gt;
&lt;li&gt;Reset the reversing latch to the up position.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;casting&quot;&gt;Casting&lt;&#x2F;h4&gt;
&lt;p&gt;This can be an effective way to move a high centered vehicle off of an obstacle.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Verify that the vehicle, once it moves, will not fall back down on another obstacle and cause additional damage.&lt;&#x2F;li&gt;
&lt;li&gt;Raise the vehicle.&lt;&#x2F;li&gt;
&lt;li&gt;Have good communication with the driver of the vehicle.&lt;&#x2F;li&gt;
&lt;li&gt;Verify the direction of travel and stand &lt;em&gt;behind&lt;&#x2F;em&gt; where the vehicle will move.&lt;&#x2F;li&gt;
&lt;li&gt;Have the jack in the raise position.&lt;&#x2F;li&gt;
&lt;li&gt;Have the handle of the jack down with two hands on.&lt;&#x2F;li&gt;
&lt;li&gt;Your job is only to guide the jack away from the vehicle so that the jack does not get pinned under the vehicle.&lt;&#x2F;li&gt;
&lt;li&gt;Have the driver slowly drive off the jack.&lt;&#x2F;li&gt;
&lt;li&gt;As they do so, guide the jack away from the vehicle making sure to not put yourself in harms way.&lt;&#x2F;li&gt;
&lt;li&gt;Repeat as necessary.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The same procedure can be used to turn a vehicle sideways.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Set the jack at an angle leaning toward the direction of desired movement.&lt;&#x2F;li&gt;
&lt;li&gt;This may require more or less angle. Distance is achieved with a greater angle. Height is achieved with a shallower angle. Depending on the terrain and obstacles, either may be necessary.&lt;&#x2F;li&gt;
&lt;li&gt;Raise the jack and let the vehicle fall off of the jack as it reaches its unstable point.&lt;&#x2F;li&gt;
&lt;li&gt;Do not try to stop the vehicle from falling or the jack from moving.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;spreading&quot;&gt;Spreading&lt;&#x2F;h3&gt;
&lt;p&gt;Setting the area to be spread between the base&#x2F;top clamp clevis and the nose of the jack (facing outward away from one another). Very similar to lifting.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;clamping&quot;&gt;Clamping&lt;&#x2F;h3&gt;
&lt;p&gt;Setting the area to be clamped between the top clamp clevis and the nose of the jack (facing inward toward one another).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;winching&quot;&gt;Winching&lt;&#x2F;h3&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Write It Down Yo</title>
        <published>2020-11-10T00:00:00+00:00</published>
        <updated>2020-11-10T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/write-it-down-yo/" type="text/html"/>
        <id>https://bryan-lott.github.io/write-it-down-yo/</id>
        
        <content type="html">&lt;p&gt;Related to your professional job&#x2F;career, quickly, what&#x27;s in your head that isn&#x27;t in someone else&#x27;s?  Why haven&#x27;t you written it down?  No, really, go write that down now.  Even if it&#x27;s a single sentence.  Have you done it yet?&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a fun test.  Either way, go make yourself come coffee or tea or a sandwich or something that&#x27;ll force you to context switch.  Now, come back to whatever-it-was you had in your brain.  If you wrote it down, you can easily pick up where you left off.  If not, well, good luck to you.&lt;&#x2F;p&gt;
&lt;p&gt;Humans have a pretty terrible working memory.  The old adage is 7 +&#x2F;- 2.  Remember, that&#x27;s for very simple things.  In business&#x2F;software&#x2F;etc we&#x27;re rarely dealing with simple things.  Communicating those complex ideas to others becomes much easier when we write it down.  It forces us to clarify what we&#x27;re trying to communicate.  Bonus points if you include pictures or diagrams.&lt;&#x2F;p&gt;
&lt;p&gt;This leads me to my next point: if you don&#x27;t write something down, from your employer&#x27;s perspective &lt;em&gt;it doesn&#x27;t exist&lt;&#x2F;em&gt;.  Wait, what?  Yeah.  If anything were to happen to you, that knowledge, all the time spent figuring something out is now gone, wasted.  Remember the last cool idea you had for making something better?  Imagine it gone from the world, permanently.&lt;&#x2F;p&gt;
&lt;p&gt;Feel that?  Sucks doesn&#x27;t it?  Now you know what happens every time someone doesn&#x27;t write something down.  How many ideas, learnings, etc have been lost from the world because no one bothered to write it down?&lt;&#x2F;p&gt;
&lt;p&gt;Now that more people are working remotely it has exposed one of the greatest business risks: business tribal knowledge.  Or, more explicitly, the fun conversations that happen between employees when they work in the same physical space.  Talking about ideas tends to cement them into more brains than just one.  But, again, if something happens, those ideas disappear.  Working from home is effectively reducing the amount of business tribal knowledge.  Let me be clear, this is &lt;em&gt;a good thing&lt;&#x2F;em&gt;.  Business tribal knowledge is business risk.  Unfortunately, I see far too few people &lt;em&gt;writing down&lt;&#x2F;em&gt; that knowledge in a form that someone else can access which is increasing the business risk even if it&#x27;s decreasing tribal knowledge.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to make a splash at your current (or future) company, write things down as you learn them.  Once you&#x27;ve written them down, make sure they&#x27;re accessible to others.  Bonus points if you timestamp everything.  Next time your manager or coworker asks you about that-process-that-only-you-know-about, link them to where you wrote down how it works and make yourself available for questions.  BOOM, bonus points.  You&#x27;ve just generated business value and become a force multiplier instead of a roadblock.  It&#x27;s also something you can bring up when it comes around to review&#x2F;salary time.&lt;&#x2F;p&gt;
&lt;p&gt;Even better, when you leave that position, no matter the reason, you&#x27;re going to leave a much better taste in everyone&#x27;s mouth when they go to ask you about a thing.  You&#x27;re no longer there, but there&#x27;s documentation they can reference.  There&#x27;s a piece of you still around that&#x27;s still being &lt;em&gt;helpful&lt;&#x2F;em&gt;.  People tend to remember stuff like that and at worst, you&#x27;re remembered more fondly.  The business world is a lot smaller than we assume.  People talk, change jobs, and you run into them in the future.&lt;&#x2F;p&gt;
&lt;p&gt;In summary, write stuff down, make sure other people can access it, and make the world just a tiny bit better.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CSV Primer</title>
        <published>2020-01-10T00:00:00+00:00</published>
        <updated>2020-01-10T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/csv-primer/" type="text/html"/>
        <id>https://bryan-lott.github.io/csv-primer/</id>
        
        <content type="html">&lt;p&gt;Parsing certain data formats can be more challenging than others.  One of the granddaddy&#x27;s of challenging file formats is the humble CSV or &amp;quot;comma separated value&amp;quot; file (I&#x27;ve also heard &amp;quot;character separated value&amp;quot;).  The lack of a strong specification as well as adherance to a specification is what makes parsing these files particularly challenging at times.&lt;&#x2F;p&gt;
&lt;p&gt;Given the experiences I&#x27;ve had over the past few months parsing over 40 different source file formats, here&#x27;s a few ways to not make your own (or other) developer&#x27;s pull &lt;em&gt;all&lt;&#x2F;em&gt; their hair out.&lt;&#x2F;p&gt;
&lt;p&gt;For the record, I&#x27;ve seen all of these in the wild.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;one-record-per-row&quot;&gt;One record per row&lt;&#x2F;h2&gt;
&lt;p&gt;Seriously.  There&#x27;s a reason why I&#x27;m putting this first.  I don&#x27;t care if the row has 2 columns or 500, but if you&#x27;re spreading records over multiple rows, everyone involved is going to have a bad time.&lt;&#x2F;p&gt;
&lt;p&gt;Bad:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,image,image_position
1,dining room table,image1,1
1,,image2,3
1,,image3,2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Better:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,images
1,dining room table,image1,image3,image2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also Better:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,images
1,dining room table,&amp;quot;image1,image3,image2&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also also better:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,image1,image2,image3,image4,image5
1,dining room table,image1,image3,image2,,
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;one-file&quot;&gt;One file&lt;&#x2F;h2&gt;
&lt;p&gt;Trust me, it&#x27;s &lt;em&gt;much&lt;&#x2F;em&gt; easier to parse records when they&#x27;re all in the same file and not spread out over, say, a &amp;quot;data&amp;quot; file, &amp;quot;price&amp;quot; file, and &amp;quot;inventory level&amp;quot; file.  All the data in one place.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;have-a-header&quot;&gt;Have a header&lt;&#x2F;h2&gt;
&lt;p&gt;If there&#x27;s no header, we don&#x27;t know what your data is.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;have-the-header-be-the-first-line&quot;&gt;Have the header be the first line&lt;&#x2F;h2&gt;
&lt;p&gt;If it&#x27;s not the first line, it can be worked around in most cases, but that&#x27;s additional customization, which introduces fragility.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;each-row-should-have-the-same-number-of-fields-as-the-header&quot;&gt;Each row should have the same number of fields as the header&lt;&#x2F;h2&gt;
&lt;p&gt;Hopefully self-explanatory&lt;&#x2F;p&gt;
&lt;p&gt;Bad:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,image
1,stuffed bear
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also Bad:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,image
1,stuffed bear,image1,image2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Best:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;id,title,image
1,stuffed bear,
2,table,image1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;delimiters&quot;&gt;Delimiters&lt;&#x2F;h2&gt;
&lt;p&gt;Long story short, I don&#x27;t care which one you use, but use one that&#x27;s not used in your data.  For instance, if your data has commas, maybe don&#x27;t use them as a field separator?&lt;&#x2F;p&gt;
&lt;p&gt;Bad:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;testing,1,2,3,what are we having, adam, for lunch?
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Best:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;testing, 1, 2, 3|what are we having, adam, for lunch?
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;quoting&quot;&gt;Quoting&lt;&#x2F;h2&gt;
&lt;p&gt;If you &lt;em&gt;must&lt;&#x2F;em&gt; use a delimiter that your data also contains, quote the fields and be consistent.  Yes, I realize most csv parsers can handle some fields being quoted and others not, but it does make things a headache if something goes wrong.&lt;&#x2F;p&gt;
&lt;p&gt;For the love of everything that is holy, do NOT use smart quotes as delimiters!!!  Especially if you use smart quotes in your data!&lt;&#x2F;p&gt;
&lt;p&gt;Bad:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;testing,1,2,3,what are we having, adam, for lunch?
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, so, so bad:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;“testing,1,2”,3,“what are we having, adam, for lunch?”
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Better:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;&amp;quot;testing,1,2&amp;quot;,3,&amp;quot;what are we having, adam, for lunch?&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Best:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;csv&quot; class=&quot;language-csv &quot;&gt;&lt;code class=&quot;language-csv&quot; data-lang=&quot;csv&quot;&gt;&amp;quot;testing,1,2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;what are we having, adam, for lunch?&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;line-endings&quot;&gt;Line Endings&lt;&#x2F;h2&gt;
&lt;p&gt;This is what determines where a new line&#x2F;record starts.&lt;&#x2F;p&gt;
&lt;p&gt;Please please please use just &lt;code&gt;\n&lt;&#x2F;code&gt; for a line ending, &lt;code&gt;\r\n&lt;&#x2F;code&gt; works too.  If you must, use just &lt;code&gt;\r&lt;&#x2F;code&gt;.  Finally, don&#x27;t mix them, please!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;encoding&quot;&gt;Encoding&lt;&#x2F;h2&gt;
&lt;p&gt;It seems like the world is starting to standardize on UTF-8.  Means you should probably do the same.  Multiple encodings means the parser has to try the most common first, if that fails, try a fallback, etc.  This has both data quality and performance implications.  Neither of which you want.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;entire-data-set-vs-update&quot;&gt;Entire Data Set vs. Update&lt;&#x2F;h2&gt;
&lt;p&gt;This gets into the weeds a bit, but providing all the data all the time is the easiest way to both provide and parse data.  It allows whomever you&#x27;re sending the data to reprocess the entire dataset if something goes wrong.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, if the data is truly immense (gigabytes or terabytes of data), I&#x27;d recommend an interval setup.  Basically every so often send the entire data set, and in the meantime, send only the records that have changed, BUT, send the entire record, not just the data in the record that changed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deletes&quot;&gt;Deletes&lt;&#x2F;h2&gt;
&lt;p&gt;This is probably the hardest bit to handle.  I&#x27;ve seen two ways to handle it and both have their advantages and drawbacks.  In my experience, the &amp;quot;Absence Indicates Delete&amp;quot; tends to be less error prone as long as the consumer is handling unexpected source files appropriately.&lt;&#x2F;p&gt;
&lt;p&gt;For the engineers reading this, it&#x27;s the difference between the transfer of an entire system of state (single file) vs. state with multiple inputs that can get out of sync (delete file).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;absence-indicates-delete&quot;&gt;Absence Indicates Delete&lt;&#x2F;h3&gt;
&lt;p&gt;Basically if a record that already exists on the consumer of the csv isn&#x27;t included in the provided csv it&#x27;s deleted (or marked for delete or hidden, I&#x27;m treating these conditions the same for this post).&lt;&#x2F;p&gt;
&lt;p&gt;This has the advantage of not having to parse an additional file.&lt;&#x2F;p&gt;
&lt;p&gt;The disadvantage is that if either the csv file provided isn&#x27;t what&#x27;s expected or something goes wrong on the consumer side, an entire dataset can be deleted.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;delete-only-file&quot;&gt;Delete-only File&lt;&#x2F;h3&gt;
&lt;p&gt;Essentially this file would be a list of the records to be deleted.&lt;&#x2F;p&gt;
&lt;p&gt;Has the advantage of being less error prone if the source csv is bad in some way.&lt;&#x2F;p&gt;
&lt;p&gt;The disadvantage here is twofold.  First, needing to provide and parse a second file with a different format than the standard data file.  Second, timing.  If the consumer sees both the data file and the delete file at the same time and a record is included in both, which one takes precedence?  Data or delete?  If a record has been deleted in the past and it&#x27;s now seen in the data file, should it be created or ignored?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;So, what&#x27;s the upshot of all this?  Similar to dealing with &lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=-5wpm-gesOY&quot;&gt;timezones&lt;&#x2F;a&gt;, don&#x27;t build your own csv generator&#x2F;parser.  Use one from someone that&#x27;s already gone through all these headaches.  Stand on the shoulders of those giants.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re a product person reading this, my only advice to you is: listen to your engineers.  They know how hard dealing with csv files is and they&#x27;re just trying to get the business result you want given the constraints they&#x27;re operating under.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>ETL Tracers</title>
        <published>2020-01-02T00:00:00+00:00</published>
        <updated>2020-01-02T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/etl-tracers/" type="text/html"/>
        <id>https://bryan-lott.github.io/etl-tracers/</id>
        
        <content type="html">&lt;p&gt;Firing visible data at a target to see if you hit&lt;&#x2F;p&gt;
&lt;p&gt;ETL (Extract-Transform-Load) pipelines are notoriously complex and opaque.  I&#x27;ve always wanted something to pierce the opaqueness I&#x27;ve experienced on many ETL projects.  I&#x27;ll take a wild guess I&#x27;m not the only one.  What follows is an idea I had around five years ago to pierce that opaqueness along with the experience I&#x27;ve had implementing it.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;ve watched any war or action movies, you&#x27;ve seen tracer rounds.  These are rounds designed to light up so that the person firing knows where their rounds are going downrange.  Typical rounds are invisible to the eye.  For more info, see &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Tracer_ammunition&quot;&gt;wikipedia&lt;&#x2F;a&gt;.  This is an idea that we can apply to ETL pipelines to give a sense of whether the invisible data is &amp;quot;on target.&amp;quot;&lt;&#x2F;p&gt;
&lt;p&gt;We can apply the same concept to give us visibility into the inter pipeline.  Using traditional monitoring solutions it&#x27;s easy to see if services are up and running or the underlying box is struggling.  It&#x27;s much harder to see whether the data flowing through is correct.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-not-make-all-records-visible&quot;&gt;Why not make all records visible?&lt;&#x2F;h2&gt;
&lt;p&gt;Not all rounds in a given magazine are tracer rounds for a few reasons.  Tracer rounds are less lethal because they contain less mass than a standard round.  They&#x27;re more complex (more expensive) to manufacture.  It&#x27;s also not necessary.  From what little reading I&#x27;ve done, around every 5th round is a tracer round.  That&#x27;s enough to give the gunner a sense of where they&#x27;re shooting without the downsides of every round being a tracer.&lt;&#x2F;p&gt;
&lt;p&gt;A similar effect happens with data packets (record, a batch of records, row, etc) in an ETL pipeline.  Logs&#x2F;metrics have extra overhead, especially if you&#x27;re emitting an entire data packet.  That overhead comes in the forms of network, processing, storage, and cognitive load when trying to interpret the results.  It&#x27;s also not necessary as long as you have a representative sample of the data flowing through.  All we need to do is tag every n-th packet of data with a &amp;quot;tracer&amp;quot; flag and make sure all our code emits those tracers when they&#x27;re seen.  Otherwise, process them as normal.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zoom-and-enhance&quot;&gt;Zoom and Enhance!&lt;&#x2F;h2&gt;
&lt;p&gt;What if we could take the idea one step further?  If we emit data as it&#x27;s already flowing through the pipeline, we have to do extra analysis when we examine those packets to determine if there are any errors in the pipeline, etc.&lt;&#x2F;p&gt;
&lt;p&gt;Instead, if we hand-craft tracer packets it gives us absolute control over the content of the packet.  We can cover edge and corner cases and we know what the result should be at every step.  Think of this with the same mindset you craft unit tests.&lt;&#x2F;p&gt;
&lt;p&gt;Also, we can encode this information for every step in the pipeline.  The results of each of the extract, transform, and load steps should look very different from one another.  If we do this, then each step in the pipeline can emit a diff of what the output should be versus what it actually is.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wait-this-is-just-tests&quot;&gt;Wait, this is just tests?!&lt;&#x2F;h2&gt;
&lt;p&gt;Yep.  But it&#x27;s testing you have the option of running in any environment (including production).  It&#x27;s tests you can use in development if you want to throw a new data source into the pipeline.  It&#x27;s regression tests that automatically tell you if you&#x27;re now casting something to an int where it was a string before.  If you&#x27;re running it in production, it can be a monitoring system for your ETL pipeline.  I.e., if you haven&#x27;t seen tracers in n-minutes at the loader, either the transformer is having problems or the transport mechanism between the transformer and loader has failed.  It narrows down the number of places you need to check to look for failures.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benefits-of-tracers&quot;&gt;Benefits of Tracers&lt;&#x2F;h2&gt;
&lt;p&gt;In my own implementation of the idea, we found that local development of new data sources was orders of magnitude faster.  In addition, we had regression tests we could run at a moment&#x27;s notice to confirm that the 40+ data sources we were using hadn&#x27;t broken because we fixed a bug with the 41st source.&lt;&#x2F;p&gt;
&lt;p&gt;We had several data sources change their format without telling us.  Using the tracer concept we were able to create a new tracer based on the new format and restore the source within a few hours.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;so-how-do-i-create-a-tracer&quot;&gt;So... how do I create a tracer?&lt;&#x2F;h2&gt;
&lt;p&gt;My process is pretty simple.  I take a representative record from the source data and then hand-craft what I expect it to look like at the extract, transform, and load steps.  Like any good test I then take that representative record and change the input to explore the testing space.  Any good set of tests should hit happy paths, edge cases, corner cases, and known failure cases.  Tracers are no different.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-are-the-components-of-a-tracer&quot;&gt;What are the components of a tracer?&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;source-data&quot;&gt;Source Data&lt;&#x2F;h3&gt;
&lt;p&gt;This is as close as you can get to what the source data looks like.  Remember, this record is going to be flowing through your system like a regular record would.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;extract-transform-load-expected-data&quot;&gt;Extract&#x2F;Transform&#x2F;Load Expected Data&lt;&#x2F;h3&gt;
&lt;p&gt;This is the expected output of each of these three stages.  Include only the ones you feel are necessary.  In my case, the transformer is the most critical step and as such, we crafted tracers around identifying transformer problems.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;example-tracer&quot;&gt;Example Tracer&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;tracer_happy_path:
  input_record:  &amp;quot;id,name,cost\n1234,test name with single&amp;#x27; quotes,1234.5&amp;quot;
  transform_output_record:
    id: 1234
    title_case_name: Test Name With Single&amp;#x27; Quotes
    float_price: 1234.50
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;awesomesauce-where-can-i-get-this-code&quot;&gt;Awesomesauce, where can I get this code?&lt;&#x2F;h2&gt;
&lt;p&gt;The idea isn&#x27;t well-formed enough to turn into a library yet.  It requires the ETL pipeline know too much about the tracer implementation for the two concepts to decouple them at the moment.  I was, however, able to implement the idea in less than 200 lines of Python code for my particular case.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lessons-learned-in-implementation&quot;&gt;Lessons Learned in Implementation&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Hand-crafting these data packets can be tedious and annoying.  They&#x27;re hard to get right.&lt;&#x2F;li&gt;
&lt;li&gt;You need to drop tracer packets need to &lt;em&gt;just&lt;&#x2F;em&gt; before they&#x27;d end up in permanent storage.  I.e., if you&#x27;re inserting into a relational database, run all the inserts&#x2F;updates&#x2F;etc, and then roll back the transaction.&lt;&#x2F;li&gt;
&lt;li&gt;Depending on the language and implementation of this idea, the code needed to handle the tracers can add a lot of visual noise to the code.  Obviously, this is something that can be refactored and fixed, but it is a hazard.  In my case I used Python context managers and function decorators.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;key-ideas&quot;&gt;Key Ideas&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Tracers are intentionally crafted data packets that the ETL pipeline knows to emit a &lt;em&gt;diff&lt;&#x2F;em&gt; between expected and actual.&lt;&#x2F;li&gt;
&lt;li&gt;Tracers should flow through as much of the ETL pipeline machinery as possible including storage.&lt;&#x2F;li&gt;
&lt;li&gt;Tracers should either be ignored by downstream processes or they should be deleted&#x2F;rolled back from storage.&lt;&#x2F;li&gt;
&lt;li&gt;Think of tracers as constant end-to-end tests.  They should cover as many edge and corner cases as possible.&lt;&#x2F;li&gt;
&lt;li&gt;Tracers act as an early-warning system of deviated behavior, code regressions, data integrity issues.&lt;&#x2F;li&gt;
&lt;li&gt;Tracers act, as a side effect, as a monitoring system for the ETL pipeline (if you&#x27;re not seeing tracers every n-minutes, something&#x27;s wrong).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2019 Year in Review</title>
        <published>2019-12-31T00:00:00+00:00</published>
        <updated>2019-12-31T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/year-in-review/" type="text/html"/>
        <id>https://bryan-lott.github.io/year-in-review/</id>
        
        <content type="html">&lt;p&gt;Apparently I missed doing one of these last year.  Oh well.  This year has been difficult and challenging and pretty amazing all rolled into one.  First, I read (and listened) to a lot more books than I realized.  That&#x27;s amazing.  I grew up a voracious reader and somehow got out of the habit.  Needless to say, I think I&#x27;m back in the groove and just need to keep up the habit!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;books&quot;&gt;Books&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;audio&quot;&gt;Audio&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;It Burns (Marc Fennell)
&lt;ul&gt;
&lt;li&gt;Short and fascinating story about the hottest of the hot peppers.  Sounds boring I know, but I was pretty captivated on my way home from Burning Man by it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Extreme Ownership (Leif Babin, Jocko Willink)
&lt;ul&gt;
&lt;li&gt;Pretty much required reading&#x2F;listening if you&#x27;re a leader in any capacity.  The intro and acknowledgements are pretty similar.  Don&#x27;t hesitate fast forward through those and read them later.  To a non-military person it&#x27;s very &amp;quot;hoo-rah&amp;quot; b.s. that detracts from the actual work itself.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Dichotomy of Leadership (Leif Babin, Jocko Willink)
&lt;ul&gt;
&lt;li&gt;While it would still make sense without the first book, I&#x27;d seriously consider reading Extreme Ownership first because this book builds on the last and does a deeper dive into the nuances of leadership and the balance therein.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;When Breath Becomes Air (Paul Kalanithi)
&lt;ul&gt;
&lt;li&gt;Wow.  This one is a hard read&#x2F;listen.  Can&#x27;t recommend it highly enough, but damn.  It really puts into perspective the fragility and strength of being human.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Crash Test Girl (Kari Byron)
&lt;ul&gt;
&lt;li&gt;This was a great read.  While I hesitate to compare it to Adam Savage&#x27;s book (they were both MythBusters), it&#x27;s really fun and I can&#x27;t get enough of reading biographical-like books.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Everything is F*cked (Mark Manson)
&lt;ul&gt;
&lt;li&gt;Hold onto your seats for the (from my perspective) rapid left turn the end of the book makes.  Beyond that, there&#x27;s a certain cadence to Manson&#x27;s writing that I really enjoy.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Every Tool&#x27;s a Hammer (Adam Savage)
&lt;ul&gt;
&lt;li&gt;Can&#x27;t say enough good about this book.  Savage is definitely someone I look up to and this is a fun, idiosyncratic look at his process, how he thinks about things, etc.  If nothing else, the chapter on lists and list making was potentially life-changing for me.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Spy the Lie (Michael Floyd)
&lt;ul&gt;
&lt;li&gt;Was a bit disappointed in this sadly.  It&#x27;s interesting, but I wouldn&#x27;t go out of my way to re-listen to it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;dead-tree&quot;&gt;Dead-Tree&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Every Tool&#x27;s a Hammer (Adam Savage)
&lt;ul&gt;
&lt;li&gt;Yes, I listened to and read this book.  It&#x27;s absolutely worth doing both.  I find I get better comprehension and retention by reading but listening to Adam really drove home his passion for making.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;What If? (Randall Munroe)
&lt;ul&gt;
&lt;li&gt;Anything by Munroe is considered mandatory ready for me.  Smart, funny, and just all around a good time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;How To (Randall Munroe)
&lt;ul&gt;
&lt;li&gt;Same with this one.  Really hoping that Munroe continues to write books (and &lt;a href=&quot;https:&#x2F;&#x2F;xkcd.com&quot;&gt;XKCD&lt;&#x2F;a&gt; comics!)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Deep Work (Cal Newport)
&lt;ul&gt;
&lt;li&gt;Newport puts into words very eloquently what I&#x27;ve felt for a long time about the kind of work that I do (software development) and exactly why open offices and manager schedules destroy my productivity.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Street Freaks (Terry Brooks)
&lt;ul&gt;
&lt;li&gt;The last time I read Terry Brooks was probably in middle or high school with the Shannara books.  This is a complete depart from that to a cyber&#x2F;bio punk future that I really enjoyed.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The End of Night (Paul Bogard)
&lt;ul&gt;
&lt;li&gt;Very sad but meaningful read.  Definitely makes you wonder what else we&#x27;ve lost as a society as we&#x27;ve lost the night sky.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;A Burglar&#x27;s Guide to the City (Manaugh)
&lt;ul&gt;
&lt;li&gt;A book that I&#x27;d wanted to read for quite some time, but sadly it didn&#x27;t stick with me.  Definitely some interesting ways of looking at architecture but the book meandered a bit.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Scene that Became Cities (Caveat Magister)
&lt;ul&gt;
&lt;li&gt;Started reading this at Burning Man this year and immediately stopped when I realized what I was doing (spectating instead of participating).  For anyone that wants to learn more about the culture and philosophy that underlies a lot of Burning Man, required reading.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Outgrowing God (Richard Dawkins)
&lt;ul&gt;
&lt;li&gt;Honestly, I was hoping for more with this one.  It felt surprisingly shallow and uninspiring.  I&#x27;ve been slowly distancing myself from &amp;quot;spiritual&amp;quot; practices for some time now.  Mostly because I haven&#x27;t been able to get much out of it.  I was hoping for more of a guide, I guess?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Practical Lock Picking (Deviant Ollam)
&lt;ul&gt;
&lt;li&gt;If you want to understand locks and how they provide only the facade of security in our world, mandatory reading.  Any talks by Deviant are also incredibly eye-opening and highly recommended.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Simple Minded (Daniel Vincennie)
&lt;ul&gt;
&lt;li&gt;Not entirely sure if this is fiction, half fiction, or non fiction.  It felt like a fever dream and if that was the author&#x27;s intention, it worked really well.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Psychedelic Explorer&#x27;s Guide (James Fadiman)
&lt;ul&gt;
&lt;li&gt;Not just for psychadelic explorers, but helpful guide for anyone facing a different&#x2F;difficult&#x2F;challenging mindset or someone that wants to provide support to someone going through difficult &amp;quot;stuff&amp;quot;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;podcasts&quot;&gt;Podcasts&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Accuracy Third
&lt;ul&gt;
&lt;li&gt;This podcast really got me through the year and was primarily responsible for giving me the confidence to go to Burning Man for the first time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Critical Role
&lt;ul&gt;
&lt;li&gt;I finally finished Campaign 1!  Looking to Campaign 2... I think I&#x27;m going to wait a bit before I dive back in.  Don&#x27;t get me wrong, I love this podcast, but 3-4 hours per episode means there&#x27;s not a lot of time for other listening.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Something Else
&lt;ul&gt;
&lt;li&gt;Brand new podcast, really looking forward to seeing where this goes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Mormon and the Meth Head
&lt;ul&gt;
&lt;li&gt;Got turned onto this one by my significant other.  Haven&#x27;t had as much time to listen to it as I&#x27;d like but it&#x27;s highly recommended.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Important Thing
&lt;ul&gt;
&lt;li&gt;Rands in Repose&#x27;s podcast.  Again, not as much time as I&#x27;d like to be able to listen to it.  It&#x27;ll probably fill in at least some of the time that I was spending on Critical Role.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;cool-stuff-done&quot;&gt;Cool Stuff Done&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Burning Man
&lt;ul&gt;
&lt;li&gt;Really deserves its own blog post&#x2F;series.  Amazing and challenging in all the ways I needed.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;3D Printing
&lt;ul&gt;
&lt;li&gt;This is an entire hobby all its own.  Very cool technology that&#x27;s coming up to the point where it&#x27;s almost ready for a consumer audience, not just a hobby audience.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;D&amp;amp;D 5e
&lt;ul&gt;
&lt;li&gt;Continued playing awesome games with my (now) standard gaming group.  For anyone that hasn&#x27;t played D&amp;amp;D (or other tabletop role playing game) I highly recommend it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Drowning in a Sea of Complexity</title>
        <published>2019-10-23T00:00:00+00:00</published>
        <updated>2019-10-23T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/drowning-in-a-sea-of-complexity/" type="text/html"/>
        <id>https://bryan-lott.github.io/drowning-in-a-sea-of-complexity/</id>
        
        <content type="html">&lt;p&gt;When&#x27;s the last time you looked a piece of code and went &amp;quot;ugggh, I don&#x27;t want to try to figure out what this does, it&#x27;s so complex?!&amp;quot;  Yesterday?  Today?  The reason why you&#x27;re reading a blog and not reading&#x2F;writing code? ;)&lt;&#x2F;p&gt;
&lt;p&gt;We programmers reach for complexity like it’s goddamn instinctual.&lt;&#x2F;p&gt;
&lt;p&gt;Wait, let me back up. What is complexity?&lt;&#x2F;p&gt;
&lt;p&gt;According to Rich Hickey, it’s the interweaving&#x2F;interleaving&#x2F;braiding of things. For instance, if you have a function with “and” in the name, you’re complecting (adding complexity to) the function. It should be separate functions.&lt;&#x2F;p&gt;
&lt;p&gt;I just mentioned functions… not methods. Classes, for instance, complect data and operations on data (functions). According to the object-oriented tradition, this is a good thing. It provides encapsulation and a whole slew of other things.  Sometimes this is necessary and sometimes not.  When was the last time you wrote a class where the class was the &lt;em&gt;only&lt;&#x2F;em&gt; thing that operated on its internal state?  You may have started out with good intentions for that class, but you know what they say about the road to hell.&lt;&#x2F;p&gt;
&lt;p&gt;But, where am I going with this? Complexity == bad, simplicity == good? Well, yeah, I doubt anyone is going to disagree with that, but let’s dive in a bit deeper.&lt;&#x2F;p&gt;
&lt;p&gt;How many things can you hold in your head at one time? A common accepted value is 7 +&#x2F;- 2 [citation needed]. Great, but that’s for digits, integers, very simple concepts. How many variables can you keep in your head? How much state? How many classes operating on one another at the same time? I’m guessing a lot fewer than 7 unless you’re extraordinary and then you might hit 7. But the thing is, that’s not much different than hitting 2. It’s not an order of magnitude better. So what do we do?&lt;&#x2F;p&gt;
&lt;p&gt;“Well, then we reach for abstractions!” you, imaginary person on the other side of this conversation, say.&lt;&#x2F;p&gt;
&lt;p&gt;Great, abstractions. In theory they sound like the silver bullet. If I create a container that encapsulates a ton of other things, then I’ve reduced the number of things I need to keep track of. One problem though, abstractions tend to be leaky.&lt;&#x2F;p&gt;
&lt;p&gt;How many of them are leaky? Hah! Trick question! All of them! What do I mean by leaky though? It’s pretty simple; an abstraction leaks when you need to know something about the underlying implementation. That’s it. And that’s why abstractions can be so difficult to deal with. Needing to keep the underlying implementation details in your head on top of the local state and it’s no wonder we write buggy, broken code.&lt;&#x2F;p&gt;
&lt;p&gt;Two of my favorite abstractions to reach for in this discussion are SQL and ORM&#x27;s.  In theory, ORM&#x27;s make your life soooo much easier!  Instead of writing SQL you just use the framework&#x27;s classes.  Until you can&#x27;t.  Either due to performance or a complex business requirement, you have to drop down to SQL.  Bam, the abstraction has leaked as is no longer relevant.  And, since you know this is likely to happen in most use-cases for ORM&#x27;s, why pick one up in the first place?  Because it&#x27;s easy and who doesn&#x27;t want easy?  In my opinion, a large number of &amp;quot;easy&amp;quot; abstractions get you nothing, all they do is kick the can a little further down the road. At some point, you’ve gotta pick up the can and figure out where it came from.&lt;&#x2F;p&gt;
&lt;p&gt;So, what do we do? My answer is look to the data that we’re schlepping around. When you boil down what developers do, we manipulate data. That’s it. Whether that data comes in the form of submitted form data, a stream of stock market prices, or a timer timing out. It’s all data. That’s it. Data.&lt;&#x2F;p&gt;
&lt;p&gt;So why are we building (leaky!) &lt;del&gt;abstractions&lt;&#x2F;del&gt; misdirections to hide the data from us? I spent two weeks, that I’m never getting back by the way, adding an extractor&#x2F;mapper&#x2F;persister to an existing microservice. This microservice was already consuming JSON, was already mapping other bits of the JSON, and was already persisting the mapped bits to a database.&lt;&#x2F;p&gt;
&lt;p&gt;TWO WEEKS. To persist an extra bit of the exact same JSON.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe I’m a terrible dev, it’s possible. Or maybe we, as an industry, are drowning in complexity we added ourselves in the hopes that we’d be able to keep more things in our head at once. I’m sure we had great reasons at the time to reach for complexity in the name of &amp;quot;easy&amp;quot;. Business constraints, feature requests, broken code, etc.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;“No matter how far you have gone on the wrong road, turn back.” Turkish Proverb [citation needed]&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Again, it all goes back to data. A new&#x2F;old concept seems to be rising up again. Data Driven Development. Think about that for a minute. What it means is going back to our roots as developers. Moving and manipulating data. That’s all we do. And there’s no shame in doing that! Businesses pay us a lot of money to move data back and forth!&lt;&#x2F;p&gt;
&lt;p&gt;Instead of thinking about our programs as collections of objects, we should be thinking of them as data pipelines. Data flowing with steps transforming the data along the way.&lt;&#x2F;p&gt;
&lt;p&gt;This doesn’t only apply to code, by the way. It applies to architecture as well. Microservices are the extension of the object oriented principles to an architecture level. And here’s the real question, is all of the additional work and complexity really getting you anything? Or are you distributing your monolith and introducing network “stuff” as a potential hazard?&lt;&#x2F;p&gt;
&lt;p&gt;So, how do you start, imaginary other person in this conversation?&lt;&#x2F;p&gt;
&lt;p&gt;With simplicity.  Keep things unentangled.  If you&#x27;re using an ORM and you&#x27;re able to stop, do so.  Learn SQL, learn what&#x27;s going on in the database underneath you.  Gain that knowledge and you&#x27;ll know more than 75% of other developers [citation needed].  Re-examine the tools of your craft.  If you&#x27;re using a framework because it&#x27;s the only one you know, maybe it&#x27;s time to branch out.  But whatever you do, write simply.  Take the time to understand a problem before you reach for a keyboard.  Only once you&#x27;ve understood the problem should you start writing.  And when you do, do the simplest thing you can to solve the problem.  Other developers (including future-you) will thank you.&lt;&#x2F;p&gt;
&lt;p&gt;For future listening...&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;changelog.com&#x2F;posts&#x2F;rich-hickeys-greatest-hits&quot;&gt;Rich Hickey&#x27;s Greatest Hits&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Onboarding Is Hard (part 2)</title>
        <published>2019-03-27T00:00:00+00:00</published>
        <updated>2019-03-27T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/onboarding-is-hard-part-2/" type="text/html"/>
        <id>https://bryan-lott.github.io/onboarding-is-hard-part-2/</id>
        
        <content type="html">&lt;p&gt;tl;dr: if you&#x27;re joining a company, your first n days shouldn&#x27;t be spent being productive, they should be spent building knowledge and connections so you can be productive.&lt;&#x2F;p&gt;
&lt;p&gt;After reading my last post, I&#x27;ve been stopping and starting the next one for close to a month.  The previous one focused pretty hard on what the hiring &lt;em&gt;company&lt;&#x2F;em&gt; can do to onboard a new hire.  Which is great and all, but that&#x27;s only half of the story.  The other half is focusing on what the &lt;em&gt;new hire&lt;&#x2F;em&gt; can do to be onboarded as quickly and painlessly as possible.&lt;&#x2F;p&gt;
&lt;p&gt;With that being said, this is potentially more a note to me than to anyone else!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;caveats&quot;&gt;Caveats&lt;&#x2F;h2&gt;
&lt;p&gt;First, I&#x27;m focusing on a technical&#x2F;engineering onboarding, mostly because that&#x27;s my background and what I have experience with.
Second, some of the advice may apply, some may not.  It all depends on the particular situation you find yourself in.  What works for one company or person may not work for the next.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;social&quot;&gt;Social&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Introverts unite!  Separately!  In your own homes!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Just a quick note, introversion&#x2F;extroversion refers to how someone recharges their social energy.  Introverts tend to recharge alone, extroverts in the company of others.  Shy&#x2F;outgoing refers to how comfortable someone is in a social situation.  In my experience, being shy &lt;em&gt;tends&lt;&#x2F;em&gt; to correlate with being introverted, but it&#x27;s not always the case so YMMV.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re outgoing, fantastic!  You&#x27;ll probably have an easier time integrating yourself into new company culture.  The only caution I would provide is to temper your enthusiasm just a little.  As a tech worker, you&#x27;re probably interacting with more shy people than you are outgoing types.  More than anything though, just be your friendly communicative self and you&#x27;ll be just fine.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re shy like I am, well, this is gonna be a little rough.  No real way to make it any better, it just is.  You know those really good friendships you (hopefully!) made at your last company, well, you can do the exact same thing here, but just like that last company, it&#x27;s going to take some time.  Relationships, professional or not, are built over time via communicative trust.  What I mean by this is the reason why people start talking about the weather or the company is that it&#x27;s a safe topic psychologically.  Can&#x27;t just jump in and ask someone what they think about the universe and their place in it.  That&#x27;s a much deeper topic that probes at the depths of the psyche and you need to build trust before you can have those sorts of conversations.&lt;&#x2F;p&gt;
&lt;p&gt;So, what do you do?  You reach out, maybe not in large groups as those awesome outgoing people can, but in small groups, within your team, maybe just one on one when you&#x27;re asking questions.  Up your &amp;quot;outgoingness&amp;quot; just a tad and you&#x27;ll be okay.  Don&#x27;t get me wrong, it&#x27;ll feel uncomfortable as hell, but you gotta do it and you&#x27;ll be thankful that you did.  It&#x27;ll turn an environment with a bunch of strangers into one where you just might hang out with the same people for 40+ hours every week.  If it helps, chances are the people on your team are just as shy as you are and are struggling just as much with meeting someone new.  If you make a little more effort than what&#x27;s comfortable, you&#x27;re easing their experience and you&#x27;ll form work-friendships much faster.&lt;&#x2F;p&gt;
&lt;p&gt;Now, to the introverts (extroverts, you already know what to do, go party!).  Whenever you start a new job, make sure you reach out to the people close to you in your life, whether that&#x27;s your partner, your friends, your therapist, or your family.  Let them know what&#x27;s going on and that you&#x27;ll probably need a lot more time to recharge than you normally would, but that it&#x27;s a temporary thing.  I guarantee they&#x27;ll understand.  Everyone knows how stressful starting a new job can be and they&#x27;ll support you.&lt;&#x2F;p&gt;
&lt;p&gt;One final caution, be yourself.  If you&#x27;re pretending to be someone you&#x27;re not, it&#x27;ll only backfire in the end and you&#x27;ll have a much harder time integrating with the culture.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lunch-happy-hour-social-time&quot;&gt;Lunch&#x2F;Happy Hour&#x2F;Social Time&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;ll admit, it&#x27;s very hard going out to lunch with a bunch of new people.  Usually, the restaurant is decently loud, it&#x27;s hard to hear people, etc.  There are a few things you can do to make this easier.&lt;&#x2F;p&gt;
&lt;p&gt;First off, the choice of the restaurant will probably be made for you.  If you have any dietary restrictions, make sure whoever is making the reservation&#x2F;choice knows whether you can eat there!&lt;&#x2F;p&gt;
&lt;p&gt;Second, whenever you all go out for food, make sure to walk&#x2F;ride with someone else.  It gives you a brief chance to have time with them beforehand and it&#x27;ll also give you someone to sit next to that already has spent some time with you.&lt;&#x2F;p&gt;
&lt;p&gt;This next one is uncomfortable as hell, but put yourself in the middle as much as possible.  The point of this outing is for the team to meet you, ask questions, and for you to do the same.  This is much easier if you&#x27;re sitting in the middle of the table where you can hear and be heard easily.  It also means that you&#x27;re less likely to be sidelined out of conversations.&lt;&#x2F;p&gt;
&lt;p&gt;If you drink alcohol and people order it, feel free, but only order one.  After that switch to soda or water.  Why?  Sharing alcohol seems to help people form bonds quicker for whatever reason, but you don&#x27;t want to go overboard.  Your goal here isn&#x27;t to get drunk, it&#x27;s to make connections.  If you don&#x27;t drink, for whatever reason, order a non-alcoholic &amp;quot;specialty&amp;quot; drink.  Think a strawberry lemonade instead of water or soda.  Same reason.  Most people don&#x27;t realize it doesn&#x27;t have alcohol in it and pretty much everyone likes the fancy drinks, whether they want to admit it or not!&lt;&#x2F;p&gt;
&lt;p&gt;Finally, try to ask open-ended questions.  These are questions that can&#x27;t be answered with a single word answer.  They lead to a conversation instead of closing a conversation off.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Closed question: &amp;quot;How often do you guys do lunch here?&amp;quot; -&amp;gt; &amp;quot;About every other week.&amp;quot; (end of the conversation)&lt;&#x2F;li&gt;
&lt;li&gt;Open question: &amp;quot;This is a great place, what other restaurants are good around here?&amp;quot; -&amp;gt; &amp;quot;Wow, well, there&#x27;s a, and b, and c.&amp;quot; (which naturally leads to more questions and conversation).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;headphones-tuning-out&quot;&gt;Headphones&#x2F;Tuning Out&lt;&#x2F;h3&gt;
&lt;p&gt;Believe me, I love my Bose QC35&#x27;s more than most.  It&#x27;s sometimes the only way I can focus enough to debug code.  But, remember, your job while you&#x27;re getting up to speed isn&#x27;t to be productive, debug the hardest problem, or write the cool thing.  It&#x27;s to gather enough knowledge and make personal relationships within the company so that you &lt;em&gt;can&lt;&#x2F;em&gt; do that.  Think of this as a sprinter stretching before a race.  If you don&#x27;t stretch, limber up, warm up, you&#x27;ll only hurt yourself.&lt;&#x2F;p&gt;
&lt;p&gt;If you do find yourself needing some focus time, make sure people know that you&#x27;re still available.  In my case, that means keeping only one headphone on so I can listen to the office around me.  It gives the perception that I&#x27;m not in do-not-disturb mode.  Collaboration is easily more important than deep work in the early days at a company, and some would argue that it&#x27;s always more important.  I&#x27;m not sure that I 100% agree with the last bit of that statement, but I wholeheartedly believe the first.&lt;&#x2F;p&gt;
&lt;p&gt;You&#x27;ll also want to observe the people around you.  Do they spend most of their day collaborating, chatting, etc?  Or, do they spend their day grumpily downing coffee while jamming to psytrance?  Either way, it&#x27;s very useful information as you acculturate into your new home.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;learning-the-tech&quot;&gt;Learning the Tech&lt;&#x2F;h2&gt;
&lt;p&gt;This is sometimes the easiest and sometimes the hardest part of coming up to speed at a new place.  Sometimes in the same hour!  Hopefully, you have a good understanding of the technology being used at your new company even if you may not understand how it&#x27;s being implemented.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;know-what-s-being-used&quot;&gt;Know what&#x27;s being used&lt;&#x2F;h3&gt;
&lt;p&gt;In theory, this should be pretty easy.  The first time you got a taste of this information was in the job posting.  If they were looking for an Oracle DBA, there&#x27;s a good chance they&#x27;re using an Oracle Database.  Make a list of everything they were asking for and figure out why they were asking for that thing.&lt;&#x2F;p&gt;
&lt;p&gt;Once you&#x27;ve got that list, catalog all the primary technology choices you&#x27;ll be working with on a daily basis.  Are there any you are weak on?  Great!  Focus on learning those every chance you get a free moment, which can be surprisingly often as a company tries to figure out how to use their new investment!  The advantage of doing this is you&#x27;re making their investment seem more attractive every day.  You&#x27;re showing initiative, and you&#x27;re furthering your own knowledge.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;know-how-it-s-being-used&quot;&gt;Know how it&#x27;s being used&lt;&#x2F;h3&gt;
&lt;p&gt;This is the more important topic at hand.  How is it being used &lt;em&gt;here&lt;&#x2F;em&gt;?  The key to getting up to speed on this is usually understanding the history of how it got to now.  Not just the facts, but the reasons behind it.  Sometimes those reasons are very logical, sometimes it&#x27;s &amp;quot;because a guy that no longer works here did it that way&amp;quot;.  Either way, you know more than you did before.  If there are logical reasons for it, what assumptions were made that underpin the logic?  If it was rando-guy, can you tease out what assumptions he was making that lead him down that path?  Are they still valid?  Where are the pain points in the current system?  Needless to say, your first n days of spending time with the tech is going to generate a lot of questions.  Don&#x27;t be afraid to ask the questions, write down the answers, and &lt;em&gt;create documentation from that information.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Seriously, that&#x27;s the biggest way you can contribute in your first few days.  Writing documentation.  It may be imperfect or incomplete but it&#x27;s probably more documentation than there was before, otherwise, you wouldn&#x27;t have needed to ask the questions in the first place!  Plus, everyone loves it when someone writes documentation, as long as &amp;quot;someone&amp;quot; isn&#x27;t them.  This is an easy way to get a quick win and learn something at the same time.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;do-a-teach-back-of-the-stack-or-at-least-your-portion-of-it&quot;&gt;Do a teach-back of the stack (or at least your portion of it)&lt;&#x2F;h3&gt;
&lt;p&gt;If a meeting where you teach back to someone what you&#x27;ve learned about the stack, the technology, etc hasn&#x27;t been scheduled, put one on the calendar.  Preferably with your team lead, manager, or someone who knows your area of the stack really well.  This is a fantastic chance to find the holes in your knowledge and get them filled right away.  It also reinforces the idea that you&#x27;re a member of a team and not just a &amp;quot;code in a cave&amp;quot; stereotype.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;make-a-pr&quot;&gt;Make a PR&lt;&#x2F;h3&gt;
&lt;p&gt;Pretty simple stuff, once you&#x27;ve pulled down the code, made a branch, and made your first commit, create a work-in-progress PR.  This instantly makes your work visible, which can be a very uncomfortable thing, but it also lets people point out issues with what you&#x27;re writing that you may not have the knowledge to avoid.  This also lets you be humble about your knowledge.&lt;&#x2F;p&gt;
&lt;p&gt;Essentially, this is all about shortening the feedback loop.  The shorter the feedback loop, the quicker you&#x27;ll learn and the faster you&#x27;ll be an effective contributor.  No matter how or what someone comments on your code, &lt;em&gt;never&lt;&#x2F;em&gt; take it personally, but especially in your first few months.  &lt;em&gt;You are not your code.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;joining-on-call&quot;&gt;Joining On-call&lt;&#x2F;h3&gt;
&lt;p&gt;Even if your new company isn&#x27;t going to have you join the on-call rotation, shadowing someone in your first few months can give you an idea of where the instabilities in the system are and where some of the pain points are.  This is invaluable knowledge as it gives you insight into where you can potentially make some nice wins.  While making wins shouldn&#x27;t be a goal into and of itself, it&#x27;s a great way to keep up your own confidence and start to show the company and your coworkers what a great person they picked!&lt;&#x2F;p&gt;
&lt;p&gt;Before you take your first on-call shift, reach out to your teammates and let them know that you&#x27;ll try your best but you may need some help.  Gather who you should contact if you can&#x27;t solve a problem and why&#x2F;when&#x2F;how to contact that person.  Sometimes you can leave an issue until the next day and pair with someone on it but that&#x27;s not always clear from the incident notification.  The best thing you can do is try to triage it.  If it&#x27;s truly a critical issue, wake people up.  At worst, it won&#x27;t actually be a critical issue and there&#x27;s a flaw in the documentation or notification that&#x27;s found and corrected.  This makes everyone&#x27;s lives better!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;when-you-re-stuck&quot;&gt;When You&#x27;re Stuck&lt;&#x2F;h2&gt;
&lt;p&gt;So, you&#x27;re stuck.  Do you ask for help or spend time researching&#x2F;learning it yourself.  For me this really boils down to one question:&lt;&#x2F;p&gt;
&lt;p&gt;Is this lack of knowledge something specific to the company or is it a lack of knowledge of something general?  I.e., can you google the answer?&lt;&#x2F;p&gt;
&lt;p&gt;For example, &amp;quot;How does your build system kick off this Jenkins job?&amp;quot; is a very different question than &amp;quot;How do I configure Jenkins to push to an EC2 image?&amp;quot;  The first one is specific to how the company has configured its build pipeline.  The second is more general.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;d spend a lot more time researching the general question than I would the specific one.  If I&#x27;m still not making any progress, then I&#x27;ll start asking around to see if anyone&#x27;s run into a similar issue.  I.e., if you can google the solution, you should probably at least try that first.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;closing-thoughts&quot;&gt;Closing Thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;No one said meeting a bunch of new people, especially people that can impact your ability to have a job, was easy.  In fact, I&#x27;m saying it&#x27;s the complete opposite.  It&#x27;s damn hard.  But the thing is, it&#x27;s worth it and the margin for error is pretty large.  You can screw up most of it and still be successful.&lt;&#x2F;p&gt;
&lt;p&gt;So, don&#x27;t be too hard on yourself.  Present yourself as authentically as possible and you&#x27;ll do just fine :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Onboarding Is Hard</title>
        <published>2019-02-20T00:00:00+00:00</published>
        <updated>2019-02-20T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/onboarding-is-hard/" type="text/html"/>
        <id>https://bryan-lott.github.io/onboarding-is-hard/</id>
        
        <content type="html">&lt;p&gt;Why both sides need to be positive, intentional, and communicative when someone new joins your company.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ve all experienced the first-day jitters and shininess that comes from the excitement of new possibility and challenge.  Broadly speaking, that energy can be focused one of two ways.  Either it&#x27;s used to catapult the new employee onto the fast track of becoming an active contributor or it can precipitate a downward spiral into mediocrity, boredom, and ultimately quitting.  What follows here is my guide to capturing, focusing, and using that energy productively.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;have-a-plan&quot;&gt;Have a Plan&lt;&#x2F;h2&gt;
&lt;p&gt;Sounds very simple I know, but you&#x27;d be surprised at how many places I&#x27;ve run into that thought they could just &amp;quot;wing it&amp;quot; when bringing someone new on.  This is can be predicated on a few potential assumptions.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Existing documentation and&#x2F;or team knowledge can be easily transferred to the new person.&lt;&#x2F;li&gt;
&lt;li&gt;The new person is a &amp;quot;rockstar&amp;quot; and will magically know what they don&#x27;t know when they start, know where to get the information they don&#x27;t have, and know enough to get their feet wet already.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Obviously, both of those are false assumptions but I&#x27;ve seen them play out time and time again.&lt;&#x2F;p&gt;
&lt;p&gt;So, your plan should look to fighting at least those two assumptions plus any others you can drum up from your particular culture, like, are there any unwritten rules?  Write that shit down!&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Know where your existing documentation is, how it&#x27;s organized, and where any major gaps are.  This should be an honest, factual assessment.  It isn&#x27;t a value judgment.  This is something you can present to the new hire so they know where they&#x27;re starting from.&lt;&#x2F;li&gt;
&lt;li&gt;Assume that the new hire has knowledge of &amp;quot;what&amp;quot; but not &amp;quot;how&amp;quot;.  What this means is if they say they know Python, great, but they don&#x27;t know how your company&#x2F;team&#x2F;etc uses it in practice.&lt;&#x2F;li&gt;
&lt;li&gt;Figure out the most likely questions they&#x27;ll have and if you don&#x27;t have the answers, no worries, compile a list of the most likely person to have the answer.  This can be a great way for a new hire to meet new people and start building working relationships.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;30-60-90-goals&quot;&gt;30&#x2F;60&#x2F;90 Goals&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s amazing to me how many places don&#x27;t provide a new hire a &amp;quot;roadmap&amp;quot; for their first 3 months.  These are critical months in any new hire&#x27;s journey that will set their trajectory for their time at your company.  This doesn&#x27;t need to be a complicated map but it should include some of the following with examples given:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Technical goals
&lt;ul&gt;
&lt;li&gt;They should get a merge&#x2F;pull request accepted in the first 2 weeks, and deployed to production in the first month.&lt;&#x2F;li&gt;
&lt;li&gt;They should shadow an on-call rotation by their 2nd month and feel comfortable taking on-call with a backup person by the end of their third month.&lt;&#x2F;li&gt;
&lt;li&gt;In their first month understand the overall architecture and do a &amp;quot;teach-back&amp;quot;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Social goals
&lt;ul&gt;
&lt;li&gt;Take a person you&#x27;ve never met out to coffee every week.&lt;&#x2F;li&gt;
&lt;li&gt;Every month for your first three, pick a different C-level executive to add into the coffee rotation.&lt;&#x2F;li&gt;
&lt;li&gt;Conversations can be business focused or not.&lt;&#x2F;li&gt;
&lt;li&gt;The goal is to make a human connection with the people you&#x27;re likely to spend at least 40 hours per week.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Career growth goals
&lt;ul&gt;
&lt;li&gt;In your first month, determine whether your current team fits where you want to be.&lt;&#x2F;li&gt;
&lt;li&gt;In your second month, determine where you want to go in the company in terms of career.&lt;&#x2F;li&gt;
&lt;li&gt;By your third month have a plan for how to get there and present it to your manager.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;buddy-system&quot;&gt;Buddy System&lt;&#x2F;h2&gt;
&lt;p&gt;For fuck&#x27;s sake, assign any new hire a buddy they can go to with any question they may have without any judgment.  This should be the first person they have coffee with and the first person they go to with &amp;quot;dumb&amp;quot; questions.  These questions can range from &amp;quot;where&#x27;s the 2nd bathroom if the primary one is full&amp;quot; to &amp;quot;where does this piece of code live&amp;quot; to &amp;quot;who do I ask about pushing code to production&amp;quot; or even &amp;quot;how does time-off work in practice and who do I ask for it&amp;quot;.  Think of this as a built-in acculturator and work-friend.&lt;&#x2F;p&gt;
&lt;p&gt;Note, that if this is the new hire&#x27;s default work-friend, it&#x27;s best to see if you can tease out who&#x27;d be a good match for them.  Or, at the very least, don&#x27;t pick your grumpiest engineer to play the hand-holding role.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;acculturation&quot;&gt;Acculturation&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;assimilation to a different culture, typically the dominant one.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Every company has its own culture.  Some are similar enough to others that it&#x27;s like putting on a different shirt.  Others are similar but they have weird buttons, on the wrong sides, and collars, and what&#x27;s this pocket doing here?!&lt;&#x2F;p&gt;
&lt;p&gt;&amp;quot;Close&amp;quot; and &amp;quot;same&amp;quot; are two very different things.  You can think of culture as some of the written and unwritten rules of &amp;quot;how we work together&amp;quot;.  The same work still needs to get done, code needs to be written, reviews need to be done, etc.  How that happens is different in every company, even if they use the exact same tools.  Perfect example, one company I was with just threw pull requests into the &lt;code&gt;#engineering&lt;&#x2F;code&gt; slack channel with an &lt;code&gt;@here&lt;&#x2F;code&gt; attached.  My first week at another company I did the same thing and was privately scolded for using &lt;code&gt;@here&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Probably one of the biggest acculturation topics is communication.  How the company communicates, what different tools are used for, even what different chat channels are used for can be a huge help.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;communication&quot;&gt;Communication&lt;&#x2F;h2&gt;
&lt;p&gt;This is probably one of the biggest ones, at least for me.  Helping your new hire understand how their new company communicates.  This can either be a huge stumbling block or it can be their ticket to acculturating in a week.  Communication is probably one of the easiest ways to inadvertently step on toes, especially in any sort of textual communication (email, slack, etc).&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;What methods of communication are acceptable?&lt;&#x2F;li&gt;
&lt;li&gt;What are those various methods used for day-to-day?&lt;&#x2F;li&gt;
&lt;li&gt;What&#x27;s the expectation and acceptability of off-hours communication?&lt;&#x2F;li&gt;
&lt;li&gt;What&#x27;s the quickest way to irritate someone from a cultural point of view?  (and how to avoid it yet communicate the same thing)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;what-s-the-point&quot;&gt;What&#x27;s the Point?&lt;&#x2F;h2&gt;
&lt;p&gt;So, what&#x27;s the point here?  Onboarding is hard, damn hard.  Let&#x27;s not make it harder than it has to be.  Remember, the hiring of someone new is very expensive and you should put just as much effort into the post-hire as you do the pre-hire.  Always look at it from the perspective of the new hire.  Give them the hand up they need to get their feet under them and they&#x27;ll become a productive member of your team faster with more smiles on either side.&lt;&#x2F;p&gt;
&lt;p&gt;The alternative is to let them flail as some sort of weird hazing ritual and see if they succeed.  They might, yes, but you&#x27;ll have wasted a lot of time, money, and effort needlessly.  With the ultimate downside that they&#x27;ll likely quit much sooner than they would have otherwise.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Projects</title>
        <published>2019-01-18T00:00:00+00:00</published>
        <updated>2019-01-18T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/projects/" type="text/html"/>
        <id>https://bryan-lott.github.io/projects/</id>
        
        <content type="html">&lt;p&gt;So, for whatever reason, I&#x27;m feeling inspired this morning.  Have a few projects in mind, some of which are ongoing, and others that are just a twinkle in my mind&#x27;s eye.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The &amp;quot;perfect&amp;quot; D&amp;amp;D&#x2F;RPG note taking system.  Something along the lines of bullet journal, customized for RPG &lt;em&gt;player&lt;&#x2F;em&gt; note taking.  Also, would love it if the character sheet was integrated into the system as well.  I picked up a Leuchtturm1917 note book last night and, with any luck, I&#x27;ll be able to transfer notes from our previous sessions over to it within the next day or so and give it a real try out on Sunday when our game is.&lt;&#x2F;li&gt;
&lt;li&gt;Going to Burning Man.  Yeah, pretty simple.  Plan is to buy a ticket the first opportunity I can.  I think I&#x27;ve already got the survival situation pretty much figured out.  It definitely helps that my girlfriend and another friend went last year and I&#x27;ve been listening to the &lt;em&gt;awesome&lt;&#x2F;em&gt; &lt;a href=&quot;https:&#x2F;&#x2F;accuracythird.com&#x2F;&quot;&gt;Accuracy Third Podcast&lt;&#x2F;a&gt; since the end of Burning Man last year.&lt;&#x2F;li&gt;
&lt;li&gt;Building a Burning Man Art Car.  Apparently, I&#x27;m supposed to wait until my sophomore year before I start getting wild-ass ideas about building shit at BM.  I&#x27;m in sort of a weird space though, in some ways, I kinda feel like last year (2018) was my first year, I just didn&#x27;t go physically.  I&#x27;m probably full of shit about this but we&#x27;ll see.&lt;&#x2F;li&gt;
&lt;li&gt;Writing every day.  I&#x27;m doing relatively well on this so far.  Not necessarily writing every day, but writing on a regular basis.  Publishing what I&#x27;ve written to my blog as long as it&#x27;s not too personal.  So far, so good.  Don&#x27;t want to jinx it though!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So, what projects are you working on?  What projects are floating around in your head that you haven&#x27;t gotten started?  What projects &lt;em&gt;could&lt;&#x2F;em&gt; you be working on if only you had time&#x2F;energy&#x2F;money&#x2F;motivation&#x2F;etc?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Including the Why</title>
        <published>2019-01-15T00:00:00+00:00</published>
        <updated>2019-01-15T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/including-the-why/" type="text/html"/>
        <id>https://bryan-lott.github.io/including-the-why/</id>
        
        <content type="html">&lt;p&gt;The biggest question I see unanswered in technology, stories, news, etc, is &amp;quot;why?&amp;quot;  Why do I want to experience your content?  Why does it matter to me?  Wrapped up in that question is the context of why it matters to you, the creator.  Why you spent time producing the content.  Why is this a thing that needed to exist in the world?&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes we may not understand that question ourselves, even while creating.  Something just needed to be there, period.  We happened to be the one that noticed it and had the skills to create it.  Great!  Once it&#x27;s created, we can always go back in and take a second look, figure out why something is.  The best way I find to do this is to sleep on it, look at it with a fresh set of eyes, and come at it with the perspective of someone that doesn&#x27;t know you, your motivations, your context, anything.&lt;&#x2F;p&gt;
&lt;p&gt;Take, for example, this blog post.  Why does it need to exist?  It originally started out as a reaction to a &amp;quot;vaguebook&amp;quot; post I saw this morning, the very epitome of the lack of &amp;quot;why&amp;quot; (and a bunch of other things).  This lead me down a path of thinking through why I struggle to understand some people but not others.  Or, for that matter, why I can communicate with some people effortlessly but others it&#x27;s like we talk past one another endlessly.  That&#x27;s one &amp;quot;why&amp;quot; for me to write this post, but what do I hope a person reading it gets out of it?  The other side of the proverbial &amp;quot;why&amp;quot; coin.&lt;&#x2F;p&gt;
&lt;p&gt;Why should someone else read it? (&amp;quot;someone else&amp;quot; also being me, once I&#x27;ve lost the context and &amp;quot;why&amp;quot; of this post in the first place).  The most basic reason I can think of is to &amp;quot;change the world.&amp;quot;  Grandiose, I know, but stick with me.  We normally think of &amp;quot;changing the world&amp;quot; as being some grand thing.  What we, myself included, fail to recognize is that change can be so subtle, so slight, that no one even notices.  That&#x27;s change too, just on a different scale.&lt;&#x2F;p&gt;
&lt;p&gt;So, back to my grandiose ideas of changing the world.  If one person, again myself included, reads this and because of it includes an answer to &amp;quot;why&amp;quot; in their next creation, then it&#x27;s served its purpose.  Reducing the friction in communication between two beings.  Getting someone to share their perspective accurately with someone else.  That someone else being able to easily step into the perspective of the creator.&lt;&#x2F;p&gt;
&lt;p&gt;So, next time you create something, include a bit of &amp;quot;why&amp;quot;.  No, you don&#x27;t need to include 100 pages of backstory before you share your recipe for perfect boiled eggs, but I do want to understand at least a little of your perspective.  In this case, why your boiled eggs are better!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Music to Work By</title>
        <published>2019-01-14T00:00:00+00:00</published>
        <updated>2019-01-14T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/music-to-work-by/" type="text/html"/>
        <id>https://bryan-lott.github.io/music-to-work-by/</id>
        
        <content type="html">&lt;p&gt;An (incomplete) list of the music I listen to when I&#x27;m trying to get shit done :tm:.  Obviously all the links are on Spotify for easy listening to.  And part of me wishes we were still in the &amp;quot;personal collection of mp3&#x27;s&amp;quot; era but I also like being exposed to a lot of new bands&#x2F;music that I wouldn&#x27;t have found otherwise.  Pandora was great for that for quite a while, but I&#x27;ve moved onto paying for a subscription to Spotify as I can re-listen to albums&#x2F;songs&#x2F;etc as much as I want.  And to keep my sanity and focus in an open office (insert rant here about how open offices are terrible for knowledge workers) the subscription fee and a good pair of noise cancelling headphones is essential.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;playlists&quot;&gt;Playlists&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Focus w&#x2F; Energy: &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;user&#x2F;mystickphoenix&#x2F;playlist&#x2F;3bSwSru9Jdhr6Ch4twIqh6?si=uOBIv7cHRK2AECe7Jq1SJw&quot;&gt;Liquid Funk&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Taking the morning and getting into flow: &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;user&#x2F;mystickphoenix&#x2F;playlist&#x2F;6wDnfi5193U6yAjl1jlsHO?si=jF8lL7OySbeGElnTqwVwhA&quot;&gt;Morning Flow&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Afternoon focus&#x2F;flow, good when researching &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;user&#x2F;chilledcow&#x2F;playlist&#x2F;6eHO8aX6lHu3e6bem8r2rq?si=pvf26IorR-Ce4JYQLFd7HQ&quot;&gt;lofi hip hop music&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Chilling: &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;user&#x2F;kngsolomon1&#x2F;playlist&#x2F;4bWCqfKsqKTiVhYP7Y7NRr?si=q6XbVElbQcSs2KBLhY4Fdg&quot;&gt;3am Airport&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Linkin Park, my favorites: (dead link)&lt;&#x2F;li&gt;
&lt;li&gt;Triphop, for when I&#x27;m feeling the 90&#x27;s&#x2F;00&#x27;s vibe (dead link)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;individual-soundtracks&quot;&gt;Individual Soundtracks&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Doesn&#x27;t get much better than this: &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;album&#x2F;2r4a3PREYIRF2QdbcPnrEO?si=kLdbEev5Tae77aPzfrqnfg&quot;&gt;Bastion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Or pretty much anything by &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;artist&#x2F;0ZMWrgLff357yxLyEU77a1?si=bqJstgTDRaGyuQB7aZdL3Q&quot;&gt;Darren Korb&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Or this: &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;user&#x2F;1211204907&#x2F;playlist&#x2F;3pNqrKSsoZyQ9u5BhLkBNc?si=QX2baUl8TeO00Oul3hCRQA&quot;&gt;Rebel Galaxy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Hey, what about &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;user&#x2F;129562715&#x2F;playlist&#x2F;3gUz2OgVFXgzmL81cXlJ1R?si=0o5u4xrSQ7GGvLjSF2lwnA&quot;&gt;Tron: Legacy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Or rocket launches? &lt;a href=&quot;https:&#x2F;&#x2F;open.spotify.com&#x2F;album&#x2F;4u31Iob5ln1Bo98W2pnKL8?si=zg_LvZIFT9m6rKR9kEPQvw&quot;&gt;SpaceX&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Just a taste of what I listen to on a regular basis, preferrably at high volume, blocking out any distractions so I have at least a chance of focusing!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Goldilocks and the Three Company Sizes</title>
        <published>2019-01-11T00:00:00+00:00</published>
        <updated>2019-01-11T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/goldilocks-and-the-three-company-sizes/" type="text/html"/>
        <id>https://bryan-lott.github.io/goldilocks-and-the-three-company-sizes/</id>
        
        <content type="html">&lt;p&gt;Which company size is right for you?&lt;&#x2F;p&gt;
&lt;p&gt;One of the questions that has to be answered is where do you fall on the spectrum of size and associated company mentality you work best for. The spectrum goes from startup through midsize and all the way up to massive-multinational-conglomerate. There are a few general rules of thumb I’ve come to recognize.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;As size goes up, individual freedoms go down&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, stability and job security usually, but not always, increases&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, there’s a transition point from the focus on being right to the focus being on not being wrong&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, ping pong and foosball sessions are replaced with meetings&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, “unlimited” vacation is usually replaced with a vacation formula&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, unwritten rules get written down&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, uncertainty about perceived performance goes down&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, actual performance usually goes down&lt;&#x2F;li&gt;
&lt;li&gt;As size goes up, the on-boarding process gets longer and more detailed&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Quite a lot depends on where you want to live on this spectrum. Too much freedom and autonomy can be terrifying, especially if someone is more extrinsically motivated than intrinsically. On the other hand, too much bureaucracy can be stifling to motivation and productivity. As most things, it’s a balancing act. The real question is, where do you end up on that spectrum?&lt;&#x2F;p&gt;
&lt;p&gt;As I’ve gone through companies of drastically different sizes, I tend toward the high end of startup to the low end of midsize. Enough freedom to choose tools, languages, and projects, but enough guidance so I know I’m not going right off the rails.&lt;&#x2F;p&gt;
&lt;p&gt;Having policies and procedures written down is always helpful, at any size company, but I find that it’s the transition point from startup to midsize where most of the good documentation is generated. This seems to be where companies codify their culture. Some, of course, do it better than others but as a new-hire, there’s nothing more valuable than documentation to read and get a sense of what you just walked into.&lt;&#x2F;p&gt;
&lt;p&gt;I also find that as size goes up, context provided tends to go up as well. Sometimes this is fantastic and other times, it’s overwhelming. When you’re trying to coordinate 20+ scrum teams using the “scaled agile framework” there’s too much context to hold in any one person’s head at any one point and communication breaks down. At the opposite end of the spectrum, there’s so little context for anything that you’re making it up as you go and hoping you’re going in the right direction.&lt;&#x2F;p&gt;
&lt;p&gt;Unlimited vacation, for me, is actually more of a negative than a positive. In my experience it changes the equation from “I have this much time to take off, great!” to “how much political capital do I have built up to be able to take time out without unseen repercussions?” A much more difficult and complex question to answer.&lt;&#x2F;p&gt;
&lt;p&gt;As for stability, large companies generally don’t fold in a day. They do, however, lay off people, seemingly without much thought. So, while the company may not go under, your job may disappear. As many people have said, the idea that you can find a “forever company” at this point is mostly a myth. Maybe it’s possible, but it’s more likely that you’ll find a “good enough for now” company and when it no longer meets that criteria, you move on to the next one that fits that criteria.&lt;&#x2F;p&gt;
&lt;p&gt;Size of company is objective, your experience of the best size for you is subjective. My advice is to find the right size and stick to it, even if you’re switching companies. You’ll be happier and more productive.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Python to Scala</title>
        <published>2019-01-07T00:00:00+00:00</published>
        <updated>2019-01-07T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/python-to-scala/" type="text/html"/>
        <id>https://bryan-lott.github.io/python-to-scala/</id>
        
        <content type="html">&lt;p&gt;Let me set the background.  I&#x27;m not a classically trained programmer.  In fact, I&#x27;ve been coding for about 8 years and ended up teaching myself on the job.  I&#x27;m currently a senior software engineer and end up fighting with &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Impostor_syndrome&quot;&gt;Imposter Syndrome&lt;&#x2F;a&gt; on a regular basis.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been a Python programmer for pretty much that entire time with occasional dabbles in other languages (Clojure, Java, Scala, Node, etc).  In my current (new) position, I&#x27;m working in a Scala codebase.  A language that I&#x27;ve never had to put the effort forward to learn.  Three days in and I totally had a lightbulb moment:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Scala is Typed Python on the JVM with Braces&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Take for instance the Person class in Python:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;class Person(name, age):
    def description:
      return &amp;quot;{} is {} years old&amp;quot;.format(name, age)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and the same thing in Scala:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;scala&quot; class=&quot;language-scala &quot;&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;class Person(val name: String, val age: Int) {
    def description = name + &amp;quot; is &amp;quot; + age + &amp;quot; years old&amp;quot;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I mean, yeah, there&#x27;s a ton of other stuff in Scala (it&#x27;s a batteries-included language like Python) but the more I look at it the more I see how similar they are instead of how different they are.  Scala has an advantage that functional programming concepts are much more accepted in terms of style than they are in Python.&lt;&#x2F;p&gt;
&lt;p&gt;Scala also has things like for-comprehensions (list comprehensions).&lt;&#x2F;p&gt;
&lt;p&gt;Python:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;l = [i for i in range(100) if i % 2 == 0]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Scala:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;scala&quot; class=&quot;language-scala &quot;&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;val l = for (i &amp;lt;- 0 to 100 if i % 2 == 0) yield i
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So far, it&#x27;s not as difficult a mountain to climb as I expected and that&#x27;s a very good thing!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Git Commit Messages</title>
        <published>2019-01-03T00:00:00+00:00</published>
        <updated>2019-01-03T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/git-commit/" type="text/html"/>
        <id>https://bryan-lott.github.io/git-commit/</id>
        
        <content type="html">&lt;blockquote&gt;
&lt;p&gt;git commit -m &amp;quot;gah!&amp;quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;So, apparently, git commit messages are a point of contention with developers.  Yeah, the ~50 characters you get to say what the commit does, your state of mind, why this is a thing, etc.  Not only that, this is the message that&#x27;s probably lost when you squash merge your commit.  Maybe it&#x27;s just me, but I find very little value in reading any git commits.  There&#x27;s just not enough context without reading the associated code, and if you&#x27;re doing that... the commit message probably won&#x27;t provide you that much extra information.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, two things I have started using commits for is:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A summary of the work done in the commit.  Sometimes this is nothing more than &amp;quot;gah!&amp;quot; or &amp;quot;try to unbork things&amp;quot;.  I know, not great messages, but they&#x27;re all I can stomach at the moment when I&#x27;m in the midst of trying to get a piece of code to do the thing I want it to do.&lt;&#x2F;li&gt;
&lt;li&gt;An answer to the question &amp;quot;What happens if I merge this commit?&amp;quot;  These are where the good commits usually are.  Things along the lines of &amp;quot;Add glue:* permissions to Spark worker&amp;quot;.  Tells you exactly what happens if you merge the commit.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Here&#x27;s the thing, to provide enough of a summary so that the person coming behind you (likely to be you when you&#x27;ve lost the context you currently have) in ~50 characters is &lt;em&gt;HARD&lt;&#x2F;em&gt;, like, getting-threading-locks-right-hard.  So, if you give me commit messages like &amp;quot;terribleness&amp;quot;, &amp;quot;joy&amp;quot;, etc, I&#x27;ll probably just laugh and go read the code.  If you&#x27;ve given me one of the commit messages that gives me enough context, I&#x27;ll still go read the code since all documentation is suspect, especially mine!&lt;&#x2F;p&gt;
&lt;p&gt;Good git commit messages are bonus points, nothing more.  So to get up in arms about it feels, silly, and possibly a sign of bikeshedding.  Write good ones if you can and don&#x27;t criticise those that can&#x27;t.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tools I Work With</title>
        <published>2018-12-27T00:00:00+00:00</published>
        <updated>2018-12-27T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/tools-i-work-with/" type="text/html"/>
        <id>https://bryan-lott.github.io/tools-i-work-with/</id>
        
        <content type="html">&lt;p&gt;Yay for interesting writing prompts. Here’s a quick list of the tools I use on a daily basis to get my job as a software engineer done:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: pretty much required for asynchronous communication. Email is reserved primarily for more “formal” communication over “getting shit done”.&lt;&#x2F;li&gt;
&lt;li&gt;iTerm2: terminal emulator, nothing much to say here but it’s far and away the best on OSX, to the point where I can ignore it. I love tools that get enough out of my way that I can ignore that they are even a thing!&lt;&#x2F;li&gt;
&lt;li&gt;Fish: friendly interactive shell. For now, my shell of choice over bash and zsh. It works better out of the box but unfortunately isn’t bash-compatible. I waffle between fish and zsh on a regular basis but have been sticking with fish for close to a year now. Probably means it’s time to go back to zsh and oh-my-zsh&lt;&#x2F;li&gt;
&lt;li&gt;Spacemacs (with vim bindings via evil-mode): definitely a powerful editor&#x2F;ide&#x2F;etc. Has the most fully-functional Scala integration outside of intelliJ (which I won’t use on principal). The spacemacs configuration lends itself to discoverability as well as a pretty low-friction setup (for non-emacs users like myself). The vim bindings are the best modal editing I’ve found and are in most editors so I’m able to turn them on and just “get to work” faster. I’m definitely not a vim wizard by any stretch but I do find the editing capabilities much better than any other key bindings I’ve found yet.&lt;&#x2F;li&gt;
&lt;li&gt;Visual Studio Code: for when spacemacs freaks out and won’t work or if I’m writing Rust (spacemacs rust stuff… kinda-sorta works well enough if you’re familiar with the language, which I’m really not). Also, if I just need a change of pace.&lt;&#x2F;li&gt;
&lt;li&gt;Chrome: for the longest time I used Chrome for password management so it was my default, but I’m considering moving to Firefox now that I’m using 1password as my password manager on all my devices.&lt;&#x2F;li&gt;
&lt;li&gt;nvAlt: notational velocity. I have it bound to cmd+` and love its ability to pop up and pop away, support for markdown, and the ability to sync (or not) with various platforms based on where you save its files. The stupid-fast-searching is well worth taking a look at.&lt;&#x2F;li&gt;
&lt;li&gt;Insomnia: a postman clone that, IMO, is cleaner and more intuitive. Plus, I just like being different.&lt;&#x2F;li&gt;
&lt;li&gt;GitKraken: hands down the best GUI Git interface. Integrates well with both Github and Gitlab, very performant. Multi-platform. For me, it removed the fear when doing a rebase because I knew exactly what I was doing when and where. I do, however, tend to use spacemacs git integration layer for simple commits.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;That pretty much wraps it up for tools. Those are the primary ones I use in my day-to-day writing Scala and Rust. Of course, it’ll probably change over the next few months as I get bored pretty easily and when a new shiny comes along, I can’t resist giving it a try!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Predict the Future of Your Industry</title>
        <published>2018-12-21T00:00:00+00:00</published>
        <updated>2018-12-21T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/predict-the-future-of-your-industry/" type="text/html"/>
        <id>https://bryan-lott.github.io/predict-the-future-of-your-industry/</id>
        
        <content type="html">&lt;p&gt;Honestly?  I think my industry (software development) is heading for a cliff.  A complexity cliff.  We&#x27;re already struggling to build abstractions well enough to keep our heads from exploding with the complexity we all seem to love.
Without a drastic change in direction away from OO, leaky abstractions (DAO and ORM come to mind), and a rejection of incidental complexity, we&#x27;re going to collapse under the weight of our own complexity.&lt;&#x2F;p&gt;
&lt;p&gt;I know, the prediction seems pretty dire, but I&#x27;m seeing it in both new developers and experienced developers all the time, at multiple companies, and in multiple languages.  What we&#x27;ve built and are now building &lt;em&gt;&lt;em&gt;ARE TOO COMPLEX&lt;&#x2F;em&gt;&lt;&#x2F;em&gt;.  Not too complex for a computer to parse, but too complex for our (feeble in comparison) minds to be able to comprehend.  We need a return to the fundamentals of computing: theoretical math, lambda calculus, pure logic.  Maybe it&#x27;s just me, but when I&#x27;m working on a problem where I&#x27;m comparing the outputs of two programs and can&#x27;t satisfy the compiler, let alone get actual matches, we&#x27;ve got a huge problem.  I&#x27;m no computer genius, but I&#x27;ve been doing software development for at least 10 years now.&lt;&#x2F;p&gt;
&lt;p&gt;I can&#x27;t shake the feeling that as an industry, we&#x27;ve seriously fucked up, and need to go back and understand what and where the hell we went wrong and fix it, and soon.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>YAGNI Revisited</title>
        <published>2018-08-29T00:00:00+00:00</published>
        <updated>2018-08-29T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/yagni-revisited/" type="text/html"/>
        <id>https://bryan-lott.github.io/yagni-revisited/</id>
        
        <content type="html">&lt;p&gt;&amp;quot;You aren&#x27;t gonna need it&amp;quot; (YAGNI) is a phrase used in software development to help combat complexity and prevent building unnecessary components.  It&#x27;s a great idea but one rarely implemented.  What I see most often are cron schedulers with api endpoints that put data onto an AWS queue and use an RPC framework internally for no good reason.  I.e., the complete opposite of following the YAGNI principle.&lt;&#x2F;p&gt;
&lt;p&gt;(fair warning, when I say &amp;quot;prove&amp;quot; below I&#x27;m not talking about a formal proof, instead research or build enough to convince yourself)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;assumption-of-none&quot;&gt;Assumption of None&lt;&#x2F;h2&gt;
&lt;p&gt;I had an insight the other day that led me down an interesting path.&lt;&#x2F;p&gt;
&lt;p&gt;Once you have a problem to work on, but before making any technology choices or writing any code, assume that the problem is already solved.  Assume that you, personally, need to do nothing. &lt;&#x2F;p&gt;
&lt;p&gt;No, seriously, assume that you need to do literally nothing to solve that problem.  You sit on your hands and the problem is magically solved in front of your eyes.  Silly right?  Stick with me...&lt;&#x2F;p&gt;
&lt;p&gt;What does this actually mean?  Well, if your problem hasn&#x27;t been solved in the time it takes you to open a new browser tab, it means that you need to do a quick google search to figure out if someone else has written the thing you think you need.  Even more so, it means thinking about your actual need (hammock driven development for the win!).&lt;&#x2F;p&gt;
&lt;p&gt;Once you&#x27;ve done that, prove yourself wrong.  Prove to yourself that no one else has written an app or bit of code that does the thing you need.&lt;&#x2F;p&gt;
&lt;p&gt;At this point, you&#x27;ve proven to yourself that no one else has something that fills the need.  Great!  Don&#x27;t start writing code yet.&lt;&#x2F;p&gt;
&lt;p&gt;Is there a group of technologies that can integrate with one another to provide the functionality?  Again, assume that there is and see if you can prove yourself wrong.  Nothing exists?  Great!  Now you can start thinking about writing code.&lt;&#x2F;p&gt;
&lt;p&gt;But, as you do, continue to make assumptions that you don&#x27;t need (insert thing here) and prove yourself wrong.  Assume you don&#x27;t need to persist data until it becomes bleedingly obvious that you do.  Assume you don&#x27;t need a database to persist that data and a flat file will do, until you can prove that assumption wrong.&lt;&#x2F;p&gt;
&lt;p&gt;Proving assumptions wrong all the way up and down the stack is a great way to prevent yourself from building in something you don&#x27;t need or using a technology that&#x27;s too complex for your current use cast.  It&#x27;s a way to ruthlessly force yourself to build something that&#x27;s tailored to your situation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;other-benefits&quot;&gt;Other Benefits&lt;&#x2F;h2&gt;
&lt;p&gt;You know the great thing about building something like that?  It&#x27;s extensible.  You can always add more on later, after your assumptions prove false.  It improves developer speed, both from a bug-squashing perspective (it should be obvious when there&#x27;s a bug because your code doesn&#x27;t do the specific thing you need it to) and from an onboarding perspective.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t necessarily mean a new developer to the company by &amp;quot;onboarding&amp;quot; by the way.  I mean getting a developer that&#x27;s unfamiliar with the codebase up to speed and productive in the codebase.  This includes you if you haven&#x27;t looked at the codebase in a couple days, by the way!&lt;&#x2F;p&gt;
&lt;p&gt;This increases developer productivity which in turn means business velocity.  If you&#x27;re building the thing you need and only that, you can move at lightning speed.  That&#x27;s the goal, isn&#x27;t it?  Move faster than your competition and maintain that velocity for as long as possible.&lt;&#x2F;p&gt;
&lt;p&gt;You&#x27;re also building in a lack of code ownership.  This, contrary to popular belief, is also a good thing.  It means when your code no longer fits your need, because your needs diverged, you can toss the code out and use the lessons learned to move even faster on the new need.  Even in this case, go back to the basic assumption that you don&#x27;t need to build anything, and prove yourself wrong every step of the way.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2017 Recap</title>
        <published>2018-01-07T00:00:00+00:00</published>
        <updated>2018-01-07T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/2017-recap/" type="text/html"/>
        <id>https://bryan-lott.github.io/2017-recap/</id>
        
        <content type="html">&lt;p&gt;Like other blogs, I&#x27;m doing &amp;quot;2017 in review&amp;quot;.  It gives me something to blog about and might jump start a new habit of writing more often.  Daily blogging would be fantastic but I&#x27;d like to start with something reasonable, monthly or maybe weekly and work up from there...&lt;&#x2F;p&gt;
&lt;p&gt;Note, after writing this it completely changed my perspective on how 2017 went for me.  When I originally started I was feeling pretty shitty about 2017 and hoping that 2018 is better.  Yeah, there was a lot of 
negativity in 2017 but personally there was a lot of good in there too.  Funny how things get put into perspective sometimes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;games-played&quot;&gt;Games Played&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;board-tabletop&quot;&gt;Board&#x2F;Tabletop&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Unearth
&lt;ul&gt;
&lt;li&gt;Fantastic &amp;quot;light&amp;quot; board game for up to 4 players that plays in about 45 minutes or so.  Make sure to read the rules closely as our first game left us feeling a bit &amp;quot;WTF?&amp;quot;&lt;&#x2F;li&gt;
&lt;li&gt;Great for introducing parents and family members to a board game that&#x27;s &lt;em&gt;not&lt;&#x2F;em&gt; one of the U.S. classics (Clue, Monopoly, etc).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Numenera
&lt;ul&gt;
&lt;li&gt;There&#x27;s going to be a lot about this in the RPG section, but I can&#x27;t say enough for how much this game has changed my life for the better.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;video&quot;&gt;Video&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Divinity Original Sin
&lt;ul&gt;
&lt;li&gt;My new favorite game.  Really great classic role-playing game (CRPG) with what seem to be meaningful choices, a crafting system, magic, freedom of character creation and pathing, etc.  Feels close to D&amp;amp;D which is pretty much what I&#x27;ve been looking for.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Path of Exile
&lt;ul&gt;
&lt;li&gt;Think Diablo II, but better, and free.  Definitely worth a couple hours to figure out if you like it or not.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Crosscode
&lt;ul&gt;
&lt;li&gt;Feels like playing a realtime-combat JRPG MMO, but it&#x27;s a single-player game.  Fantastic for the anti-social types that want to solo a cute MMO.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Turmoil
&lt;ul&gt;
&lt;li&gt;Great little time-waster with surprising depth (no pun intended LOL!)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Running With Rifles
&lt;ul&gt;
&lt;li&gt;Great time-waster, can be a bit frustrating at points, but the initial campaign is pretty long and engaging as are several of the player-created campaigns.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Rebel Galaxy
&lt;ul&gt;
&lt;li&gt;This game has one of the best soundtracks I&#x27;ve ever heard in a game.  Feels like a wonderful mashup of Firefly, Cowboy Bebop, and soloing Eve: Online.  I only wish the storyline was a bit longer and you could spend more time with the higher level ships.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;books-read-listened-to&quot;&gt;Books Read&#x2F;Listened To&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;fiction&quot;&gt;Fiction&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Promise of Blood (Powder Mage #1)
&lt;ul&gt;
&lt;li&gt;Really engaging story so far, I&#x27;m about 7 chapters or so in and can&#x27;t stop reading.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Engineering Infinity
&lt;ul&gt;
&lt;li&gt;First few stories were really amazing, the next ones I seem to have gotten bogged down in.  Will maybe try this again once I finish the first Powder Mage book.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Legends of the Nameless Dwarf: The Complete Saga
&lt;ul&gt;
&lt;li&gt;Haven&#x27;t touched this since I finished the first book toward the startof the year.  The worldbuilding is interesting but seems a little disjointed for my taste.  I&#x27;ll likely come back to it at some point.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Name of the Wind (Kingkiller Chronicles #1)
&lt;ul&gt;
&lt;li&gt;The prose of this book is amazing but I find that it sometimes gets in the way of a story that&#x27;s not incredibly interesting to me.  I&#x27;m more interested in the nested way the stories are being told (The author is telling the story of a storyteller telling a story about himself who also sometimes tells a story).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Vurt
&lt;ul&gt;
&lt;li&gt;If you can handle the (sometimes &lt;em&gt;very&lt;&#x2F;em&gt;) mature themes in here, it&#x27;s a fun, wild ride.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Norse Mythology
&lt;ul&gt;
&lt;li&gt;First book on Norse mythology that I&#x27;ve actually finished.  If I remember correctly, this one was an audiobook read by the author.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Priest (Ratcatchers #1)
&lt;ul&gt;
&lt;li&gt;Matthew Colville, if you don&#x27;t know that name, you probably don&#x27;t play any tabletop role playing games (TTRPGs).  He has a fantastic youtube channel devoted to nothing but and is engaging and fun to listen to.  I originally bought this book as well as Thief to support him and it was surprisingly good.  If I remember correctly there are a few very minor editing mistakes but I highly recommend it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Thief (Ratcatchers #2)
&lt;ul&gt;
&lt;li&gt;The only bad thing about the Ratcatchers #2 is there isn&#x27;t a #3 yet!!!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Night Clave
&lt;ul&gt;
&lt;li&gt;Great Numenera novel, required reading for Numenera GM&#x27;s in my opinion.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Myth of the Maker
&lt;ul&gt;
&lt;li&gt;To be honest, I never finished this one.  The Strange is an interesting concept but I just can&#x27;t get into it for some reason.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;non-fiction&quot;&gt;Non-fiction&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Coders at Work
&lt;ul&gt;
&lt;li&gt;I&#x27;ve made it through the first interview at this point and it&#x27;s engaging enough to keep reading once I make the time for non-fiction.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Extreme Ownership
&lt;ul&gt;
&lt;li&gt;Really made me take a hard look at leadership, my own role in failures, and what kind of leader I want to aspire to be.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Rework
&lt;ul&gt;
&lt;li&gt;Bunch of good tidbits in here, even for people that may not be running their own business.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Passionate Programmer
&lt;ul&gt;
&lt;li&gt;Some of this book, I had an initially negative reaction to.  Mostly the &amp;quot;think like a business person&amp;quot; stuff.  In my &amp;quot;perfect&amp;quot; world, I&#x27;d just be writing code.  The business world doesn&#x27;t follow the same 
logical rules I&#x27;m used to thinking in, which makes it rather difficult for me.  Thus, it&#x27;s a learning opportunity.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Shallows: What the Internet Is Doing to Our Brains
&lt;ul&gt;
&lt;li&gt;Frightening book.  This is the one book this year that terrified me for the future of not only my own brain but the brains of the IT industry as well as for the developed (and soon enough developing) 
world.&lt;&#x2F;li&gt;
&lt;li&gt;Inspired me to read more, both paper books as well as on Kindle and listen to more.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Where Good Ideas Come From
&lt;ul&gt;
&lt;li&gt;Great audiobook for my now ~2 hour daily commute.  Engaging enough to keep your interest, but not so engaging that you forget you&#x27;re driving!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;How We Got to Now
&lt;ul&gt;
&lt;li&gt;Same as the above, another great audiobook for a commute.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Subtle Art of Not Giving a F*ck
&lt;ul&gt;
&lt;li&gt;Required reading, in my opinion, for anyone that says &amp;quot;yes&amp;quot; to too many things.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The Design of Everyday Things
&lt;ul&gt;
&lt;li&gt;Haven&#x27;t finished this one yet, but it&#x27;s already fascinating.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;tabletop-role-playing-game-ttrpg&quot;&gt;Tabletop Role-Playing Game (TTRPG)&lt;&#x2F;h3&gt;
&lt;p&gt;I read a lot of RPG books, not necessarily because I&#x27;m going to &lt;em&gt;play&lt;&#x2F;em&gt; that particular setting&#x2F;game&#x2F;etc, but because it might provide a new perspective on how to better run a particular situation, give me inspiration, or offer another tool I can throw in my GM&#x27;s toolbox (clocks from Blades in the Dark as one example).&lt;&#x2F;p&gt;
&lt;p&gt;This is what I can remember I&#x27;ve read this year.  It&#x27;s been a lot...&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ryuutama
&lt;ul&gt;
&lt;li&gt;I&#x27;ve seen it described as Miyazaki-meets-Oregon-Trail.  Great RPG focused on the &lt;em&gt;journey&lt;&#x2F;em&gt; of a character and the stories they tell.  Definitely worth a read even if you never play it as inspiration for how to make the journeys of your character&#x2F;player richer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Cypher System
&lt;ul&gt;
&lt;li&gt;Numenera
&lt;ul&gt;
&lt;li&gt;Jade Colossus: Ruins of Prior Worlds
&lt;ul&gt;
&lt;li&gt;I&#x27;m not sure if this counts as a setting book but it definitely expands the setting of Numenera providing an interesting &lt;em&gt;large&lt;&#x2F;em&gt; structure to explore and set adventures in.  More than that, it provides a &amp;quot;ruin&amp;quot; generator that&#x27;s fantastic (and is screaming for someone to create an online generator).  Great book, well worth purchasing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Shadewalker
&lt;ul&gt;
&lt;li&gt;Looks to be a great one-shot adventure and one for getting new players up and running.  It&#x27;s small enough that it can be placed pretty much anywhere in the Ninth World and would be easy to continue on from.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Ninth World Bestiary 2
&lt;ul&gt;
&lt;li&gt;To be honest, there wasn&#x27;t a whole lot here.  I love the &lt;em&gt;idea&lt;&#x2F;em&gt; of bestiaries as inspiration and to give you more and varied creatures to throw at players.  The thing is, Numenera isn&#x27;t supposed to be heavily combat focused and a lot of the creatures seem to be targets to swing at, not encounters to be role-played.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;In Alternate Dimensions
&lt;ul&gt;
&lt;li&gt;Have already used The Whispering World alternate reality for my ongoing campaign and it&#x27;s worked out incredibly well.  Would definitely recommend if you&#x27;re interested in ramping up the Weird factor.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Character Options 2
&lt;ul&gt;
&lt;li&gt;Fantastic.  I&#x27;d consider this a must-buy along with Character Options 1.  Adds new player classes and a ton of other options.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Unmasked
&lt;ul&gt;
&lt;li&gt;Retro 80&#x27;s setting, Superhero RPG.&lt;&#x2F;li&gt;
&lt;li&gt;To be honest, other than it being a cypher system setting, nothing else appeals to me in this book.  It&#x27;s definitely a lot different than what was represented in the Kickstarter and I&#x27;m disappointed.  That being said, there are a ton of reviews I&#x27;ve read online about how people love the setting and gameplay so more power to &#x27;em.  It&#x27;s just not for me.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Predation
&lt;ul&gt;
&lt;li&gt;Seems like a great setting and provides some &lt;em&gt;very&lt;&#x2F;em&gt; interesting options for companion beasties.  The roleplaying potential here is fantastic as the beasties are all played by someone who isn&#x27;t their human companion.  They also come with personalities and numerous other fun tidbits.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Expanded Worlds
&lt;ul&gt;
&lt;li&gt;To be honest, this one was pretty meh for me.  I&#x27;m sure I&#x27;ll mine it for info if I get bored with Numenera and want to world build.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Vurt
&lt;ul&gt;
&lt;li&gt;This setting book is gorgeous and jam-packed full of information, inspiration, and details about Manchester.&lt;&#x2F;li&gt;
&lt;li&gt;Best of all, it seems like it&#x27;s written in the Gamecat&#x27;s voice, so I was reading it in that voice (from the audiobook) the entire time.  I highly recommend this, kittlings.&lt;&#x2F;li&gt;
&lt;li&gt;Having read the novel I was glad to see the sex-focused bits of the Vurt world entirely optional or turned down a bit.  If your gaming group can handle it, great, but I haven&#x27;t even heard of one that can.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Blades in the Dark
&lt;ul&gt;
&lt;li&gt;Interesting system and world wrapped into a book that&#x27;s a little disjointed.  I&#x27;d recommend it for more experienced GM&#x27;s and players as it&#x27;s at best a morally ambiguous setting and game play with the potential to experience a lot of interesting and potentially uncomfortable situations.&lt;&#x2F;li&gt;
&lt;li&gt;As a GM the &amp;quot;clocks&amp;quot; mechanic is very interesting and one that I&#x27;ll likely steal for any other game I end up running.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Dungeon World
&lt;ul&gt;
&lt;li&gt;Haven&#x27;t played this yet, but it looks to be a great system for new players and GM&#x27;s.  It provides a limited list of &amp;quot;moves&amp;quot; for both the GM and the players and yet provides a ridiculous amount of freedom inside those moves.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Paranoia
&lt;ul&gt;
&lt;li&gt;Would love to play this in the future, not much to say here other than the &amp;quot;secret traitor&amp;quot; bit is definitely interesting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ttrpg-s&quot;&gt;TTRPG&#x27;s&lt;&#x2F;h2&gt;
&lt;p&gt;Critical Role!&lt;&#x2F;p&gt;
&lt;p&gt;Having listened to the Critical Role podcast for a good portion of this year&#x27;s commutes into and home from work, Matt is a GM &lt;strong&gt;god&lt;&#x2F;strong&gt; and has become someone that I can look up to, honestly.  He&#x27;s humble, interesting, engaging, talented, and has a lot of life wisdom.&lt;&#x2F;p&gt;
&lt;p&gt;The rest of the cast is similarly amazing and has likely been responsible for a good portion of the uptick in people playing D&amp;amp;D and other RPGs.&lt;&#x2F;p&gt;
&lt;p&gt;Critical Role has been such a positive influence on me that I started running my own Numenera campaign and so far it&#x27;s been a resounding success.  We&#x27;ve played approximately every 2 weeks for a good portion of the year now and one of my players has been inspired to run their own game!  It&#x27;s awesome to see one of your players take the GM&#x27;s mantle and &lt;em&gt;run with it!&lt;&#x2F;em&gt;  I&#x27;m currently playing in that game now and while she has a different style than myself, it&#x27;s an &lt;strong&gt;awesome&lt;&#x2F;strong&gt; game!&lt;&#x2F;p&gt;
&lt;p&gt;Another interesting side effect of playing Numenera is that my woodshop&#x2F;workshop area is much improved and organized.  Stay with me on this one.&lt;&#x2F;p&gt;
&lt;p&gt;I was looking for a good way to thank my players for sticking with me for the past however long we&#x27;ve bee playing as I GM&#x27;d my first real campaign.  After a lot of browsing on Reddit, YouTube, and others I decided to get them a set of dice boxes.  But, me being me, I can&#x27;t just &lt;em&gt;buy&lt;&#x2F;em&gt; something.  It has to have a personal touch somehow.  So, I ended up going down the route of buying some cheap boxes from a craft store.  Then I set to work sanding, distressing, finishing, staining, and felting the boxes.&lt;&#x2F;p&gt;
&lt;p&gt;Before I could do this, however, I needed a space to work in.  The logical space was my &amp;quot;workshop&amp;quot;, or better known as &amp;quot;the place where we put shit when we don&#x27;t know what to do with it.&amp;quot;  Que a 4 hour cleanup, organization, and trash music-montage.  Is the workspace perfect?  Hell no.  The better question is: &amp;quot;Is it functional enough?&amp;quot;  The answer to that one is a resounding yes.  I was able to finish the boxes and give them as gifts (along with dice) to my players.&lt;&#x2F;p&gt;
&lt;p&gt;So, not only was I able to start 2 different projects (boxes and workshop cleanup), I was actually able to finish them as well!  Nothing feels better to me than a project started &lt;em&gt;and&lt;&#x2F;em&gt; finished.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;colorado-4x4-rescue-and-recovery-co4x4rnr&quot;&gt;Colorado 4x4 Rescue and Recovery (CO4x4RnR)&lt;&#x2F;h2&gt;
&lt;p&gt;This year I joined a 4x4 non-profit.  Their (our) focus is person and vehicle extraction in the Colorado high country.  Specifically on Forest Service roads and Jeep trails.&lt;&#x2F;p&gt;
&lt;p&gt;My first recovery happened at the end of January.  I went on as a &amp;quot;ride-along&amp;quot; to see if it was for me 
and to get my feet wet.  Well, the next month I spent close to $8,000 in upgrades to my Jeep to get it ready for recoveries.  Talk about jumping in with both feet!  In training and gear alone this year, I&#x27;ve probably
spent over $10,000.  I can also say that the 20+ recoveries I&#x27;ve been on have &lt;em&gt;saved&lt;&#x2F;em&gt; our clients well over that amount, possibly many times.  On one recovery alone, the client was quoted $7,000 from a commercial towing company.&lt;&#x2F;p&gt;
&lt;p&gt;Since that time I&#x27;ve joined the newly-formed SAR-ES (Search and Rescue - Emergency Support) group inside CO4x4RnR, learned Wilderness First Aid (WFA), taken 2 separate recovery skills classes, gained at least one 4x4 mentor, and made some great friends.  It&#x27;s also gotten me out in nature more in one year than in the past 10 years combined.  That alone was worth it for my mental health.&lt;&#x2F;p&gt;
&lt;p&gt;Another project I was able to finish was the installation of some amber warning lights.  They&#x27;re currently installed in a temporary-but-functional sense which for now is good enough.  That seems to be a theme for the past year and especially the last couple of months.  &amp;quot;Perfect is the enemy of the good.&amp;quot;  So, don&#x27;t try to make things perfect.  Instead, make them good enough and &lt;em&gt;get. them. done.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;new-job&quot;&gt;New Job&lt;&#x2F;h2&gt;
&lt;p&gt;On top of everything else, I also started a new job.  Having gotten fed up with the lack of progress in my previous job as well as rats leaving what started to feel like a sinking ship, I looked for and found a new job within about a month.  Changing jobs has always been stressful for me as I&#x27;m sure it is for many people.  Thankfully, the new company has a much healthier culture, one where they&#x27;re not likely to lay off people or sell a good portion of the company on what feels like a whim.&lt;&#x2F;p&gt;
&lt;p&gt;There are a few warning signs with the new company but as a rule, I don&#x27;t talk about my current employer publicly, so my strategy right now is to adopt a wait-and-see approach.  What that means is that I keep working as hard as I can to do my job right and if the company fails me, or a better opportunity arises, well, I&#x27;ll move on to another.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly the days of working for a company for 10+ years are far behind us, especially in the tech industry.  Don&#x27;t get me wrong, if I found the right company, I&#x27;d stick with them until whatever retirement looks like in 20+ years.  The problem is I don&#x27;t know that company even exists.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;So, to sum up, personally I&#x27;ve had a fantastic year.  I&#x27;m hoping and working toward 2018 being even better.  Some things that are on my list:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Do more functional programming, preferably getting paid to do it!&lt;&#x2F;li&gt;
&lt;li&gt;Read more books, fiction &lt;em&gt;and&lt;&#x2F;em&gt; non-fiction, especially the dead-tree variety.&lt;&#x2F;li&gt;
&lt;li&gt;Play more games!  Specifically tabletop games (RPG or not) with friends.  The human connection is hard to beat.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Refactoring Python if Statements</title>
        <published>2017-12-23T00:00:00+00:00</published>
        <updated>2017-12-23T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/refactoring-python-if-statements/" type="text/html"/>
        <id>https://bryan-lott.github.io/refactoring-python-if-statements/</id>
        
        <content type="html">&lt;p&gt;Note: I&#x27;m not recommending the following refactoring to everyone, nor am I saying it was even a good idea.  It did, however, work out quite well for myself and my team.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;if pred_1 == &amp;#x27;first&amp;#x27;:
    output_data = output_data._replace(output_data_1=pred_3, output_data_2=pred_4)
    if pred_2 and self.state_management_3 in pred_2:
        output_data = merge_namedtuple(output_data, self.process_data_1())
    elif pred_3 == state_management_2.state1:
        if pred_4:
            output_data = merge_namedtuple(output_data, self.process_data_2())
        else:
            output_data = merge_namedtuple(output_data, self.process_data_3())
            if orig_data_2 in [state_management_1.STATE1, state_management_1.STATE2]:
                output_data = output_data._replace(output_data_1=orig_data_1, output_data_2=orig_data_2)
    elif pred_3 in [state_management_2.state2, state_management_2.state3]:
        if pred_4:
            output_data = merge_namedtuple(output_data, self.process_data_2())
        else:
            output_data = merge_namedtuple(output_data, self.process_data_3())
            output_data = output_data._replace(output_data_1=state_management_2.state1, output_data_2=state_management_1.STATE1)
elif pred_1 == &amp;#x27;second&amp;#x27;:
    if pred_2 and self.state_management_3 in pred_2:
        output_data = merge_namedtuple(output_data, self.process_data_1())
    elif pred_3 == state_management_2.state2:
        if pred_4 in [state_management_1.STATE3, state_management_1.STATE4, state_management_1.STATE5]:
            if pred5:
                output_data = merge_namedtuple(output_data, self.process_data_4())
        elif pred_4 in [state_management_1.STATE7, state_management_1.STATE8, state_management_1.STATE6, state_management_1.STATE9]:
            output_data = merge_namedtuple(output_data, self.process_data_2())
            if pred_4 == output_data.state_2:
                output_data = output_data._replace(state_1=None, state_2=None)
    elif pred_3 == state_management_2.state1 and not pred_4 and pred5:
        output_data = merge_namedtuple(output_data, self.process_data_4())
        output_data = output_data._replace(state_1=output_data.sub_data.state_1, state_2=output_data.sub_data.state_2)
    elif pred_3 == state_management_2.state1 and pred_4 and pred6:
        output_data = merge_namedtuple(output_data, self.process_data_2())
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Still with me?&lt;&#x2F;p&gt;
&lt;p&gt;...&lt;&#x2F;p&gt;
&lt;p&gt;Yeah, pretty sure I lost about 90% of you with that if-block.&lt;&#x2F;p&gt;
&lt;p&gt;This isn&#x27;t the actual code that I ended up refactoring, but it&#x27;s convoluted enough to give the same gut-wrenching feeling from it.  I&#x27;ve also done my best to anonymize it so to protect the guilty.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-white-whale&quot;&gt;The White Whale&lt;&#x2F;h2&gt;
&lt;p&gt;Story time!&lt;&#x2F;p&gt;
&lt;p&gt;I ran into this block of code my 3rd or 4th day on the job and recoiled in horror at it.  At the same time, it fascinated me that this was the encoding of some admittedly convoluted but mission-critical business logic into Python.  The &amp;quot;standard&amp;quot; refactor for an if-elif-elif-elif block in Python is to reach for a dictionary (hashmap for those not familiar with Python), encode the predicates into the keys and the functions to be called in the values.&lt;&#x2F;p&gt;
&lt;p&gt;Great... but... does that mean we need a nested dictionary here and, more importantly, would that actually make the code more readable?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;# we start with the first &amp;quot;layer&amp;quot;:
{&amp;#x27;first&amp;#x27;: {}
 &amp;#x27;second&amp;#x27;: {}}

# cool, that was easy... now the second &amp;quot;layer&amp;quot;:
{&amp;#x27;first&amp;#x27;: {pred_2: {}
           pred_3: {}
           }}

#uhhhh... we&amp;#x27;re going off the rails here...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The problem here comes down to the different layers not being symmetrical.  They all have various conditions and an amalgamation of predicates, states, and even types (some are lists, others are enums, others are booleans).&lt;&#x2F;p&gt;
&lt;p&gt;So... un-refactorable?&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll be honest, at this point I was wondering if it really was un-refactorable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-one-that-got-away&quot;&gt;The One That Got Away&lt;&#x2F;h2&gt;
&lt;p&gt;I left the code as-is for quite some time.  Months actually.  It was always sitting in the back of my head though, like an itch you can&#x27;t quite scratch.  Refactoring this bit of code was always on my to-do list, but I could never seem to find the time to really think about it.  Add on to this, it was mission-critical business logic encoding.  That always carries an inherent risk when you&#x27;re refactoring.  There were tests around the code, but they ended up having major holes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-light-on-the-horizon&quot;&gt;A Light on the Horizon&lt;&#x2F;h2&gt;
&lt;p&gt;Tests...&lt;&#x2F;p&gt;
&lt;p&gt;The golden rule of refactoring is that you never do it without a good set of tests to verify old and new logic.&lt;&#x2F;p&gt;
&lt;p&gt;Hah!  Of course!  Write unit tests around the entire if-statement-of-crazy.  If nothing else, I figured this would give me a deeper understanding of the business logic and the all-crucial &amp;quot;why&amp;quot; to some of the crazy logic.  While I was doing this, I sat down with a number of my coworkers to fill in the gaps in my knowledge.  As always, ask the people that were there first!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;darkness&quot;&gt;Darkness&lt;&#x2F;h2&gt;
&lt;p&gt;While I was chatting and interviewing my coworkers about this bit of code, there was an ominous phrase that kept popping up...&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;This isn&#x27;t the first time someone&#x27;s tried to refactor that if statement.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;...great...&lt;&#x2F;p&gt;
&lt;p&gt;After some introspection and some poking and prodding at my ego, I finally decided that it&#x27;d make a fun side project to &lt;em&gt;try&lt;&#x2F;em&gt;.  If I didn&#x27;t succeed, no worries, at least I had added a ton of tests around it so the next time it needed to change, we could be safe about changing it!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-hunt&quot;&gt;The Hunt&lt;&#x2F;h2&gt;
&lt;p&gt;After a number of false starts, thrown out code, and late nights I hit upon an interesting idea.&lt;&#x2F;p&gt;
&lt;p&gt;To look up a key in a Python dictionary, the &lt;code&gt;get&lt;&#x2F;code&gt; method does two things.  First, it hashes the key you&#x27;re looking up and compares it with all the hashed keys in the dictionary.  The second thing it does an equality comparison of the unhashed lookup key and unhashed dictionary key.  I assume the second round is to prevent hash collisions, but I honestly don&#x27;t know.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time, I was looking into using &lt;code&gt;namedtuples&lt;&#x2F;code&gt; as a way to encode multiple values into the key.  They have the advantage of being immutable and have easy methods to get and set values (important for readability of the final code).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shot-and-a-miss&quot;&gt;Shot and a Miss&lt;&#x2F;h2&gt;
&lt;p&gt;That was my next thought, encode all the logic into a &lt;code&gt;namedtuple&lt;&#x2F;code&gt; &amp;quot;template&amp;quot; and compare the actual data against the keys in the dictionary.&lt;&#x2F;p&gt;
&lt;p&gt;Well, there&#x27;s a problem with that.  At runtime, we don&#x27;t always have all the data necessary for a given branch of the codebase and, in fact, some of the data may be set, but it may not matter.&lt;&#x2F;p&gt;
&lt;p&gt;The upshot of this is that some branches of the if statement have an importance priority of the data looked up that&#x27;s different than other branches.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-new-drawing-board&quot;&gt;A New Drawing Board&lt;&#x2F;h2&gt;
&lt;p&gt;So, again, I was stumped.  If you compare two &lt;code&gt;namedtuples&lt;&#x2F;code&gt; with one another, all the data has to match or they aren&#x27;t considered equal.  Even if I could solve that problem, there was still the problem of the hash lookup in the dictionary.  If two &lt;code&gt;namedtuples&lt;&#x2F;code&gt; don&#x27;t have the exact same data in them, their hashes won&#x27;t match and thus looking it up in a dictionary will always fail.&lt;&#x2F;p&gt;
&lt;p&gt;Digging into Python&#x27;s hash magic methods, I hit upon a simple idea.  Make all the hashes the same.  That way Python is &lt;em&gt;forced&lt;&#x2F;em&gt; to use the equality function on the &lt;code&gt;namedtuples&lt;&#x2F;code&gt; when it compares them against the dictionary keys.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-new-hope&quot;&gt;A New Hope&lt;&#x2F;h2&gt;
&lt;p&gt;Thankfully everything in Python has public visibility.  The upshot of this is it means that I can create my own custom &lt;code&gt;namedtuple&lt;&#x2F;code&gt; that provides all the benefits of immutability as well as the readability of the fields, along with a custom equality function.&lt;&#x2F;p&gt;
&lt;p&gt;What this all boils down to is this bit of code for creating the Template for the dictionary.  These are meant to be filled with data and used as the keys in the lookup dictionary.  In addition, this &lt;code&gt;namedtuple&lt;&#x2F;code&gt; is used to fill out the data to be compared against the keys in the dictionary.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;# Decision matrix used in determining which data process to kick off
Template = namedtuple(&amp;quot;Template&amp;quot;, [&amp;#x27;pred1&amp;#x27;, &amp;#x27;pred2&amp;#x27;, &amp;#x27;pred3&amp;#x27;, &amp;#x27;pred4&amp;#x27;, &amp;#x27;pred5&amp;#x27;, &amp;#x27;pred6&amp;#x27;, &amp;#x27;pred7&amp;#x27;])
# Default any non-filled out fields to None
Template.__new__.__defaults__ = (None,) * len(Template._fields)
# Disable the hash function
Template.__hash__ = lambda self: 1
# Set our custom equality function
Template.__eq__ = rd_eq
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;custom-equality&quot;&gt;Custom Equality&lt;&#x2F;h2&gt;
&lt;p&gt;&amp;quot;Custom Equality&amp;quot; is such a great term, and it really threw the more science-minded folks for a loop!&lt;&#x2F;p&gt;
&lt;p&gt;To ease their trepidation, I told them that I wasn&#x27;t &lt;em&gt;really&lt;&#x2F;em&gt; setting up a custom equality, I was making sure that it works as a template rather than an exact match.  If data shows up in the template, it&#x27;s important, if it doesn&#x27;t, then it&#x27;s not and can be anything.&lt;&#x2F;p&gt;
&lt;p&gt;Note that the bottom code is more complex than just a simple template.  If you notice in the original code, there&#x27;s a lot of &lt;code&gt;if x in [&#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;, &#x27;d&#x27;]&lt;&#x2F;code&gt; thrown around along with at least one &lt;code&gt;if [&#x27;a&#x27;, &#x27;b&#x27;] == [&#x27;a&#x27;, &#x27;b&#x27;, &#x27;c&#x27;]&lt;&#x2F;code&gt; style.  That makes comparing against a template messy.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;def rd_eq(template, other):
    &amp;quot;&amp;quot;&amp;quot;Compare fields in template to fields in other if template.field is not None
    template and other are expected to be namedtuples, tuples, or lists.
    Order of the elements in each *does* matter.
    If an element is a list, make sure that all the subelements of that list appear in the template.
    :param template: namedtuple, non-null values are used for comparison
    :param other: namedtuple, all&amp;#x2F;some&amp;#x2F;none values can be filled out and will be compared with non-null values from template
    :return: true if the non-null values in template &amp;quot;match&amp;quot; in other, false otherwise
    &amp;quot;&amp;quot;&amp;quot;
    # compare template type to other type
    if template.__class__ != other.__class__ or len(template) != len(other):
        return False
    for template_val, other_val in zip(template, other):
        if template_val is not None:  # only &amp;quot;filled out&amp;quot; template values matter
            # compare element types
            if isinstance(template_val, list):
                if isinstance(other_val, list):
                    # if all the values in the &amp;quot;template&amp;quot; don&amp;#x27;t exist in the &amp;quot;other&amp;quot;, return false
                    if len(set(template_val).intersection(set(other_val))) != len(set(template_val)):
                        return False
                else:
                    if other_val not in template_val:
                        return False
            elif template_val != other_val:
                return False
    return True
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It&#x27;s worth reading through a few times, but in a nutshell:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If the value of a field in the template is filled in, try to compare it&lt;&#x2F;li&gt;
&lt;li&gt;If the value of the field is a list and the value being compared against isn&#x27;t, make sure the value being compared against is in the list.&lt;&#x2F;li&gt;
&lt;li&gt;If the value of the field is a list and the value being compared against is also a list, make sure the values in the template exist in the value being compared against.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-final-frontier&quot;&gt;The Final Frontier&lt;&#x2F;h2&gt;
&lt;p&gt;The last step in the crazy mess is to get our custom dictionary up and running.&lt;&#x2F;p&gt;
&lt;p&gt;First, we set up the list of templates in order from most-restrictive to least.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;# Just a coupling of data function and basic log message to send
FnRunner = namedtuple(&amp;quot;FnData&amp;quot;, [&amp;#x27;fn&amp;#x27;, &amp;#x27;log_message&amp;#x27;])

decisions = [
    (Template(pred2=[&amp;#x27;val1&amp;#x27;]),
     FnRunner(fn=self.process_data_2, log_message=&amp;#x27;Running data process 2&amp;#x27;)),
    (Template(pred1=&amp;#x27;first&amp;#x27;,
              pred3=[state_management_2.state1, state_management_2.state3, state_management_2.state4],
                    pred4=True),
     FnRunner(fn=self.process_data_1, log_message=&amp;#x27;Running data process 1&amp;#x27;))
# &amp;lt;snip&amp;gt;
]
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then we shove it in an ordered dictionary to preserve the restrictiveness (fun fact, ordered dictionaries are compared in-order)&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;self.decision_tree = OrderedDict(decisions)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;From there, we get the data to compare against and shove it into a Template &lt;code&gt;namedtuple&lt;&#x2F;code&gt; and fire off the comparison:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;# get the realtime data to compare against the templates
runner_data = Template(get_decision_data())

# create a noop function if we don&amp;#x27;t find a lookup in self.decision_tree
runner_noop = FnRunner(fn=lambda *args, **kwargs: RunnerResults(),
                       log_message=&amp;quot;Nothing to do, ignoring&amp;quot;)

# lookup the correct data runner function to run
# this is where the equality is called and everything is bashed against one another
data_runner_fn = self.decision_tree.get(runner_data, runner_noop)

# finally, run the function we found
output_data, log_message = data_runner_fn()
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Once I was done with all of this crazyness and had a working prototype that passed at least some of the tests I bounced it off of the team.  Their reactions were a pretty mixed bag, everything from disbelief that I had actually refactored the if-statement-of-crazy to curiosity at &lt;em&gt;how&lt;&#x2F;em&gt; I had done it.&lt;&#x2F;p&gt;
&lt;p&gt;To be honest, I&#x27;m still not 100% satisfied with the result, but the feedback in the following weeks was nothing but positive.  This is telling because around the same time, the business logic now encoded in the dictionary changed drastically.  This change was estimated to take around 2-4 weeks in the old if statement.  In the new one, it was done in 2 days.&lt;&#x2F;p&gt;
&lt;p&gt;I think the increase in productivity speaks for itself.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Doing what you Love</title>
        <published>2016-12-31T00:00:00+00:00</published>
        <updated>2016-12-31T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/doing-what-you-love/" type="text/html"/>
        <id>https://bryan-lott.github.io/doing-what-you-love/</id>
        
        <content type="html">&lt;p&gt;Those that know me, know that I &lt;em&gt;love&lt;&#x2F;em&gt; Clojure as a language.  The simplicity of syntax and concept draws me like a moth to a flame.  It wouldn&#x27;t be too far to say it&#x27;s my favorite language and I never have the option of developing anything in it.&lt;&#x2F;p&gt;
&lt;p&gt;I started with Clojure several years ago when I got fed up with the Python threading&#x2F;multiprocessing pain.  While it wasn&#x27;t exactly the easiest language to learn, the community and the resources available online made the transition reasonably painless.  I also probably have an advantage that I was never formally trained in object oriented principals or design and most of my training was either self driven or on the job so switching from object oriented to functional was much easier.&lt;&#x2F;p&gt;
&lt;p&gt;However, I&#x27;ve wanted to use Clojure on a daily basis in my role as a programmer almost since I started learning it.  My team, management, and other developers, however, constantly push back on it because &amp;quot;it looks weird.&amp;quot;  Not kidding, that&#x27;s a direct quote.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;My frustration with this was building on a daily basis.  It was triggered moreso because of the simplicity of the issue.  99% of the pushback against Clojure was due to the parentheses being on the left side of the function:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;# this was deemed to be simpler&amp;#x2F;easier to read
&amp;quot;\t&amp;quot;.join([str(i) for i in range(100) if i % 2 == 0])

&amp;#x27;0\t2\t4\t6\t8\t10\t12\t14\t16\t18\t20\t22\t24\t26\t28\t30\t32\t34\t36\t38\t40\t42\t44\t46\t48\t50\t52\t54\t56\t58\t60\t62\t64\t66\t68\t70\t72\t74\t76\t78\t80\t82\t84\t86\t88\t90\t92\t94\t96\t98&amp;#x27;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;clojure&quot; class=&quot;language-clojure &quot;&gt;&lt;code class=&quot;language-clojure&quot; data-lang=&quot;clojure&quot;&gt;;; than this
(clojure.string&amp;#x2F;join
  &amp;quot;\tab&amp;quot;
  (filter even? (range 100)))

&amp;quot;0\t2\t4\t6\t8\t10\t12\t14\t16\t18\t20\t22\t24\t26\t28\t30\t32\t34\t36\t38\t40\t42\t44\t46\t48\t50\t52\t54\t56\t58\t60\t62\t64\t66\t68\t70\t72\t74\t76\t78\t80\t82\t84\t86\t88\t90\t92\t94\t96\t98&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note than in the Python version there are 4 groupings (parens and&#x2F;or brackets) whereas in the Clojure version there are &lt;em&gt;three&lt;&#x2F;em&gt; groupings.  Tell me again about how many more parentheses there are in Clojure?&lt;&#x2F;p&gt;
&lt;p&gt;In addition, if you can&#x27;t move the opening paren to the left side of the function and still read it, you&#x27;ve got bigger problems than what I can fix:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;str(1)
&amp;quot;1&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;clojure&quot; class=&quot;language-clojure &quot;&gt;&lt;code class=&quot;language-clojure&quot; data-lang=&quot;clojure&quot;&gt;(str 1)
&amp;quot;1&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Yes, I realize that these are both contrived examples, but they illustrate the core point of my frustration.  Clojure is &lt;em&gt;not&lt;&#x2F;em&gt; harder to read, it&#x27;s &lt;em&gt;different&lt;&#x2F;em&gt;.  And if you can&#x27;t or don&#x27;t want to learn something new then you&#x27;re in the wrong profession.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;So, because no one else was interested in learning it or supporting it in production, to ease the discomfort I was feeling with being stuck, I forged ahead anyway.  But, I did so with caution and pragmatism.  We had a very small issue that was plaguing us for some time.  A Python process would every once in a while log a traceback.  We had no out of the box way of getting at the full text of those tracebacks in any of our metrics, logging, or reporting tools as Python tracebacks span multiple lines.  In addition, the process would retry a given number of times so not all tracebacks should be pushed to the visibility of the engineering team, necessitating some custom logic.  The existing alerting pushed notifications to Slack, but without the full text of the traceback and it pushed all tracebacks, not just the critical failures and left out some important debugging details.&lt;&#x2F;p&gt;
&lt;p&gt;As an isolated, non-mission critial (the other alerts would continue as-is for some time) task, this seemed like a perfect location to introduce Clojure as a solution.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bryan-lott&#x2F;TracebackFilter&quot;&gt;Github: Tracebackfilter&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s now been in production for close to 2 months now and has been working like a charm.  In addition, no one has derided the fact that it&#x27;s written in Clojure.  Not only did I really enjoy writing it, it&#x27;s become a gateway for showing other people what Clojure looks like that&#x27;s actually in production!&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Build what you love, even if it goes against the grain, but do it pragmatically.  It&#x27;s the only way to push us forward.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>When It&#x27;s Time to Move On</title>
        <published>2016-12-31T00:00:00+00:00</published>
        <updated>2016-12-31T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/when-it-s-time-to-move-on/" type="text/html"/>
        <id>https://bryan-lott.github.io/when-it-s-time-to-move-on/</id>
        
        <content type="html">&lt;p&gt;I&#x27;m now in the final stages of moving from my current company to a new one.  What follows is a rundown of what&#x27;s been going on in my brain throughout the entire process, my motivations, and my reasoning.&lt;&#x2F;p&gt;
&lt;p&gt;This is not intended to disparage my current company nor hold the new company up on a pedestal.  This is my (limited) perspective.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coming-to-conclusions&quot;&gt;Coming to Conclusions&lt;&#x2F;h2&gt;
&lt;p&gt;Hindsight is, of course, 20:20.  Every time I&#x27;ve left a job, I&#x27;ve been able to see where the thought of leaving started, why it kept brewing for so long, what I did or didn&#x27;t do to perpetuate the thought, etc.  With each new job, I&#x27;m unable to see that moment when it actually happens, or for that matter, I can&#x27;t seem to see the lead-up to that moment.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-am-i-feeling-like-leaving&quot;&gt;Why am I feeling like leaving?&lt;&#x2F;h3&gt;
&lt;p&gt;I can cite many reasons for leaving at this point, but what it comes to is two points.  I&#x27;ll dive into these in a moment.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I&#x27;m feeling bored and have been for some time
 * &lt;a href=&quot;https:&#x2F;&#x2F;bryan-lott.github.io&#x2F;when-it-s-time-to-move-on&#x2F;randsinrepose.com&#x2F;archives&#x2F;bored-people-quit&#x2F;&quot;&gt;Bored People Quit&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;I feel like management ignores my voice and perspective&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;bored&quot;&gt;Bored?&lt;&#x2F;h4&gt;
&lt;p&gt;Talk about a first-world problem, right?&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I&#x27;m booooreddddddd, somebody give me something interesting to dooooooooo&amp;quot;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;It&#x27;s not as trite and silly as it sounds though.  If you haven&#x27;t read the above link, stop reading this and go read &lt;a href=&quot;https:&#x2F;&#x2F;bryan-lott.github.io&#x2F;when-it-s-time-to-move-on&#x2F;randsinrepose.com&#x2F;archives&#x2F;bored-people-quit&#x2F;&quot;&gt;Bored People Quit&lt;&#x2F;a&gt; now otherwise what I&#x27;m going to say going forward won&#x27;t make much sense.&lt;&#x2F;p&gt;
&lt;p&gt;At my current position, I ended up getting hit in the crosshairs of two separate &amp;quot;boredom&amp;quot; concepts that Rands talks about:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Keeping an interesting problem squarely in front of them.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;They can only ‘take one for the team’ for so long.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Somewhat related to one another, my position ended up being prod support for an unnecessarily complex and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;matthiasn&#x2F;talk-transcripts&#x2F;blob&#x2F;master&#x2F;Hickey_Rich&#x2F;SimpleMadeEasy.md&quot;&gt;complected&lt;&#x2F;a&gt; piece of software.  While I understood the reason behind my &amp;quot;taking one for the team&amp;quot; (I actually volunteered for it because I was the logical choice given domain knowledge, skill set, etc), it extended far longer than I expected and far longer than I was able to be intrinsically motivated.  Prod support isn&#x27;t terribly interesting and this exacerbated the situation.&lt;&#x2F;p&gt;
&lt;p&gt;I should have realized that I was getting &amp;quot;bored&amp;quot; much sooner than I did and I take full responsibility for that.&lt;&#x2F;p&gt;
&lt;p&gt;When I realized what was going on and started speaking up... well...&lt;&#x2F;p&gt;
&lt;h4 id=&quot;is-anyone-truly-listening&quot;&gt;Is anyone truly listening?&lt;&#x2F;h4&gt;
&lt;p&gt;In short, I felt like no one was hearing my concerns.  I was speaking out primarily in one-on-one meetings, but occasionally in larger meetings, &amp;quot;hey, we need to stop band-aiding this issue and &lt;em&gt;actually&lt;&#x2F;em&gt; fix it.&amp;quot;&lt;&#x2F;p&gt;
&lt;p&gt;As a shy introvert, I tend to not speak up a lot.  This leads to my team lead or manager putting on &lt;em&gt;literally&lt;&#x2F;em&gt; every review &amp;quot;needs to speak up more&amp;quot;.  Same thing I&#x27;ve heard since elementary school.  Sorry people, I&#x27;m not wired that way.  If I&#x27;m talking, chances are I have something important to say.  Unfortunately volume, in both loudness as well as amount, is valued over content.&lt;&#x2F;p&gt;
&lt;p&gt;This historically has led me into a downward spiral of &amp;quot;no one&#x27;s listening to me anyway, why should I speak up?!&amp;quot;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-am-i-looking-for&quot;&gt;What am I looking for?&lt;&#x2F;h3&gt;
&lt;p&gt;This was a critical question for me to answer.  Was I looking for &amp;quot;different&amp;quot; or was I actually looking for something &amp;quot;better&amp;quot;?&lt;&#x2F;p&gt;
&lt;p&gt;Those look different from one another and I decided that I was looking for &amp;quot;better&amp;quot;.  This led me to turn down interviews and severely limited which companies I was applying to.  Where I work &lt;em&gt;is&lt;&#x2F;em&gt; a good place to work so finding &amp;quot;better&amp;quot; ended up being an interesting challenge.  I was done with the current company by this point and my intrinsic motivation had shifted from &amp;quot;working on something interesting&amp;quot; to &amp;quot;finding something interesting to work on&amp;quot;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;looking-elsewhere&quot;&gt;Looking Elsewhere&lt;&#x2F;h2&gt;
&lt;p&gt;Resumes and interviews are a game of numbers.  With that in mind, the best advice I can give is to spread your resume as far and wide as you possibly can.  My offer came through a new-to-me website called &lt;a href=&quot;http:&#x2F;&#x2F;hired.com&quot;&gt;Hired.com&lt;&#x2F;a&gt; which I was very happy with.  It took me a couple of tries to get responses from companies but I had two solid interview experiences and almost nothing by applying directly.  I estimate that I probably sent out my resume to 20-30 companies.&lt;&#x2F;p&gt;
&lt;p&gt;Out of that pool, I got a grand total of 4 phone screens, which led to 3 2nd phone screens, and 1 on-site.&lt;&#x2F;p&gt;
&lt;p&gt;Like I said, it&#x27;s a game of numbers.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;different-vs-better&quot;&gt;Different vs. Better&lt;&#x2F;h3&gt;
&lt;h2 id=&quot;the-final-decision&quot;&gt;The Final Decision&lt;&#x2F;h2&gt;
&lt;blockquote&gt;
&lt;p&gt;How does it feel to leave the best company you&#x27;ve ever worked for?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Leave it to one of my best work buddies to ask the hard questions.  What it feels like to me is I&#x27;m not leaving the best company I&#x27;ve ever worked for.  I&#x27;m leaving a company.  That&#x27;s it.  When I first started, it was the best company I&#x27;d ever worked for but over time, that transformed into &amp;quot;just another job.&amp;quot;  Once it hit that point, it was no longer the best company I&#x27;d ever worked for.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-fallout&quot;&gt;The Fallout&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;emotions-run-high&quot;&gt;Emotions Run High&lt;&#x2F;h3&gt;
&lt;p&gt;It&#x27;s important that once you make an announcement you let any feedback roll off your back.  Coworkers will feel betrayed, happy, angry, panicked.  The whole gamut of emotions, sometimes in rapid succession, sometimes all at once.  It&#x27;s rough, both for them and you, so give them the benefit of the doubt.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;who-is-this-person-anyway&quot;&gt;Who is this person anyway?!&lt;&#x2F;h3&gt;
&lt;p&gt;You find out interesting things about people when you &amp;quot;betray&amp;quot; them by leaving.  Remember, leaving a company is like going through a breakup.  You&#x27;re essentially telling them and the company that they aren&#x27;t good enough.  Try to let them down easy but don&#x27;t patronise them either.  And for insert-deity-here&#x27;s sake, help through the transition.  You&#x27;re already holding a blow torch to a gas-soaked bridge by leaving.  Do your best to not light the bridge!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;time-off&quot;&gt;Time Off&lt;&#x2F;h2&gt;
&lt;p&gt;Always, always, always, make sure to take at least a week off between companies, longer if possible.  Take that time to reset, clear your head, and drop any baggage you were carrying from your former employer.  It&#x27;s not fair to the new company, your new coworkers, or yourself to carry that pile of crap with you into the new job.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;freshness&quot;&gt;Freshness&lt;&#x2F;h2&gt;
&lt;p&gt;Once you&#x27;ve (hopefully) taken that time off, walk into the new company with fresh eyes.  Your first months at a new company are the most valuable, in my opinion.  You have the perspective of looking at the code, infrastructure, policies and procedures, etc with an outsider&#x27;s perspective.  That perspective doesn&#x27;t last long so at the very least take notes and &lt;em&gt;ask the dumb questions&lt;&#x2F;em&gt;.  Those questions that seem simple on the surface but question the status-quo.  That&#x27;s not to say you should expect anything other than &amp;quot;that&#x27;s the way things are and we can&#x27;t change it.&amp;quot;&lt;&#x2F;p&gt;
&lt;p&gt;That being said, you might just spur a vastly positive change for the company.  At worst, you learn a ton about the history of the company and how they got to &amp;quot;now&amp;quot; which can only make you more effective at your new job.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Why I love RPG&#x27;s</title>
        <published>2016-08-27T00:00:00+00:00</published>
        <updated>2016-08-27T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/why-i-love-rpg-s/" type="text/html"/>
        <id>https://bryan-lott.github.io/why-i-love-rpg-s/</id>
        
        <content type="html">&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;For the people that know me, they know I &lt;em&gt;love&lt;&#x2F;em&gt; RPG&#x27;s, whether they be computer based, tabletop, or just reading the new source book that came out yesterday.  Maybe it seems a bit odd to the general population with questions like &amp;quot;isn&#x27;t that dangerous&#x2F;satanic?&amp;quot;  Seriously, this still gets asked 30+ years after D&amp;amp;D (Dungeons &amp;amp; Dragons) was put in the same category as fictional satanic cults.  But I digress.  In this post I hope to answer the &amp;quot;why&amp;quot; of RPG&#x27;s for me and maybe encourage you to take a look at them as well.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-an-rpg&quot;&gt;What is an RPG?&lt;&#x2F;h2&gt;
&lt;p&gt;Anyone that&#x27;s played an RPG can feel free to skip over this section.  I&#x27;m including it for anyone that has no clue what I&#x27;m talking about.  For the most part I&#x27;m going to be focusing on tabletop&#x2F;in-person RPG&#x27;s, not the computer variety.&lt;&#x2F;p&gt;
&lt;p&gt;In a nutshell, you can think of an RPG as 3-6 friends, sitting around a table for a few hours, telling a story together.  That&#x27;s it, the rolling of dice, rules, character sheets, etc is all ancillary to the telling of a good story together.&lt;&#x2F;p&gt;
&lt;p&gt;RPG stands for Role Playing Game.  What that means is you take on the persona (or role) of a character in a story.  In &lt;em&gt;most&lt;&#x2F;em&gt; games, there are 2 primary roles: the Player Character (PC), and the Game Master (GM).  In some games the GM is called the Dungeon Master (DM) but for the most part they are interchangeable terms.&lt;&#x2F;p&gt;
&lt;p&gt;The GM plays the part of the world.  I.e., they tell the PC&#x27;s what they see, set difficulties to determine whether PC&#x27;s succeed or fail at a given task, act out the part of any Non-Player Characters (NPC&#x27;s), and just generally run the game.  They, in most games, also spend quite a bit of time outside of the actual game session thinking up and researching the &amp;quot;bones&amp;quot; of the story and the setting.&lt;&#x2F;p&gt;
&lt;p&gt;The PC&#x27;s act out the part of their characters in the game.  They take on the persona of a character and generally explore, fight, and experience the setting and story.&lt;&#x2F;p&gt;
&lt;p&gt;Normally players meet in-person or in an on-line voice&#x2F;video chat on a regular basis for sessions.  A session can be thought of as a chapter in a book or the amount you would read in one sitting.  It can last anywhere from a few minutes to upwards of an entire weekend.  In my own experience, everyone generally starts getting tired and burned out after about three hours or so.  In a general sense a session is the telling of a part of the story by the GM and PC&#x27;s, resolving of challenges&#x2F;battles, and gathering rewards to further character development.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-i-find-rpg-s-interesting&quot;&gt;Why I find RPG&#x27;s interesting&lt;&#x2F;h2&gt;
&lt;p&gt;There are a number of reasons why I find RPG&#x27;s so interesting.  The first of which is you&#x27;re telling a story with friends that has never been heard before.  Even if you&#x27;re following a published adventure, what happens during the adventure is unique to your particular experience in that moment.  Moments such as the classic joke &amp;quot;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=vChEPj0dXXk&quot;&gt;I&#x27;m attacking the darkness!&lt;&#x2F;a&gt;&amp;quot; seem to come out of almost every session.  On top of that, it&#x27;s not just a shared story, it&#x27;s a shared experience that can be touching, moving, filled with despair, sprinkled with moments of wonder, all in a single session.  As humans, we have an almost primal need to tell and hear stories with our fellow companions.  This is just another avenue for that.  RPG&#x27;s provide useful guidelines for people who aren&#x27;t natural storytellers or are uncomfortable telling stories.&lt;&#x2F;p&gt;
&lt;p&gt;In addition, in our digital age of increasing isolation and fewer meaningful connections with other humans, there&#x27;s something so incredibly satisfying about spending a couple of hours just talking with other people in-person about something you all, very quickly, become emotionally invested in.&lt;&#x2F;p&gt;
&lt;p&gt;The final reason why I love RPG&#x27;s is they&#x27;re a chance to escape.  Escape from the day-to-day routine into a fantastic world where you&#x27;re saving the local town from a dragon or from a killer alien.  It&#x27;s a chance to become &lt;em&gt;epic&lt;&#x2F;em&gt;.  Which, far too often in our own world means financial status.  For me, having enough money so my survival needs are taken care of is a necessity, but on some level it still feels empty somehow.  If I just saved an entire town from a flood caused by the local villain, it gives me an immense sense of satisfaction.  Just the same as if I were the GM and setting up this scenario and seeing my players overcome the challenges I&#x27;ve laid out.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;source-books&quot;&gt;Source books&lt;&#x2F;h2&gt;
&lt;p&gt;Or, why a source book can sometimes be better for me than any novel.&lt;&#x2F;p&gt;
&lt;p&gt;It all comes down to potential.  A novel, even a fantastic one, is already written.  The story is already known, even if I haven&#x27;t read it yet.  A good novel for me focuses much more on the world-building aspect.  While I&#x27;m reading the story and following the main characters, the rest of my brain is filling in details about the world.  Everything from what&#x27;s over the ridge that the characters never quite make it over, to the tavern owner that only has a paragraph devoted to her and then isn&#x27;t mentioned for the rest of the book.  What&#x27;s her life like?  What other interesting characters has she seen?  Is her tavern successful or does she owe a debt to a sketchy underworld boss?&lt;&#x2F;p&gt;
&lt;p&gt;A source book provides all the world building I could ever ask for without all the pesky details of a story already written.  It allows my mind to run wild, filling in any details it chooses to.  Some of these have the potential to turn into adventures for my PC&#x27;s.  Which brings me full circle.  Now it isn&#x27;t just a story I&#x27;ve made up between the lines of someone else&#x27;s story, it&#x27;s now my own story.  One I can share and share in the writing of with friends over many sessions.&lt;&#x2F;p&gt;
&lt;p&gt;Source books also spark my creativity to life.  Whenever I&#x27;m in a creative rut, even if it&#x27;s not planning for the next session for my PC&#x27;s, the very act of looking through a source book can spark &lt;em&gt;all&lt;&#x2F;em&gt; of my creativity to life.  No longer am I bored with photography, or woodworking, or any of the many arts I pursue.  That spark has returned and I am, once again, able to create to my heart&#x27;s content.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Concurrency Part 2</title>
        <published>2016-07-08T00:00:00+00:00</published>
        <updated>2016-07-08T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/concurrency-part-2/" type="text/html"/>
        <id>https://bryan-lott.github.io/concurrency-part-2/</id>
        
        <content type="html">&lt;p&gt;Wow, even trivial concurrency in Python is hard...&lt;&#x2F;p&gt;
&lt;p&gt;So, you have a list of tasks that you want to consume lazily (as they&#x27;re generated, so you don&#x27;t blow up memory).  Great!  That&#x27;s easy to do with a generator function using the yield keyword or the (syntax).  But, oh no... you can&#x27;t pass that to a multiprocess function because it&#x27;s not picklable.  Drat!&lt;&#x2F;p&gt;
&lt;p&gt;Next, you go down the road of:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;p.map(worker, itertools.islice(generator_function, slice_size))
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which is great, until you want to lazily push results back to the main process because that work now blows up memory.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;for block in p.imap(worker, itertools.islice(generator_function, slice_size)):
    do_additional_work()
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The above won&#x27;t work because again, generator functions aren&#x27;t picklable so you have to return result sets from the worker function instead of being able to yield rows back.&lt;&#x2F;p&gt;
&lt;p&gt;So, you end up shoving as much as you can into the worker function so that you don&#x27;t have to deal with passing large chunks of work back and forth.  I&#x27;m sorry, but this is a terrible state of things.  I&#x27;m sure there&#x27;s libraries that help to ease this pain but my point is there shouldn&#x27;t NEED to be libraries.  This should be core python.  And yes, sadly, I&#x27;m stuck on 2.7x.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How-to: Read from STDIN or a File in Clojure</title>
        <published>2016-06-20T00:00:00+00:00</published>
        <updated>2016-06-20T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/how-to-read-from-stdin-or-a-file-in-clojure/" type="text/html"/>
        <id>https://bryan-lott.github.io/how-to-read-from-stdin-or-a-file-in-clojure/</id>
        
        <content type="html">&lt;p&gt;or... how to avoid wasting 2 days!&lt;&#x2F;p&gt;
&lt;p&gt;First, the completed code:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;clojure&quot; class=&quot;language-clojure &quot;&gt;&lt;code class=&quot;language-clojure&quot; data-lang=&quot;clojure&quot;&gt;(ns char-check.core
  (:require
    [clojure.tools.cli :refer [parse-opts]])
  (:gen-class))

(defn exit
  &amp;quot;Exits the program with a status code and message.&amp;quot;
  [status msg]
  (println msg)
  (System&amp;#x2F;exit status))

(defn main
  &amp;quot;Main function.  Calling without a file object results in reading from STDIN (*in*).
  Otherwise, opens the in-file as a stream.&amp;quot;
  ([]
   (main (java.io.BufferedReader. *in*)))
  ([in-file]
   (with-open [r in-file]
     (line-seq r))))

(def cli-options
  [[&amp;quot;-h&amp;quot; &amp;quot;--help&amp;quot;]])

(defn -main
  &amp;quot;Entrypoint, parses arguments, exits with any errors, provides args to main.&amp;quot;
  [&amp;amp; args]
  (let [{:keys [options arguments errors summary]} (parse-opts args cli-options)]
    (cond
      (:help options) (exit 0 summary)
      errors (exit 1 (join &amp;quot;\n&amp;quot; errors))
      (empty? arguments) (main)
      :else (main (clojure.java.io&amp;#x2F;reader (first arguments))))))
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, here&#x27;s what we&#x27;re doing... first, take a look at:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;(cond
  (:help options) (exit 0 summary)  ;; if we get the help option, spit out some help!
  errors (exit 1 (join &amp;quot;\n&amp;quot; errors))  ;; if we get errors, print them out and exit
  (empty? arguments) (main)  ;; if we don&amp;#x27;t get a file argument, call main with no args and let it take care of things
  :else (main (clojure.java.io&amp;#x2F;reader (first arguments))) ;; if we got an argument, treat the first argument (yeah, it&amp;#x27;s naive...) as a filename and wrap it in a file reader
 )))
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, this is pretty basic flow control for the command line arguments and the presence or lack of a filename to run through.  Arguments come in through the &lt;code&gt;&amp;amp; args&lt;&#x2F;code&gt; and get parsed via &lt;code&gt;parse-opts&lt;&#x2F;code&gt;.  This results in any filenames ending up in &lt;code&gt;arguments&lt;&#x2F;code&gt; and if we don&#x27;t get any, pass that along to main.  If, however, we get at least one, grab the first, wrap it in a file reader, and pass it along to main (arity 1).&lt;&#x2F;p&gt;
&lt;p&gt;The next bit is in the main function:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;([]  ;; arity 0... if we don&amp;#x27;t get any arguments, call main again, but this time pass it a BufferedReader wrapped *in*
 (main (java.io.BufferedReader. *in*)))
([in-file]  ;; this will either get called with the arity 0 function and be passed *in* OR it will have an actual filename that can then be opened up and operated on.
 (with-open [r in-file]
   (line-seq r))))
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So here we&#x27;re either getting 0 or 1 argument.  If we get 1 argument, great, treat it as a file and run with it.  Otherwise, we got 0 arguments which means we need to wrap &lt;code&gt;*in*&lt;&#x2F;code&gt; in a buffered file and then pass it along to the arity 1 &amp;quot;version&amp;quot; of main.&lt;&#x2F;p&gt;
&lt;p&gt;The final bit is &lt;code&gt;(line-seq r)&lt;&#x2F;code&gt;.  That&#x27;s a lazy function to return lines from the file&#x2F;stdin.  Use that like you would any other lazy sequence.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reading Update</title>
        <published>2016-06-16T00:00:00+00:00</published>
        <updated>2016-06-16T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/reading-update/" type="text/html"/>
        <id>https://bryan-lott.github.io/reading-update/</id>
        
        <content type="html">&lt;p&gt;So, after about 8 months of on-and-off focusing on reading more long-form items, how am I doing?  Objectively, I&#x27;d give myself a C-.  Barely passing, and here&#x27;s why.&lt;&#x2F;p&gt;
&lt;p&gt;I can absolutely say that I&#x27;m doing much better at reading long-form items.  Currently I&#x27;m working through Stephen Hawking&#x27;s Illustrated A Brief History of Time and The Universe in a Nutshell.  Fantastic read, really engaging, and it&#x27;s great to be able to relax with a book before bed.&lt;&#x2F;p&gt;
&lt;p&gt;That being said, I haven&#x27;t been doing as well at actually &lt;em&gt;finishing&lt;&#x2F;em&gt; long-form books.  I have at least 3-4 books going on my Kindle right now with almost no motivation to finish them.  I can&#x27;t quite say why, though I wish I knew.  I think part of it is dealing with some pretty serious depression lately and that, of course, seems to drown any motivation to do much of anything.&lt;&#x2F;p&gt;
&lt;p&gt;So, plan going forward?  Make time (at least 30 minutes a day) to read something on the Kindle.  Mornings may actually be the best time for this as I normally screw around on my phone for at least that much time before leaving for work.  Discipline, right?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Burnout</title>
        <published>2016-06-13T00:00:00+00:00</published>
        <updated>2016-06-13T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/burnout/" type="text/html"/>
        <id>https://bryan-lott.github.io/burnout/</id>
        
        <content type="html">&lt;p&gt;Burnout ...and possibly how to defend against it.&lt;&#x2F;p&gt;
&lt;p&gt;A little bit of backstory is probably in order.  For me, burnout has never been a problem until this past month.  Working on a migration from a data center to the cloud that&#x27;s run over 6 months of constant work has gotten me pretty fried.  We&#x27;re nearly at the end and I feel like I&#x27;ve gained quite a bit of perspective on this problem, at least for myself.  I feel like I&#x27;m actually in a decent place to talk about how I prevented total burnout&#x2F;quitting&#x2F;etc and maybe what I&#x27;ve learned can help someone else (including myself, the next time I&#x27;m facing burnout).&lt;&#x2F;p&gt;
&lt;p&gt;First off, there are two things that I believe contribute to burnout.  Time sinks and mental energy sinks.  Context switching is a great example of a time sink.  We all know that we lose at least 15 minutes of productive time when we context switch.  What we don&#x27;t always realize is how much mental energy we spend.  Burnout happens when we either have no more time or no more mental energy.  Time can be recovered by extending deadlines, having other knowledgeable people help on the problem, etc.  Mental energy however is being constantly drained while working on a given problem.  For me, I find very few ways to recover that energy, none of which are quick.  So, what we have are two ways of preventing burnout:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Reduce&lt;&#x2F;em&gt; mental energy drain&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Replenish&lt;&#x2F;em&gt; mental energy&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Let&#x27;s tackle the &lt;em&gt;reduce&lt;&#x2F;em&gt; problem first.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reducing-mental-energy-drain&quot;&gt;Reducing Mental Energy Drain&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;support-system&quot;&gt;Support System&lt;&#x2F;h3&gt;
&lt;p&gt;Having a good, solid support system of friends, family, and coworkers is the first thing that helped me prevent mental drain.  Knowing that someone has your back when you&#x27;re spending all of your mental energy fighting through an obscure bug in a complex ETL system that&#x27;s been mangled and munged just to get it working is shockingly helpful.  Just as having an significant other that understands why you&#x27;re mubling under your breath at the dinner table and get up in the middle of eating because you just had a breakthrough can save your sanity and your relationship.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tooling&quot;&gt;Tooling&lt;&#x2F;h3&gt;
&lt;p&gt;Any tool you currently use that adds to your cognative load or adds barriers to solving problems needs to be thrown out a window, right now.  You&#x27;re not doing yourself any favors by using something that&#x27;s not quite good enough or even &amp;quot;good enough&amp;quot;.  Your tools are extensions of your brain and anything that&#x27;s standing in the path between your brain and the solution to your problem needs to help, not hinder.  Everything from the keyboard you type on, to the headphones you use to stay focused, to the text editor you write blog posts in.  Everything matters.  So much so that you, right now, need to take a good hard look at the tools you use and identify any that are problematic.  No, I really mean that, go do it now.  I&#x27;ll wait.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;breaking-down-problems&quot;&gt;Breaking down problems&lt;&#x2F;h3&gt;
&lt;p&gt;The brain can only handle so much at any given time, so, to prevent mental drain, give it less to chew on.  If you have a large problem, first, document what the problem is.  Then, if it&#x27;s still to large, start breaking it down into managable chunks, documenting each of those and then take them one by one.  I guarantee it&#x27;ll be easier than trying to tackle the entire thing, all at once.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;replenishing-mental-energy&quot;&gt;Replenishing Mental Energy&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;play&quot;&gt;Play&lt;&#x2F;h3&gt;
&lt;p&gt;Hopefully you have an office as relaxed as mine as I find that shooting one another with nerf guns and having impromteau &amp;quot;nerf wars&amp;quot; is a &lt;em&gt;huge&lt;&#x2F;em&gt; stress relief and a way to remember that your coworkers are just as stressed as you are &lt;em&gt;and&lt;&#x2F;em&gt; that they&#x27;re just as human, childish, and fun as you are.  Failing that, make time to go do something fun, whether that&#x27;s gardening, 4-wheeling, or just going for a walk in the park.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;get-away-from-the-computer&quot;&gt;Get away from the computer&lt;&#x2F;h3&gt;
&lt;p&gt;No, seriously.  The more time I spend with computers, the more I&#x27;ve come to realize that I need time away from them.  If you&#x27;re under a deadline, this &amp;quot;time away&amp;quot; definitely comes at a premium, but is vital to replenish some of your mental energy.  Bonus points if it happens to be something physical.  Several things that have worked for me have been tai-chi, woodworking, yard work (no, really!  I actually find that mowing the lawn is a very meditative act), and reading a good novel (no technical books!!!).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;meditation&quot;&gt;Meditation&lt;&#x2F;h3&gt;
&lt;p&gt;For me, this consists of either mindfulness walking or of the &amp;quot;classic&amp;quot; meditation of emptying my mind.  I&#x27;m not sure why this is so helpful to me, but it always seems to allow me to regain focus and just be able to think clearly again.  Your mileage may vary.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;exercise&quot;&gt;Exercise&lt;&#x2F;h3&gt;
&lt;p&gt;Okay, so this is something that I&#x27;m pretty terrible at being consistent.  That being said, having some sort of exercise (even if it&#x27;s just going for a 30 minute walk) can be incredible helpful in recharging your mental energy.  I&#x27;ve found, personally, that I need to have a good balance between the physical and mental aspects of my life and if I don&#x27;t have at least a walk every other day, I end up being more mentally exhausted than I &amp;quot;should be&amp;quot;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>List of Wonderous Links</title>
        <published>2016-03-10T00:00:00+00:00</published>
        <updated>2016-03-10T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/list-of-wonderous-links/" type="text/html"/>
        <id>https://bryan-lott.github.io/list-of-wonderous-links/</id>
        
        <content type="html">&lt;p&gt;This is going to be nothing more than a link post of articles and blogs that have resonated with me in a powerful way.  All of these relate to job &amp;quot;stuff&amp;quot;, not tech stuff.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http:&#x2F;&#x2F;wrongsideofmemphis.com&#x2F;2013&#x2F;07&#x2F;04&#x2F;minor-offenses&#x2F;&quot;&gt;Minor Offenses&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;http:&#x2F;&#x2F;steveblank.com&#x2F;2009&#x2F;12&#x2F;21&#x2F;the-elves-leave-middle-earth-%E2%80%93-soda%E2%80%99s-are-no-longer-free&#x2F;&quot;&gt;The Elves Leave Middle Earth&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20160126190715&#x2F;https:&#x2F;&#x2F;michaelochurch.wordpress.com&#x2F;2012&#x2F;07&#x2F;27&#x2F;six-languages-to-master&#x2F;&quot;&gt;Six Languages to Master (archive copy)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;http:&#x2F;&#x2F;jacobian.org&#x2F;writing&#x2F;what-to-write&#x2F;&quot;&gt;What to Write&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;http:&#x2F;&#x2F;jeffknupp.com&#x2F;blog&#x2F;2014&#x2F;05&#x2F;30&#x2F;you-need-to-start-a-whizbang-project-immediately&#x2F;&quot;&gt;You Need to Start a Whizbang Project Immediately&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;http:&#x2F;&#x2F;thecodist.com&#x2F;article&#x2F;programming_without_a_net&quot;&gt;Programming Without a Net&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.nczonline.net&#x2F;blog&#x2F;2012&#x2F;06&#x2F;12&#x2F;the-care-and-feeding-of-software-engineers-or-why-engineers-are-grumpy&#x2F;&quot;&gt;Care and Feeding of Software Engineers&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;free-code-camp&#x2F;how-to-level-up-as-a-developer-87344584777c&quot;&gt;How to Level Up as a Developer&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;http:&#x2F;&#x2F;randsinrepose.com&#x2F;archives&#x2F;category&#x2F;management&#x2F;&quot;&gt;Rands in Repose - Management&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Wow...</title>
        <published>2016-01-03T00:00:00+00:00</published>
        <updated>2016-01-03T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/wow/" type="text/html"/>
        <id>https://bryan-lott.github.io/wow/</id>
        
        <content type="html">&lt;p&gt;What a vacation... note to self, as someone that always needs to be creating something for his own wellbeing, never take a vacation without a purpose or something to do, otherwise, you&#x27;ll go crazy!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Most Important Skills for a Software Developer</title>
        <published>2015-11-10T00:00:00+00:00</published>
        <updated>2015-11-10T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/the-most-important-skills-for-a-software-developer/" type="text/html"/>
        <id>https://bryan-lott.github.io/the-most-important-skills-for-a-software-developer/</id>
        
        <content type="html">&lt;p&gt;First off, this isn&#x27;t going to be a post about languages, technologies, etc. It would be borderline pointless to write one of those as they come and go so quickly, which brings me to my first important skill:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;adaptability&quot;&gt;Adaptability&lt;&#x2F;h3&gt;
&lt;p&gt;Or, if you don&#x27;t change, you die. Sure there are still some COBOL programmers around, and I&#x27;m sure they get paid a lot of money to keep what&#x27;s essentially a dead skill around, but I have a suspicion that field is shrinking.
We&#x27;ve been making a pretty heavy push at work to migrate everything up to the cloud lately. In a lot of cases it&#x27;s a pain in the ass to do so, but in the end, it&#x27;ll probably be worth it.
Now, imagine yourself as being &amp;quot;that guy&amp;quot; (I&#x27;m using the male pronoun on purpose here) that won&#x27;t adapt, won&#x27;t learn, won&#x27;t grow with whatever direction the business wants to go in. Imagine yourself out of a job!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;curiosity&quot;&gt;Curiosity&lt;&#x2F;h3&gt;
&lt;p&gt;Or, I wonder what this does?
This is the one place where a lot of more experienced developers lose their way (speaking from my own personal experience, of course). If you react to something new with &amp;quot;ugggh, it&#x27;s something new that I have to learn&amp;quot; instead of with wonder, it might be time to re-examine some things. In some ways, it&#x27;s your job to constantly be pushing the boundaries of what can be done in tech. A large part of that job is learning about what others have done and then implementing that to make things better.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;exploration&quot;&gt;Exploration&lt;&#x2F;h3&gt;
&lt;p&gt;Or, huh, that sounds interesting, let&#x27;s go exploring!
In essence, this is the flip side of curiosity. Instead of learning someone else&#x27;s tech, go build something new. A great reminder for this is to have a &#x27;whizbang&#x27; project folder on every computer you control. It&#x27;s a gentle nudge to always be thinking about the really hard problems. This concept came from Jeff Knupp&#x27;s awesome blog:
&lt;a href=&quot;http:&#x2F;&#x2F;jeffknupp.com&#x2F;blog&#x2F;2014&#x2F;05&#x2F;30&#x2F;you-need-to-start-a-whizbang-project-immediately&#x2F;&quot;&gt;Whizbang Project Post&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fearlessness&quot;&gt;Fearlessness&lt;&#x2F;h3&gt;
&lt;p&gt;Or, break stuff!
Get your hands dirty! Is it a technology you don&#x27;t understand, can&#x27;t wrap your brain around? Who cares! Go play with it, get it installed, get a hello world working, and then go nuts. It&#x27;s one of the best ways to internalize how a given technology can work (or not!) for you. As long as you&#x27;re not driving your local sysadmin nuts with breaking hardware, you should be good.
All of this boils down to having an entrepreneurial mindset as it relates to pushing tech forward into the future. If you&#x27;re not learning, pushing things forward, making stuff better, then the question you need to be asking is whether you&#x27;re stagnating. If you&#x27;re stagnating it makes it very easy to replace you unless you&#x27;ve built walls of code around your position that only you understand. And that, very quickly, turns you into a curmudgeon (or a BOFH).&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t be a curmudgeon, no one likes &#x27;em and I&#x27;ve never seen one that was actually happy.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reading</title>
        <published>2015-10-26T00:00:00+00:00</published>
        <updated>2015-10-26T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/reading/" type="text/html"/>
        <id>https://bryan-lott.github.io/reading/</id>
        
        <content type="html">&lt;p&gt;So, reading. It&#x27;s something I grew up loving. I used to spend every waking moment with my head stuck in a book. Everything from software development to high fantasy to memoirs. This began when I was very young, my parents used to read to me every night before bed and my dad promised me that whenever we went to a bookstore, he&#x27;d buy me whatever I wanted to read as long as I kept reading. Of course, at that time, it seemed like he&#x27;d just given me the keys to the candy store and he pretty much did.&lt;&#x2F;p&gt;
&lt;p&gt;From then on, I was a &amp;quot;reader&amp;quot;. It always amazed me when I talked to someone that didn&#x27;t read. I always thought in my head that they must have a very boring life and I was always very close to labeling them &amp;quot;stupid&amp;quot;.&lt;&#x2F;p&gt;
&lt;p&gt;All that changed a few years ago and, to be honest, I&#x27;m still not sure what really happened. I feel like it started around the same time I got a smartphone. Now I could read short blogs, tweets, page-long articles, wherever I wanted for free. Fast forward a couple of years and I still buy paper books but I don&#x27;t read them as often. I&#x27;ve gone from reading books several hours every day to reading maybe once a week for an hour if I&#x27;m lucky.&lt;&#x2F;p&gt;
&lt;p&gt;I hate it.&lt;&#x2F;p&gt;
&lt;p&gt;I hate the fact that I&#x27;d rather look at a screen than feel the pages of a book in my hand, smell the paper and ink, visit old friends between those pages.&lt;&#x2F;p&gt;
&lt;p&gt;I hate that I&#x27;ve gone from being a &amp;quot;reader&amp;quot; to being a &amp;quot;dumb&amp;quot; smartphone user. To becoming one of the people that I couldn&#x27;t understand when I was younger.&lt;&#x2F;p&gt;
&lt;p&gt;I hate it and I&#x27;m going to change it.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m not sure what that looks like. I&#x27;ve been seriously considering a kindle paperwhite lately. Mostly because it feels like a bridge back to reading what I used to love, books. On my phone I primarily read blogs, hacker news, facebook, twitter, very short form things and I&#x27;ve found over the past year or so that I&#x27;m almost unable to keep my attention focused on anything longer. At least with a kindle I can switch between stories as I&#x27;m reading and &amp;quot;stretch&amp;quot; my attention span back out.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s difficult to extend my own personal experience to the general population at large, but I do feel that children and adults both have shorter attention spans. Both due to the massive amount of information we&#x27;re expected to consume and retain on a daily basis and to the massive amount of information we CAN consume at a moment&#x27;s notice.&lt;&#x2F;p&gt;
&lt;p&gt;Will my experiment to change myself work? I guess we&#x27;ll see in a few months.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Vacation is Hard</title>
        <published>2015-08-18T00:00:00+00:00</published>
        <updated>2015-08-18T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/vacation-is-hard/" type="text/html"/>
        <id>https://bryan-lott.github.io/vacation-is-hard/</id>
        
        <content type="html">&lt;p&gt;...not necessarily because going on vacation is hard, but coming back from it? Oof.&lt;&#x2F;p&gt;
&lt;p&gt;I just spent 10 days camping without cell phone service at a spiritual retreat. Had a great time, hung out with friends that I only see once a year, and had some seriously knock-your-socks-off spiritual moments.&lt;&#x2F;p&gt;
&lt;p&gt;Then, the return to day-to-day &amp;quot;normalcy&amp;quot;. Usually it takes me a few hours, maybe a day at most to get back into the swing of things. For whatever reason this time? It&#x27;s already a week and I&#x27;m still not back. And, when I say &amp;quot;I&#x27;m not back&amp;quot; what I mean is that my brain isn&#x27;t working in normal mode yet. Here, let me give you an example.&lt;&#x2F;p&gt;
&lt;p&gt;When camping for 10 days with 200+ of your closest friends it&#x27;s &amp;quot;normal&amp;quot; to have a 10&#x27;x10&#x27; popup structure for your kitchen, a 10&#x27;x20&#x27; carport for your living room, and have an 8 person tent for 2 people. This, of course, presents challenges. Things such as &amp;quot;how do I keep water from dripping down between the kitchen and the living room&amp;quot;.&lt;&#x2F;p&gt;
&lt;p&gt;The context switch between solving such physical, tangible, see-results-immediately problems and solving &amp;quot;how do I connect to this database through a ssh tunnel again?&amp;quot; is so massive I don&#x27;t have words to describe it and I haven&#x27;t been this tired in a long time. I&#x27;ve tried &amp;quot;easing&amp;quot; back into it and that failed pretty miserably when I couldn&#x27;t remember half my passwords which immediately threw me into option 2 &amp;quot;jumping into the deep end&amp;quot; which also failed miserably.&lt;&#x2F;p&gt;
&lt;p&gt;What I can&#x27;t get out of my head is what an amazing time I had camping and how much I wish I was right back up there. It&#x27;s a calling on a deeply personal, spiritual level. Maybe the only answer is to try to rebuild that same experience here back in the &amp;quot;real world&amp;quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Wish me luck...&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Concurrency</title>
        <published>2015-07-08T00:00:00+00:00</published>
        <updated>2015-07-08T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/concurrency/" type="text/html"/>
        <id>https://bryan-lott.github.io/concurrency/</id>
        
        <summary type="html">&lt;p&gt;Or... why Python will eventually become irrelevant.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Imposter Syndrome</title>
        <published>2015-05-26T00:00:00+00:00</published>
        <updated>2015-05-26T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/imposter-syndrome/" type="text/html"/>
        <id>https://bryan-lott.github.io/imposter-syndrome/</id>
        
        <content type="html">&lt;p&gt;&lt;a href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Impostor_syndrome&quot;&gt;Wikipedia&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Essentially, it&#x27;s the opposite of the Dunning-Kruger effect. You feel that your skills are less than those of your peers and that you&#x27;re just skating by on luck. One day, someone is going to discover you don&#x27;t really know what&#x27;s going on and bam, your career is over.
Is this an irrational fear for most of us that have it? Of course. Does that change the fact that we still feel incompetent when rating ourselves against our peers? Nope!&lt;&#x2F;p&gt;
&lt;p&gt;So, how do you get over it?&lt;&#x2F;p&gt;
&lt;p&gt;That, my friends, is the real question. Some days I&#x27;m able to overcome it just by looking at the work I&#x27;ve done. Other days, I need to look at my &amp;quot;feathers&amp;quot; file. If you don&#x27;t have one of these, you should start. Essentially, take any positive feedback you get from anyone you work with and put it in a folder (file, email, evernote, dropbox, or an actual physical folder). It&#x27;s the &amp;quot;I&#x27;m having a shitty day and need to be reminded that I&#x27;m a good person&amp;quot; folder. Whenever you&#x27;re having an &amp;quot;off&amp;quot; day, take 10 minutes and look through it randomly. This folder also helps when it comes time for your self-review or if you&#x27;re looking for a raise.&lt;&#x2F;p&gt;
&lt;p&gt;Other days, not even that will help. On those days, you just soldier on, try not to push any code that&#x27;ll break production or the build, do any yak-shaving that needs to be done. Basically, you want to try to prevent reinforcement of the imposter syndrome.&lt;&#x2F;p&gt;
&lt;p&gt;The final way that I deal with it is work on a side project. Usually it&#x27;s work related, something that&#x27;s very niche, something that just makes me happy. Obviously, this isn&#x27;t always an option so sometimes I just push through the day and when I get home I work on something like that. Woodworking, chainmaille, whatever it is, it&#x27;s usually something not computer related.&lt;&#x2F;p&gt;
&lt;p&gt;To paraphrase Tim Ewald in &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;ShEez0JkOFw&quot;&gt;Programming With Hand Tools&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The more I spend time with computers, the more I need to spend time with things that aren&#x27;t computers!&lt;&#x2F;p&gt;
&lt;p&gt;And that, for me, helps me to realize that computers aren&#x27;t the sum total of my existence. &lt;em&gt;My code is not me&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>BOFH</title>
        <published>2015-05-20T00:00:00+00:00</published>
        <updated>2015-05-20T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/bofh/" type="text/html"/>
        <id>https://bryan-lott.github.io/bofh/</id>
        
        <content type="html">&lt;p&gt;(bastard operator from hell)
What a term. It used to only apply to curmudgeonly sysadmins and the neckbeard elite but I&#x27;ve noticed lately that it can be applied to a large number of other IT professionals. Specifically, I&#x27;m talking about developers.&lt;&#x2F;p&gt;
&lt;p&gt;I know you have to sit in your cube staring at page after page of incomprehensible piles of crap code written by someone else that clearly didn&#x27;t know what they were doing. I know that you have to spend hours with a debugger to find a misspelling in a string variable&#x27;s value. I know that it can take a day and a half to find the missing semicolon that&#x27;s been causing compiler errors. I know that it makes you want to defenestrate your laptop, cubicle, mouse, keyboard, and anything else within arm&#x27;s reach.&lt;&#x2F;p&gt;
&lt;p&gt;How do I know this? I do it all day too and it drives me up the wall probably just as much if not more than it does you.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the thing my fellow developers. Users, sysadmins, managers, and other devs are NOT out to get you. They are not out to make your life a living hell, nor are they trying to get your job. In fact, most of them probably wouldn&#x27;t want your job if you offered it to them on a silver platter. Remember, you make things happen. That&#x27;s a huge power and a huge responsibility and most people don&#x27;t want either. But, I digress. Users, sysadmins, managers, and other devs are people, just like you. They have just as hard of a time understanding the meatbag sitting in a cubicle staring at &amp;quot;gibberish&amp;quot; (and occasionally writing some) as you do understanding the meatbag that seems to have a job consisting of nothing but meeting people. A smile, friendly hello, or 30 seconds taken to listen to a problem can go a long way toward building common understanding and a good working relationship.&lt;&#x2F;p&gt;
&lt;p&gt;So, here&#x27;s my personal guide to working well with others:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Be nice to people, you&#x27;d be amazed at how you can get along if you follow a potentially negatively misinterpretable comment with a smiley face :) (but the thing is, you actually have to mean the smiley face)&lt;&#x2F;li&gt;
&lt;li&gt;You are not your code. Sure, you wrote it, does it define you as a person? I sure hope not because I know I&#x27;ve written some really crappy code and I don&#x27;t want it defining me! If someone wants to throw it out in favor of something better, let me grab the trashcan and hold it for &#x27;em.&lt;&#x2F;li&gt;
&lt;li&gt;Condescension kills. Do not, under any circumstances, no matter what the situation (even if they&#x27;re a drooling idiot) act in a condescending manner to anyone. Basically you wouldn&#x27;t want someone else treating you like you&#x27;re an idiot for not knowing that rm -rf &#x2F; will blow up your linux box. Remember, at some point, you. did. not. know. what. you. know. now!&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re not in person, over communicate. Most communication mediums have a way of ignoring someone if they&#x27;re too communicative. But, as a dev, chances are you&#x27;re on the under-communication end of the spectrum.&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re absolutely right, there&#x27;s a good chance you missed something. Basically, you&#x27;re never right all the time, and if you are, your career is over because you&#x27;ve stopped learning. Never stop learning and never stop being wrong. (this also helps when debugging... &amp;quot;print&amp;quot; rarely breaks, but the code you just introduced breaks more often than you think ;) )&lt;&#x2F;li&gt;
&lt;li&gt;Listen to people. And when I say listen I don&#x27;t mean &amp;quot;wait for your turn to speak.&amp;quot; I mean really listen, understand what they&#x27;re saying and try to figure out their motivation for saying it.&lt;&#x2F;li&gt;
&lt;li&gt;Ask questions more than make statements. It&#x27;s much easier to hear &amp;quot;Was there a reason you left a debug print statement in?&amp;quot; than &amp;quot;Don&#x27;t leave debug print statements in!&amp;quot; It&#x27;s giving them the benefit of the doubt, but make sure you don&#x27;t sound condescending when you ask.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In closing, don&#x27;t be a BOFH. Nobody likes them and while being the outcast was cool in high school, it doesn&#x27;t work as a career.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>On Python, Clojure, and PHP</title>
        <published>2015-05-15T00:00:00+00:00</published>
        <updated>2015-05-15T00:00:00+00:00</updated>
        <author>
          <name>Unknown</name>
        </author>
        <link rel="alternate" href="https://bryan-lott.github.io/on-python-clojure-and-php/" type="text/html"/>
        <id>https://bryan-lott.github.io/on-python-clojure-and-php/</id>
        
        <summary type="html">&lt;p&gt;So, I sort of fell into programming.
When I was a kid, I learned QBasic because it was the only way I knew how to put games on my computer. At that point, my father wouldn&#x27;t buy or install games on the 286 we had, so I had to do it myself.&lt;&#x2F;p&gt;
</summary>
        
    </entry>
</feed>
