<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/styles/rss-style.xsl"?>

<rss version="2.0"
 xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
>

<channel>
<title>troglodyne.net</title>
<link>http://troglodyne.net//video?format=xml</link>
<description>troglodyne.net : /video</description>
<language>en</language>
<pubDate>2026-04-26T02:34:56</pubDate>
<lastBuildDate>2026-04-26T02:34:56</lastBuildDate>

<image>
<title>troglodyne.net</title>
<url>/favicon.ico</url>
<link>http://troglodyne.net</link>
<width>32</width>
<height>32</height>
<description>troglodyne.net favicon</description>
</image>
<item>
<title>Audit::Log released to CPAN</title>
<link>http://troglodyne.net/posts/a49ed777-7801-11ec-a570-927ac1c30435</link>
<description><![CDATA[For those of you interested in parsing audit logs with perl.<br /><br />

Looks like I need to make some more business expenses if I want to be able to stream 4k video!]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/a49ed777-7801-11ec-a570-927ac1c30435</guid>
<pubDate>2022-01-18T01:54:59</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/a49ed777-7801-11ec-a570-927ac1c30435" />
</item>
<item>
<title>What&#x27;s new in playwright-perl v0.015</title>
<link>http://troglodyne.net/posts/4c4c98d9-15b9-11ec-8897-fefed906c303</link>
<description><![CDATA[Quick update on what's changed since I last talked about playwright.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/4c4c98d9-15b9-11ec-8897-fefed906c303</guid>
<pubDate>2021-09-15T00:10:13</pubDate>
<enclosure url="http://troglodyne.net/posts/4c4c98d9-15b9-11ec-8897-fefed906c303" type="text/html" />
</item>
<item>
<title>tCMS September 2021 update</title>
<link>http://troglodyne.net/posts/5fe97a44-15b0-11ec-a231-c6f0b46b1cc4</link>
<description><![CDATA[I finally got time to do some work on tCMS!  Here's the new goodies all the users of tCMS can expect going forward.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/5fe97a44-15b0-11ec-a231-c6f0b46b1cc4</guid>
<pubDate>2021-09-14T23:06:20</pubDate>
<enclosure url="http://troglodyne.net/posts/5fe97a44-15b0-11ec-a231-c6f0b46b1cc4" type="text/html" />
</item>
<item>
<title>tCMS September 2021 update</title>
<link>http://troglodyne.net/posts/3adb7732-15b0-11ec-a6a5-bc254e87831b</link>
<description><![CDATA[I finally got time to do some work on tCMS!  Here's the new goodies all the users of tCMS can expect going forward.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/3adb7732-15b0-11ec-a6a5-bc254e87831b</guid>
<pubDate>2021-09-14T23:05:18</pubDate>
<enclosure url="http://troglodyne.net/posts/3adb7732-15b0-11ec-a6a5-bc254e87831b" type="text/html" />
</item>
<item>
<title>Never say Never</title>
<link>http://troglodyne.net/posts/7023e47a-13de-11ec-84d9-cf3132534f5d</link>
<description><![CDATA[Last time, bro thought he was done talking about organized irresponsibility. Instead, we had a "scrum" at lunch and iterated quickly upon yet more to talk about regarding this.]]></description>
<author>andy</author>
<guid isPermaLink="true">http://troglodyne.net/posts/7023e47a-13de-11ec-84d9-cf3132534f5d</guid>
<pubDate>2021-08-11T15:17:57</pubDate>
<enclosure url="http://troglodyne.net/posts/7023e47a-13de-11ec-84d9-cf3132534f5d" type="text/html" />
</item>
<item>
<title>Never say Never</title>
<link>http://troglodyne.net/posts/1628695077</link>
<description><![CDATA[Last time, bro thought he was done talking about organized irresponsibility. Instead, we had a "scrum" at lunch and iterated quickly upon yet more to talk about regarding this.]]></description>
<author>andy</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1628695077</guid>
<pubDate>2021-08-11T15:17:57</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1628695077" />
</item>
<item>
<title>Organized Irresponsibility: why corporate does what it does</title>
<link>http://troglodyne.net/posts/6ea4de60-13de-11ec-84d9-e8e7bcea86e6</link>
<description><![CDATA[Discussion of the "organized irresponsibility" in corporations, and how it kills the ability to take risks.  How this destroys the ability to find meaning in corporate work.]]></description>
<author>andy</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6ea4de60-13de-11ec-84d9-e8e7bcea86e6</guid>
<pubDate>2021-08-09T15:11:36</pubDate>
<enclosure url="http://troglodyne.net/posts/6ea4de60-13de-11ec-84d9-e8e7bcea86e6" type="text/html" />
</item>
<item>
<title>Organized Irresponsibility: why corporate does what it does</title>
<link>http://troglodyne.net/posts/1628521896</link>
<description><![CDATA[Discussion of the "organized irresponsibility" in corporations, and how it kills the ability to take risks.  How this destroys the ability to find meaning in corporate work.]]></description>
<author>andy</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1628521896</guid>
<pubDate>2021-08-09T15:11:36</pubDate>
<enclosure url="http://troglodyne.net/posts/1628521896" type="text/html" />
</item>
<item>
<title>The Big Shift</title>
<link>http://troglodyne.net/posts/6e045380-13de-11ec-84d9-f61330031091</link>
<description><![CDATA[People are wondering if the "Great Resignation" is real. I'm here to tell you that it is, and the consequences are farther reaching than you might suspect. #TheBigShift
<br /><br />
I've already seen a number of job-hops by the most talented engineers at firms I'm in touch with here in flyover country, as they realize they can be paid better even at remote rates by joining a coastal firm.
<br /><br />
This is a mirror of what is happening with people moving all over the country from the coasts to flyover country. The reasons for doing so are actually the same, however.
<br /><br />
The nature of progressive taxation means that the most productive pay the most in, and as such the departure of this small minority of people has an outsized impact on tax base. The movement of these people from income tax states such as CA and NY to non income tax states such as TX and FL is having an outsized impact as such.
<br /><br />
Similarly, the people leaving to get better remote work opportunities are those best capable of doing so; the most productive. Repeated study has shown that a minority of very productive employees do the vast majority of important work in the firm, so even a small number of high profile defections are going to have huge impact.
<br /><br />
The question of course is "Why now?" Here, the reason for both is the same. Lockdown destroyed the inertia which was preventing movement -- the benefits of community which previously kept one from moving residence or firm were forcibly extinguished. This made all locales and firms roughly equal when it came to amenities, so you may as well just move to the highest paying and lowest taxing situation possible, as you can't exactly maximize for lifestyle anymore.
<br /><br />
Now that people have actually pulled the trigger on movement they are realizing that those things keeping them where they were weren't that great in the first place, and actually little more than rationalizations for inertia. As such we can probably expect a de-emphasis on fringe benefits in the firm going forward.
<br /><br />
As to the policy implications of this mass migration, it's sending an unmistakable message. Taxes are too high relative to what the citizenry of the coast get out of it, and have been for a long time. Unlike the firms, I don't expect they will adapt quickly enough to avert crisis.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6e045380-13de-11ec-84d9-f61330031091</guid>
<pubDate>2021-06-16T17:51:05</pubDate>
<enclosure url="http://troglodyne.net/posts/6e045380-13de-11ec-84d9-f61330031091" type="text/html" />
</item>
<item>
<title>Review BRO TIPS from the Troglodyne Bros!</title>
<link>http://troglodyne.net/posts/710f1722-13de-11ec-84d9-8f1cb6747597</link>
<description><![CDATA[As always, dealing with the human equation is the more challenging technical problem.

Sorry for the lack of video on Monday 😅]]></description>
<author>andy</author>
<guid isPermaLink="true">http://troglodyne.net/posts/710f1722-13de-11ec-84d9-8f1cb6747597</guid>
<pubDate>2021-05-18T23:44:38</pubDate>
<enclosure url="http://troglodyne.net/posts/710f1722-13de-11ec-84d9-8f1cb6747597" type="text/html" />
</item>
<item>
<title>Review BRO TIPS from the Troglodyne Bros!</title>
<link>http://troglodyne.net/posts/1621381478</link>
<description><![CDATA[As always, dealing with the human equation is the more challenging technical problem.

Sorry for the lack of video on Monday 😅]]></description>
<author>andy</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1621381478</guid>
<pubDate>2021-05-18T23:44:38</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1621381478" />
</item>
<item>
<title>LSM Trees, Hypertables and other data structures</title>
<link>http://troglodyne.net/posts/6dd263ac-13de-11ec-84d9-bb7089899f59</link>
<description><![CDATA[Use the right tool for the job!  Most of your program's performance is down to what data structure you use, so you need to be familiar with the data program you choose.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6dd263ac-13de-11ec-84d9-bb7089899f59</guid>
<pubDate>2021-05-12T15:36:19</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/6dd263ac-13de-11ec-84d9-bb7089899f59" />
</item>
<item>
<title>LSM Trees, Hypertables and other data structures</title>
<link>http://troglodyne.net/posts/1620833779</link>
<description><![CDATA[Use the right tool for the job!  Most of your program's performance is down to what data structure you use, so you need to be familiar with the data program you choose.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1620833779</guid>
<pubDate>2021-05-12T15:36:19</pubDate>
<enclosure url="http://troglodyne.net/posts/1620833779" type="text/html" />
</item>
<item>
<title>The fall of college and rise of the Atelier</title>
<link>http://troglodyne.net/posts/713bdeb0-13de-11ec-84d9-c6f57367b391</link>
<description><![CDATA[Colleges are generally experiencing a collapse everywhere they don't embrace this model.  Direct feedback from the customer is key in any field of endeavor, and many colleges got fooled by cheap money into abandoning that.  They are now being replaced by institutions that are built around the customer.
<br /><br />
Article Mentioned <a href="https://www.jamesgmartin.center/2019/05/politicized-art-schools-are-losing-students-to-the-atelier-movement/">here</a>.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/713bdeb0-13de-11ec-84d9-c6f57367b391</guid>
<pubDate>2021-05-07T19:33:22</pubDate>
<enclosure url="http://troglodyne.net/posts/713bdeb0-13de-11ec-84d9-c6f57367b391" type="text/html" />
</item>
<item>
<title>The fall of college and rise of the Atelier</title>
<link>http://troglodyne.net/posts/1620416002</link>
<description><![CDATA[Colleges are generally experiencing a collapse everywhere they don't embrace this model.  Direct feedback from the customer is key in any field of endeavor, and many colleges got fooled by cheap money into abandoning that.  They are now being replaced by institutions that are built around the customer.
<br /><br />
Article Mentioned <a href="https://www.jamesgmartin.center/2019/05/politicized-art-schools-are-losing-students-to-the-atelier-movement/">here</a>.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1620416002</guid>
<pubDate>2021-05-07T19:33:22</pubDate>
<enclosure url="http://troglodyne.net/posts/1620416002" type="text/html" />
</item>
<item>
<title>Cultural Fit: What&#x27;s it really about?</title>
<link>http://troglodyne.net/posts/6e6fa113-13de-11ec-84d9-8ba18cd68c34</link>
<description><![CDATA[The culture described to new and prospective hires is almost always aspirational rather than actual, leading to conflict when expectations confront reality.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6e6fa113-13de-11ec-84d9-8ba18cd68c34</guid>
<pubDate>2021-05-06T14:07:11</pubDate>
<enclosure url="http://troglodyne.net/posts/6e6fa113-13de-11ec-84d9-8ba18cd68c34" type="text/html" />
</item>
<item>
<title>Cultural Fit: What&#x27;s it really about?</title>
<link>http://troglodyne.net/posts/1620310031</link>
<description><![CDATA[The culture described to new and prospective hires is almost always aspirational rather than actual, leading to conflict when expectations confront reality.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1620310031</guid>
<pubDate>2021-05-06T14:07:11</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1620310031" />
</item>
<item>
<title>Team leads: good and bad</title>
<link>http://troglodyne.net/posts/71237b2d-13de-11ec-84d9-ca26dd110b42</link>
<description><![CDATA[Things observed over the years when leading teams, or being lead in a team.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/71237b2d-13de-11ec-84d9-ca26dd110b42</guid>
<pubDate>2021-05-05T20:19:38</pubDate>
<enclosure url="http://troglodyne.net/posts/71237b2d-13de-11ec-84d9-ca26dd110b42" type="text/html" />
</item>
<item>
<title>Team leads: good and bad</title>
<link>http://troglodyne.net/posts/1620245978</link>
<description><![CDATA[Things observed over the years when leading teams, or being lead in a team.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1620245978</guid>
<pubDate>2021-05-05T20:19:38</pubDate>
<enclosure url="http://troglodyne.net/posts/1620245978" type="text/html" />
</item>
<item>
<title>Group vs. Individual incentives</title>
<link>http://troglodyne.net/posts/6fba981c-13de-11ec-84d9-e119ea7c8653</link>
<description><![CDATA[Observations on bonus structure]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6fba981c-13de-11ec-84d9-e119ea7c8653</guid>
<pubDate>2021-05-04T13:33:11</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/6fba981c-13de-11ec-84d9-e119ea7c8653" />
</item>
<item>
<title>Group vs. Individual incentives</title>
<link>http://troglodyne.net/posts/1620135191</link>
<description><![CDATA[Observations on bonus structure]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1620135191</guid>
<pubDate>2021-05-04T13:33:11</pubDate>
<enclosure url="http://troglodyne.net/posts/1620135191" type="text/html" />
</item>
<item>
<title>Design Patterns at every level of abstraction</title>
<link>http://troglodyne.net/posts/704db354-13de-11ec-84d9-f53431582b9f</link>
<description><![CDATA[Turns out good design patterns even transcend the computer itself, and work at any layer of abstraction.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/704db354-13de-11ec-84d9-f53431582b9f</guid>
<pubDate>2021-05-03T19:29:14</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/704db354-13de-11ec-84d9-f53431582b9f" />
</item>
<item>
<title>Design Patterns at every level of abstraction</title>
<link>http://troglodyne.net/posts/1620070154</link>
<description><![CDATA[Turns out good design patterns even transcend the computer itself, and work at any layer of abstraction.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1620070154</guid>
<pubDate>2021-05-03T19:29:14</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1620070154" />
</item>
<item>
<title>Getting &#x26; Staying productive</title>
<link>http://troglodyne.net/posts/70da5f16-13de-11ec-84d9-cb4bb82b7529</link>
<description><![CDATA[One of the things that comes up repeatedly in your career is whether
    your edge is sharpening or dulling.&nbsp; It is very easy to get
    into a pattern when you are at work and not have to change your
    approach, especially if you are performing at or near the top of the
    pack.&nbsp; You can always find a way to improve performance though,
    and a lot of times it's "I should (and do) know better, but haven't
    applied the knowledge yet".<br>
    <br>
    Ultimately the problem is called <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Metaheuristic">Metaheuristics</a>.
    Viewed in aggregate, the learning behaviors of programmers is a sort
    of <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Memetic_algorithm">Memetic
      Algorithm</a>.&nbsp; This must also be balanced against the
    constraints of the current economy.&nbsp; Namely that for many
    problems, throwing hardware at the problem is cheaper than throwing
    money at programmers to fix the problem with existing hardware. This
    means that you have to converge on "good enough" and "worse is
    better", and tools/methods that don't fight this.&nbsp; This can be
    hard to do emotionally for engineers, as we all want to build great
    works.<br>
    <br>
    What seems to work best for me these days is <a
      moz-do-not-send="true"
      href="https://troglodyne.net/posts/1618336942">writing essays</a>
    about systems I'm considering designing, and revising it as I go to
    make sure the narrative remains consistent.&nbsp; I feel this
    actually captures the idea of "user story" a lot better than the
    trite one-liners which are actually user acceptance criteria.&nbsp;
    Storytelling is how our brains actually work, and initially the
    story is hopes and predictions (much like the program going with it)
    eventually annealed down to reflect reality.&nbsp; It doesn't hurt
    that this builds documentation and test cases as part of the
    process.<br>
    <h3>Crush everything getting in the way of work</h3>
    The first thing I had to master as a programmer was how to build an
    environment which prevents or mitigates the costs of interruptions
    to <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Flow_(psychology)">flow state</a>.
    Much of this involved learning interfaces and editors such that I
    could largely do my job without expensive context switches, like
    having to touch a mouse.&nbsp; The two best means I've found to do
    this are Tmux + Vim + guake-ish terminal emulators and VSCode +
    virtual desktops with most the IDE features like suggestions turned
    off.<br>
    <br>
    There are 4 primary features here:<br>
    <ul>
      <li>100% keyboard controlled navigation and context switches</li>
      <li>Good syntax hinting</li>
      <li>Remembering state between sessions</li>
      <li>Full-screened everything, focus on only one thing at a time</li>
    </ul>
    <p>I have to have a solution for every major OS, as this is a
      necessity for testing software properly.<br>
    </p>
    <p>On Linux I can pretty much have everything I need on one to N+1
      virtual desktops, where N is the number of browsers I need to
      support, plus one window for doing documentation lookups (usually
      on a second monitor).&nbsp; I do most of my development on linux
      for precisely these reasons.<br>
    </p>
    <p>This mostly works the same on OSX, however they break immersion
      badly for people like me by having:<br>
    </p>
    <ul>
      <li>different and non-configurable keyboard shortcuts</li>
      <li>window decorations in nonstandard locations</li>
      <li>virtual desktops no longer have consistent ordering between
        sessions after 10.6.</li>
    </ul>
    <p>They seemed to have optimized for the user which Alt+Tabs between
      700 open windows in one workspace, which is a good way to break
      flow with too much clutter.<br>
    </p>
    <p>On windows VSCode has a good shortcut to summon the console, and
      a vim plugin that works great.&nbsp; Windows virtual desktops also
      work correctly, and I can configure shortcuts on linux to match
      both it and the console summon.&nbsp; I would prefer it be the
      other way around, but commercial OS interface programmers tend to
      either be on a power trip or too afraid of edge cases to allow
      user choice.&nbsp; If I could have a tmux-like shortcut to page
      between vscode workspaces like I do panes I'd be a happier camper,
      as I wouldn't need as many virtual desktops.&nbsp; This is
      apparently their most <a moz-do-not-send="true"
        href="https://github.com/Microsoft/vscode/issues/10121">popular
        feature request</a> right now, go figure.<br>
    </p>
    <h3>_ is other people<br>
    </h3>
    <p>Beyond the little hacks you do to increase flow, mitigating the
      impact of interruptions is important.&nbsp; This is a bit more
      difficult as much of this is social hacking, and understanding
      human nature.&nbsp; The spread of computing into the general
      population has also complicated this as the communication style of
      the old order of programmers and engineers is radically different
      from the communication norms of greater society.&nbsp; I, along
      with much of the rest of my peers, are still having a difficult
      time adjusting to this.<br>
    </p>
    <p>The preferred means of <a moz-do-not-send="true"
        href="http://www.catb.org/~esr/faqs/smart-questions.html">communication
        for engineers</a> is information-primary rather than
      emotion-primary.&nbsp; The goal of communication is to convey
      information more than feeling (if that is communicated at
      all).&nbsp; The majority of society does not communicate in this
      fashion.&nbsp; Instead they communicate Feelings above all else
      and Information is of secondary (if any) importance.&nbsp; For
      these people, their resorting to communication of <i>information</i>
      is a sign of <i>extreme frustration </i>that you have not yet
      discerned their emotional message and provided the validation they
      are seeking.&nbsp; If they haven't already <a
        moz-do-not-send="true"
        href="http://www.catb.org/~esr/faqs/smart-questions.html#not_losing">lashed
        out</a>, they are likely on the way to doing so.<br>
    </p>
    <p>It is unfortunate to deal with people operating via a juvenile
      and emotional communication style, but this is the norm in society
      and over the last 20 years has entirely displaced the existing
      engineering culture at every firm I've worked at.&nbsp; Code
      reviews can no longer be <a moz-do-not-send="true"
        href="http://www.mit.edu/~jcb/tact.html">blunt</a>, as it is
      unlikely you are dealing with someone who is not seeking
      validation as part of their communication packets.&nbsp; The punky
      elements of culture which used to build friendship now build
      enmity (as you are dealing with the very "squares" nerd culture
      embraced being hated by).&nbsp; Nevertheless, you still have to
      walk in both worlds as there are still islands of other hackers
      just like you.&nbsp; Taking on and off these masks is risky,
      however, as people are quite hung up on the notion that people
      must be 100% congruent with how they are perceived outwardly.<br>
    </p>
    <p>Everyone out there building an online reputation learns quickly
      that courting controversy will get you far more engagement than if
      you had made a program which cured eczema and allowed sustained
      nuclear fusion. Emotional highs punctuated by warm fuzzies is
      generally the sort of rollercoaster ride people are looking
      for.&nbsp; Lacking better sources they will attempt to draw you
      into their emotional world.&nbsp; Their world is a skinner box,
      and if you enter it unawares they will <i>train you</i>.<br>
    </p>
    <p>They cannot help but be this way, so you must turn off the part
      of your brain that looks for informational meaning in mouth
      noises.&nbsp; Their utterances have little more significance than
      the cries of a baby or yapping of a dog.&nbsp; The only thing that
      matters is whether the behavior is something you wish to encourage
      or discourage.<br>
    </p>
    <p>Operant conditioning is how you must regard your
      interactions.&nbsp; When you validate them (usually with
      attention), you encourage that behavior.&nbsp; Non-acknowledgement
      of irritating behavior is often the most effective
      discouragement.&nbsp; The natural urge to engage with any point of
      fact must be resisted, and instead reserve your communications to
      that which advances your purposes.&nbsp; When a minimum of
      validation is <i>demanded</i>, dismissal via fogging, playing
      dumb or broken-record technique should be engaged in, rather than
      the hard no which is deserved.&nbsp; A satisfying response to a
      demand can never be offered unless you wish to be dominated by
      those around you.&nbsp; Many see this as Machiavellian
      manipulation, but there is no choice.&nbsp; You play this game, or
      get played.<br>
    </p>
    <p>Nevertheless, this all has a huge effect on the corporate
      environment.&nbsp; Most firms devote far more energy to playing
      house than pleasing customers and making money, and tech is no
      exception.&nbsp; Fellow employees are far more likely to seek
      validation on this schedule with <i>each other</i> than
      customers.&nbsp; Most satisfy themselves with a stable IV drip of
      validation from their local group rather than experiencing the
      much more rewarding experience of solving customer problems.&nbsp;
      This should come as no shock, given social media is purpose built
      to inculcate this mental model, as it was found to maximize
      engagement.&nbsp; This is also good at building solidarity at a
      firm but unfortunately comes at the expense of crowding-out
      emotional investment in the customer who cannot and should not
      have so tight an OODA loop with their vendors.<br>
    </p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/70da5f16-13de-11ec-84d9-cb4bb82b7529</guid>
<pubDate>2021-04-30T15:18:11</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/70da5f16-13de-11ec-84d9-cb4bb82b7529" />
</item>
<item>
<title>Getting &#x26; Staying productive</title>
<link>http://troglodyne.net/posts/1619795891</link>
<description><![CDATA[One of the things that comes up repeatedly in your career is whether
    your edge is sharpening or dulling.&nbsp; It is very easy to get
    into a pattern when you are at work and not have to change your
    approach, especially if you are performing at or near the top of the
    pack.&nbsp; You can always find a way to improve performance though,
    and a lot of times it's "I should (and do) know better, but haven't
    applied the knowledge yet".<br>
    <br>
    Ultimately the problem is called <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Metaheuristic">Metaheuristics</a>.
    Viewed in aggregate, the learning behaviors of programmers is a sort
    of <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Memetic_algorithm">Memetic
      Algorithm</a>.&nbsp; This must also be balanced against the
    constraints of the current economy.&nbsp; Namely that for many
    problems, throwing hardware at the problem is cheaper than throwing
    money at programmers to fix the problem with existing hardware. This
    means that you have to converge on "good enough" and "worse is
    better", and tools/methods that don't fight this.&nbsp; This can be
    hard to do emotionally for engineers, as we all want to build great
    works.<br>
    <br>
    What seems to work best for me these days is <a
      moz-do-not-send="true"
      href="https://troglodyne.net/posts/1618336942">writing essays</a>
    about systems I'm considering designing, and revising it as I go to
    make sure the narrative remains consistent.&nbsp; I feel this
    actually captures the idea of "user story" a lot better than the
    trite one-liners which are actually user acceptance criteria.&nbsp;
    Storytelling is how our brains actually work, and initially the
    story is hopes and predictions (much like the program going with it)
    eventually annealed down to reflect reality.&nbsp; It doesn't hurt
    that this builds documentation and test cases as part of the
    process.<br>
    <h3>Crush everything getting in the way of work</h3>
    The first thing I had to master as a programmer was how to build an
    environment which prevents or mitigates the costs of interruptions
    to <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Flow_(psychology)">flow state</a>.
    Much of this involved learning interfaces and editors such that I
    could largely do my job without expensive context switches, like
    having to touch a mouse.&nbsp; The two best means I've found to do
    this are Tmux + Vim + guake-ish terminal emulators and VSCode +
    virtual desktops with most the IDE features like suggestions turned
    off.<br>
    <br>
    There are 4 primary features here:<br>
    <ul>
      <li>100% keyboard controlled navigation and context switches</li>
      <li>Good syntax hinting</li>
      <li>Remembering state between sessions</li>
      <li>Full-screened everything, focus on only one thing at a time</li>
    </ul>
    <p>I have to have a solution for every major OS, as this is a
      necessity for testing software properly.<br>
    </p>
    <p>On Linux I can pretty much have everything I need on one to N+1
      virtual desktops, where N is the number of browsers I need to
      support, plus one window for doing documentation lookups (usually
      on a second monitor).&nbsp; I do most of my development on linux
      for precisely these reasons.<br>
    </p>
    <p>This mostly works the same on OSX, however they break immersion
      badly for people like me by having:<br>
    </p>
    <ul>
      <li>different and non-configurable keyboard shortcuts</li>
      <li>window decorations in nonstandard locations</li>
      <li>virtual desktops no longer have consistent ordering between
        sessions after 10.6.</li>
    </ul>
    <p>They seemed to have optimized for the user which Alt+Tabs between
      700 open windows in one workspace, which is a good way to break
      flow with too much clutter.<br>
    </p>
    <p>On windows VSCode has a good shortcut to summon the console, and
      a vim plugin that works great.&nbsp; Windows virtual desktops also
      work correctly, and I can configure shortcuts on linux to match
      both it and the console summon.&nbsp; I would prefer it be the
      other way around, but commercial OS interface programmers tend to
      either be on a power trip or too afraid of edge cases to allow
      user choice.&nbsp; If I could have a tmux-like shortcut to page
      between vscode workspaces like I do panes I'd be a happier camper,
      as I wouldn't need as many virtual desktops.&nbsp; This is
      apparently their most <a moz-do-not-send="true"
        href="https://github.com/Microsoft/vscode/issues/10121">popular
        feature request</a> right now, go figure.<br>
    </p>
    <h3>_ is other people<br>
    </h3>
    <p>Beyond the little hacks you do to increase flow, mitigating the
      impact of interruptions is important.&nbsp; This is a bit more
      difficult as much of this is social hacking, and understanding
      human nature.&nbsp; The spread of computing into the general
      population has also complicated this as the communication style of
      the old order of programmers and engineers is radically different
      from the communication norms of greater society.&nbsp; I, along
      with much of the rest of my peers, are still having a difficult
      time adjusting to this.<br>
    </p>
    <p>The preferred means of <a moz-do-not-send="true"
        href="http://www.catb.org/~esr/faqs/smart-questions.html">communication
        for engineers</a> is information-primary rather than
      emotion-primary.&nbsp; The goal of communication is to convey
      information more than feeling (if that is communicated at
      all).&nbsp; The majority of society does not communicate in this
      fashion.&nbsp; Instead they communicate Feelings above all else
      and Information is of secondary (if any) importance.&nbsp; For
      these people, their resorting to communication of <i>information</i>
      is a sign of <i>extreme frustration </i>that you have not yet
      discerned their emotional message and provided the validation they
      are seeking.&nbsp; If they haven't already <a
        moz-do-not-send="true"
        href="http://www.catb.org/~esr/faqs/smart-questions.html#not_losing">lashed
        out</a>, they are likely on the way to doing so.<br>
    </p>
    <p>It is unfortunate to deal with people operating via a juvenile
      and emotional communication style, but this is the norm in society
      and over the last 20 years has entirely displaced the existing
      engineering culture at every firm I've worked at.&nbsp; Code
      reviews can no longer be <a moz-do-not-send="true"
        href="http://www.mit.edu/~jcb/tact.html">blunt</a>, as it is
      unlikely you are dealing with someone who is not seeking
      validation as part of their communication packets.&nbsp; The punky
      elements of culture which used to build friendship now build
      enmity (as you are dealing with the very "squares" nerd culture
      embraced being hated by).&nbsp; Nevertheless, you still have to
      walk in both worlds as there are still islands of other hackers
      just like you.&nbsp; Taking on and off these masks is risky,
      however, as people are quite hung up on the notion that people
      must be 100% congruent with how they are perceived outwardly.<br>
    </p>
    <p>Everyone out there building an online reputation learns quickly
      that courting controversy will get you far more engagement than if
      you had made a program which cured eczema and allowed sustained
      nuclear fusion. Emotional highs punctuated by warm fuzzies is
      generally the sort of rollercoaster ride people are looking
      for.&nbsp; Lacking better sources they will attempt to draw you
      into their emotional world.&nbsp; Their world is a skinner box,
      and if you enter it unawares they will <i>train you</i>.<br>
    </p>
    <p>They cannot help but be this way, so you must turn off the part
      of your brain that looks for informational meaning in mouth
      noises.&nbsp; Their utterances have little more significance than
      the cries of a baby or yapping of a dog.&nbsp; The only thing that
      matters is whether the behavior is something you wish to encourage
      or discourage.<br>
    </p>
    <p>Operant conditioning is how you must regard your
      interactions.&nbsp; When you validate them (usually with
      attention), you encourage that behavior.&nbsp; Non-acknowledgement
      of irritating behavior is often the most effective
      discouragement.&nbsp; The natural urge to engage with any point of
      fact must be resisted, and instead reserve your communications to
      that which advances your purposes.&nbsp; When a minimum of
      validation is <i>demanded</i>, dismissal via fogging, playing
      dumb or broken-record technique should be engaged in, rather than
      the hard no which is deserved.&nbsp; A satisfying response to a
      demand can never be offered unless you wish to be dominated by
      those around you.&nbsp; Many see this as Machiavellian
      manipulation, but there is no choice.&nbsp; You play this game, or
      get played.<br>
    </p>
    <p>Nevertheless, this all has a huge effect on the corporate
      environment.&nbsp; Most firms devote far more energy to playing
      house than pleasing customers and making money, and tech is no
      exception.&nbsp; Fellow employees are far more likely to seek
      validation on this schedule with <i>each other</i> than
      customers.&nbsp; Most satisfy themselves with a stable IV drip of
      validation from their local group rather than experiencing the
      much more rewarding experience of solving customer problems.&nbsp;
      This should come as no shock, given social media is purpose built
      to inculcate this mental model, as it was found to maximize
      engagement.&nbsp; This is also good at building solidarity at a
      firm but unfortunately comes at the expense of crowding-out
      emotional investment in the customer who cannot and should not
      have so tight an OODA loop with their vendors.<br>
    </p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1619795891</guid>
<pubDate>2021-04-30T15:18:11</pubDate>
<enclosure url="http://troglodyne.net/posts/1619795891" type="text/html" />
</item>
<item>
<title>Selling Internally, Externally and in Interviews</title>
<link>http://troglodyne.net/posts/6e8cde81-13de-11ec-84d9-c532c68b5aae</link>
<description><![CDATA[One of the common interview questions you get is the time preference
    question.&nbsp; I've asked it myself multiple times. It goes
    something like this:<br>
    <br>
    <ul>
      <li>Tell me about a time you had to make sacrifices in the short
        term to achieve a long term goal.</li>
    </ul>
    Engineering companies very much want to think of themselves as
    builders of great works made to stand the test of time. They
    frequently fall short of this as the customer generally wants "Mr.
    Right Now" instead of "Mr. Right". Wise organizations achieve <i>coherence
    </i>in their strategic vision by having "fulfill customer desires"
    itself as the long term goal. I've <a moz-do-not-send="true"
      href="https://troglodyne.net/video/1609105671">mentioned before</a>
    that a vision which does not align with the core business model is
    doomed to failure, and many companies fall into this trap.<br>
    <br>
    Many view the agglomeration of technical debt associated with an
    iterative design process to be short-term thinking which undermines
    the long term...but that assumes the goal is to <i>build quality
      software</i>. In reality, the goal is to build software <i>of
      acceptable quality</i> that <i>satisfies customer needs; </i><a
      moz-do-not-send="true"
      href="https://www.jwz.org/doc/worse-is-better.html">worse is
      better</a>.&nbsp; In this framework, much of what goes on at an
    engineering corporation can be framed as a victory rather than a
    death march.&nbsp; The problem to solve then becomes minimizing the
    iteration duration of your <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/OODA_loop">OODA loop</a>.<br>
    <br>
    The OODA loop of a software enterprise is basically this:<br>
    <ol>
      <li>Observe: Sample reaction to the latest software version</li>
      <li>Orient: Refine program and development schedule constraints
        based on reaction</li>
      <li>Decide: Choose optimal algorithms to satisfy new and changed
        constraints<br>
      </li>
      <li>Act: Test, Anneal and Release</li>
    </ol>
    <p>You break out of your loop when you stop getting meaningful
      observations.&nbsp; Many organizations have successfully adopted
      this (see <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/PDCA">OPCDA</a>).&nbsp; The
      whole point here is that you accumulate<i> less </i>bad designs
      lurking in your code, as you can refine constraints quickly enough
      to not over-invest in any particular solution.<br>
    </p>
    Many times this is paired with other questions to find out how much
    of a self-starter, leader or entrepreneurial aspect you have:<br>
    <br>
    <ul>
      <li>How do you drive adoption for your ideas?</li>
      <li>How do you measure adoption of your ideas?</li>
    </ul>
    <br>
    They always want a concrete example from your past employment, and
    it needs to be your thing from start to finish. This is usually also
    a good opportunity to reinforce how well you embrace iterative
    design principles.&nbsp; In fact it drives at the real reason they
    ask the first question.<br>
    <br>
    Knowing how to drive adoption and measure it is key to the
    observation phase.&nbsp; If your observations are flawed, it will
    poison and invalidate the results of all resultant phases, so you
    need to get it right.<br>
    <br>
    There are two primary adoption strategies. All marketing is a tree
    search algorithm of one sort or another thanks to the way influence
    networks work.<br>
    <h3>Breadth first vs Depth First Marketing<br>
    </h3>
    You can either drive adoption of something within an organization
    virally (infect the sheep) or evangelically (convert the
    Shepard).&nbsp; You<i> can</i> do both, but conditions usually mean
    you need to lean primarily towards one or the other.<br>
    The cost of reaching consumers is directly is a great deal higher,
    and they have a lot less to spend than businesses and bosses with
    budgets.&nbsp; That said, the total <i>revenue</i> you can get from
    targeting retail is vastly larger, and defections from the product
    are less troublesome.<br>
    <br>
    In general you see a hybrid model nowadays where an open source (or
    reduced price) component is marketed towards retail, and a paid
    premium version is marketed towards business.<br>
    Infection of the sheep can drive conversion of the Shepard, much the
    way that conversion of the Shepard can drive the flock.<br>
    <br>
    When it comes to driving change <i>within</i> organizations, the
    formula is turned upon its' head.&nbsp; It is actually cheaper to
    convert fellow drones instead of the queen, and effect a coup de
    main. The drones are used to collaborating with each other and value
    each others' input far more than they do tools provided from above.
    Similarly, management is <i>incapable</i> of understanding many of
    the problems which occur in the production process as they happen,
    supposing they even look for them at all.&nbsp; Furthermore, getting
    the kind of feedback needed to iterate and improve is fast and
    straightforward between drones.<br>
    <br>
    This is why much of the approach around things like Kaizen and Scrum
    focus on empowering the drone to streamline production
    themselves.&nbsp; The concept is generally referred to as <a
      moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Traditional_knowledge">Metis</a>,
    and it is valuable for management to periodically inspect and
    experiment with cross-pollination of this across divisions to
    increase productivity.<br>
    <br>
    <h3>War story time</h3>
    <p>For those of you not familiar with me, I have a decade of
      experience automating QA processes and testing in general.<br>
      This means that the vast majority of my selling has been of two
      kinds:<br>
    </p>
    <ul>
      <li>Selling tactical/strategic/logistic intelligence reports</li>
      <li>Selling colleagues on tools to improve their productivity<br>
      </li>
    </ul>
    <p>That said, I also wore "all the hats" in my startup days at
      hailstrike, and had to talk a customer down from bringing their
      shotgun to our office.<br>
      I handled that one reasonably well, as the week beforehand I'd
      read Carl Sewell's <a moz-do-not-send="true"
href="https://www.amazon.com/Customers-Life-One-Time-Lifetime-Customer/dp/0385504454/ref=sr_1_1?dchild=1&amp;keywords=carl+sewell+customers+for+life&amp;qid=1619043960&amp;sr=8-1">Customers
        for Life</a> and Harry Browne's <a moz-do-not-send="true"
href="https://www.amazon.com/Secret-Selling-Anything-Harry-Browne-ebook/dp/B00M19W20Y">Secret
        of selling anything</a>.<br>
      The problem was that one of the cronies of our conman CEO was a
      sales cretin there and promised the customer a feature that didn't
      exist and didn't give us a heads up.<br>
      It took me a bit to calm him down and assure him he was talking to
      a person that could actually help him, but after that I found out
      what motivated him and devised a much simpler way to get him what
      he wanted.<br>
      A quick code change, a deploy and call back later to walk him
      through a few things to do on his end to wrangle data in Excel and
      we had a happy camper.<br>
    </p>
    <p>He had wanted a way to bulk import a number of addresses into our
      systems and get a list of hailstorms which likely impacted the
      address in question, and a link into our app which would pull the
      storm map view immediately (that they could then do a 1-click
      report generate for homeowners).<br>
    </p>
    <p>We had a straightforward way of doing this for one address at a
      time, but I had recently completed optimizations that made it
      feasible to do many as part of our project to generate reports up
      to two years back for any address.<br>
      Our application was API driven and already had a means to process
      batched requests, so it was a simple matter of building an excel
      macro talking to our servers which he could plug his auth
      credentials into.<br>
      I built this that afternoon and sent it his way.&nbsp; This
      started a good email chain where we made it an official feature of
      the application.<br>
    </p>
    <p>It took a bit longer to build this natively into our application,
      but before the week was up I'd plumbed the same API calls up to
      our UI and this feature was widely available to our customers.<br>
      I was also able to give a stern talking to our sales staff (and
      gave them copies of C4L and SSS) which kept this from happening
      going forward, but the company ultimately failed thanks to
      aforementioned conman CEO looting the place.<br>
    </p>
    <h3>The war within</h3>
    <p>After that experience I went back to being a salaryman over at
      cPanel.&nbsp; There I focused mostly on selling productivity tools
      internally until I transitioned into a development role.<br>
    </p>
    <p>I'd previously worked on a system we called "QAPortal" which was
      essentially a testing focused virtual machine orchestration
      service based on KVM.&nbsp; Most of the <a moz-do-not-send="true"
href="https://en.wikipedia.org/wiki/Comparison_of_open-source_configuration_management_software">orchestration
        services</a> we take for granted today were in their infancy at
      that time and just not stable or reliable enough to do the
      job.&nbsp; Commercial options like CloudFormation or VSphere were
      also quite young and expensive, so we got things done using perl,
      libvirt and a webapp for a reasonable cost.&nbsp; It also had some
      rudimentary test management features bolted on.<br>
    </p>
    <p>That said, it had serious shortcomings, and the system
      essentially was unchanged for the 2 year hiatus I had over at
      hailstrike as all the developers moved on to something else after
      the sponsoring manager got axed due to his propensity to have
      shouting matches with his peers.<br>
      I was quickly tasked with coming up with a replacement.&nbsp; The
      department evaluated test management systems and eventually
      settled on TestRail, which I promptly wrote the perl API client
      for and put it on CPAN.<br>
      The hardware and virtual machine orchestration was replaced with
      an openstack cluster, which I wrote an (internal) API library for.<br>
      I then extended the test runner `prove` to talk to and multiplex
      it's argument list over the various machines we needed to
      orchestrate and report results to our test management system.<br>
      All said, I replaced the old system within about 6 months.&nbsp;
      If it were done today, it would have taken even less time thanks
      to the advances in container orchestration which have happened in
      the intervening time.&nbsp; The wide embrace of <a
        moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Service-oriented_architecture">SOAs</a>
      has made life a lot better.<br>
    </p>
    <p>Now the team had the means to execute tests massively in parallel
      across our needed configurations, but not every team member was
      technical enough to manage this all straightforwardly from the
      command line.&nbsp; They had become used to the old interface, so
      in a couple of weekends I built some PHP scripts to wrap our apps
      as an API service and threw up a jQuery frontend to monitor test
      execution, manage VMs and handle a few other things the old system
      also accomplished.<br>
      Feedback was a lot easier than with external customers, as my
      fellow QAs were not shy about logging bugs and feature requests.<br>
    </p>
    <p>I suspect this is a lot of the reason why companies carefully
      cultivate alpha and beta testers from their early adopter group of
      rabid fans.&nbsp; Getting people in the "testing mode" is a
      careful art which I had to learn administering exploratory test
      sessions back at TI, and not to be discarded carelessly.&nbsp;
      That is essentially the core of the issue when it comes to getting
      valid reports back from customers.&nbsp; You have to do Carl
      Sewell's trick of asking "what could have worked better, what was
      annoying...", as those are the sort of user feedback that you want
      rather than flat-out bugs.&nbsp; Anything which breaks the
      customers' immersion in the product must be stamped out -- you
      always have to remember you are here to <i>help</i> the user, not
      irritate them.</p>
    <p>Rewarding these users with status, swag and early access was the
      most reliable way to weed out time-wasters; you only want people
      willing to emotionally invest, and that means rewards have to
      encourage deeper integration with the product and the
      business.&nbsp; It also doesn't hurt that it's a lot cheaper and
      easier to justify as expenses than bribes.<br>
    </p>
    <h3>Are ya winning son?<br>
    </h3>
    <p>Measuring adoption of software and productivity ideas in general
      can be tricky unless you have a way to either knock on the door or
      phone home. Regardless of the approach taken, you also have to
      track it going forwards, but thankfully software makes that part
      easy nowadays.<br>
      Sometimes you use A/B tests and other standard conversion metrics,
      as I used extensively back at HailStrike.&nbsp; I may have tested
      as much copy as I did software!&nbsp; Truly the job is just
      writing and selling when you get down to it.<br>
    </p>
    <p>In the case of inter-organization projects most of the time it's
      literally knocking on the door and talking to someone.&nbsp; At
      some level people are going to "buy" what you are doing, even if
      it's just giving advice.&nbsp; This is nature's way of telling you
      "do more of this, and less of the rest".<br>
    </p>
    <p>I can say with confidence that the best tool for the job when it
      comes to storing this data is a search engine, as you eventually
      want to look for patterns in "what worked and didn't".&nbsp;
      Search engines and Key-Value stores give you more flexibility in
      what <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Information_retrieval">IR
        algorithm</a> best matches the needs of the moment.&nbsp; I use
      this trick with test data as well; all test management systems use
      databases which tend to make building reports cumbersome.<br>
    </p>
    <h3>Time Preference versus Subjective Value</h3>
    <p>Rather than flippantly dismiss the original question, I would
      like to revisit the problem.&nbsp; While it is obvious that I will
      probably gain more over the long term by sacrificing my desire to
      do something fun instead of writing this article, one must also
      take into consideration the law of <a moz-do-not-send="true"
href="https://en.wikipedia.org/wiki/Marginal_utility#Diminishing_marginal_utility">diminishing
        marginal utility and the Paradox of Value</a>.&nbsp; Thinking
      long term means nothing when one is insolvent or dead without
      heirs tomorrow.&nbsp; There will always be an infinite number of
      possible ends for which I sacrifice my finite means.&nbsp; As an
      optimization problem, it is NP hard.&nbsp; The best we can do is
      to use the <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Kelly_criterion">Kelly
        Criterion</a> to distribute our time and other assets wisely
      among the opportunities we best understand the risks about.<br>
    </p>
    <p>Building an online reputation is quite expensive and time
      consuming, but is beginning to pay off.&nbsp; It doesn't hurt that
      I'm pursuing multiple aims simultaneously (building a MicroISV
      product, chasing contracts) with everything I write these
      days.&nbsp; That said it cannot be denied that hanging out your
      shingle is tantamount to a financial suicide mission without
      multiple years of runway.&nbsp; Had I not spent my entire adult
      life toiling, living below my means and not taking debts, none of
      this would be possible.&nbsp; In many ways it's a lot like going
      back to college, but the hard knocks I'm getting these days have
      made me learn a whole lot more than a barrel full of professors.<br>
    </p>
    <p>For those who insist on the technical answer to this question, I
      would direct you to observe the design of <a
        moz-do-not-send="true"
        href="https://metacpan.org/pod/Selenium::Client">Selenium::Client</a>
      versus that of <a moz-do-not-send="true"
        href="https://metacpan.org/pod/Selenium::Remote::Driver">Selenium::Remote::Driver.</a>&nbsp;
      This is pretty much <a moz-do-not-send="true"
        href="https://troglodyne.net/posts/1612566669">my signature case</a>
      for why picking a good design from the beginning and putting in
      the initial effort to think is worth it.&nbsp; My go-to approach
      with most <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Big_ball_of_mud">big balls
        of mud</a> is to stop the bleeding with modular design.&nbsp;
      Building standalone plugins that can ship by themselves was a very
      effective approach at cPanel, and works very well when dealing
      with <a moz-do-not-send="true"
        href="http://www.catb.org/jargon/html/B/Bad-and-Wrong.html">Bad
        and Right</a> systems.&nbsp; What is a lot harder to deal with
      is "Good and Wrong" systems, usually the result of <a
        moz-do-not-send="true"
        href="http://www.catb.org/jargon/html/C/creationism.html">creationist</a>
      production.&nbsp; When dealing with a program that puts users and
      developers into <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Procrustes">Procrustes' bed</a>
      rather than conforming to their needs you usually have to start
      back from 0.&nbsp; Ironically most such projects are the result of
      the misguided decision to "rewrite it, but correctly this time".<br>
    </p>
    <p>Given cPanel at the time was a huge monorepo sort of personifying
      "bad design, good execution", many "lets rewrite it, but right
      this time" projects happened and failed, mostly due to having
      forgotten the reasons it was written the way it had been in the
      first place.&nbsp; New versions of user interfaces failed to
      delight users thanks to removing features people didn't know were
      used extensively or making things more difficult for users in the
      name of "cleaner" and "industry standard" design.&nbsp; A lot of
      pain can be brought to a firm when applying development standards
      begins to override pleasing the customer.&nbsp; The necessity of
      doing just that eventually resulted in breaking the monolith to
      some extent, as building parallel distribution mechanisms was the
      only means to escape "standardization" efforts which hindered
      satisfying customer needs in a timely manner.<br>
    </p>
    <p>This is because attempting to standardize across a monorepo
      inevitably means you can't find the "always right" one-size
      fits-all solution and instead are fitting people into the iron
      bed.&nbsp; The solution of course is <i>better organizational
        design</i> rather than program design, namely to shatter the
      monolith.&nbsp; This is also valuable at a certain firm scale
      (dunbar's number again), as nobody can fit it all into their head
      without resorting to public interfaces, SOA and so forth.&nbsp;
      Reorientation to this approach is the <a moz-do-not-send="true"
        href="https://gist.github.com/chitchcock/1281611">textbook
        example</a> of short-term pain that brings long-term benefit,
      and I've leveraged it multiple times to great effect in my career.<br>
    </p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6e8cde81-13de-11ec-84d9-c532c68b5aae</guid>
<pubDate>2021-04-29T15:34:28</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/6e8cde81-13de-11ec-84d9-c532c68b5aae" />
</item>
<item>
<title>Selling Internally, Externally and in Interviews</title>
<link>http://troglodyne.net/posts/1619710468</link>
<description><![CDATA[One of the common interview questions you get is the time preference
    question.&nbsp; I've asked it myself multiple times. It goes
    something like this:<br>
    <br>
    <ul>
      <li>Tell me about a time you had to make sacrifices in the short
        term to achieve a long term goal.</li>
    </ul>
    Engineering companies very much want to think of themselves as
    builders of great works made to stand the test of time. They
    frequently fall short of this as the customer generally wants "Mr.
    Right Now" instead of "Mr. Right". Wise organizations achieve <i>coherence
    </i>in their strategic vision by having "fulfill customer desires"
    itself as the long term goal. I've <a moz-do-not-send="true"
      href="https://troglodyne.net/video/1609105671">mentioned before</a>
    that a vision which does not align with the core business model is
    doomed to failure, and many companies fall into this trap.<br>
    <br>
    Many view the agglomeration of technical debt associated with an
    iterative design process to be short-term thinking which undermines
    the long term...but that assumes the goal is to <i>build quality
      software</i>. In reality, the goal is to build software <i>of
      acceptable quality</i> that <i>satisfies customer needs; </i><a
      moz-do-not-send="true"
      href="https://www.jwz.org/doc/worse-is-better.html">worse is
      better</a>.&nbsp; In this framework, much of what goes on at an
    engineering corporation can be framed as a victory rather than a
    death march.&nbsp; The problem to solve then becomes minimizing the
    iteration duration of your <a moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/OODA_loop">OODA loop</a>.<br>
    <br>
    The OODA loop of a software enterprise is basically this:<br>
    <ol>
      <li>Observe: Sample reaction to the latest software version</li>
      <li>Orient: Refine program and development schedule constraints
        based on reaction</li>
      <li>Decide: Choose optimal algorithms to satisfy new and changed
        constraints<br>
      </li>
      <li>Act: Test, Anneal and Release</li>
    </ol>
    <p>You break out of your loop when you stop getting meaningful
      observations.&nbsp; Many organizations have successfully adopted
      this (see <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/PDCA">OPCDA</a>).&nbsp; The
      whole point here is that you accumulate<i> less </i>bad designs
      lurking in your code, as you can refine constraints quickly enough
      to not over-invest in any particular solution.<br>
    </p>
    Many times this is paired with other questions to find out how much
    of a self-starter, leader or entrepreneurial aspect you have:<br>
    <br>
    <ul>
      <li>How do you drive adoption for your ideas?</li>
      <li>How do you measure adoption of your ideas?</li>
    </ul>
    <br>
    They always want a concrete example from your past employment, and
    it needs to be your thing from start to finish. This is usually also
    a good opportunity to reinforce how well you embrace iterative
    design principles.&nbsp; In fact it drives at the real reason they
    ask the first question.<br>
    <br>
    Knowing how to drive adoption and measure it is key to the
    observation phase.&nbsp; If your observations are flawed, it will
    poison and invalidate the results of all resultant phases, so you
    need to get it right.<br>
    <br>
    There are two primary adoption strategies. All marketing is a tree
    search algorithm of one sort or another thanks to the way influence
    networks work.<br>
    <h3>Breadth first vs Depth First Marketing<br>
    </h3>
    You can either drive adoption of something within an organization
    virally (infect the sheep) or evangelically (convert the
    Shepard).&nbsp; You<i> can</i> do both, but conditions usually mean
    you need to lean primarily towards one or the other.<br>
    The cost of reaching consumers is directly is a great deal higher,
    and they have a lot less to spend than businesses and bosses with
    budgets.&nbsp; That said, the total <i>revenue</i> you can get from
    targeting retail is vastly larger, and defections from the product
    are less troublesome.<br>
    <br>
    In general you see a hybrid model nowadays where an open source (or
    reduced price) component is marketed towards retail, and a paid
    premium version is marketed towards business.<br>
    Infection of the sheep can drive conversion of the Shepard, much the
    way that conversion of the Shepard can drive the flock.<br>
    <br>
    When it comes to driving change <i>within</i> organizations, the
    formula is turned upon its' head.&nbsp; It is actually cheaper to
    convert fellow drones instead of the queen, and effect a coup de
    main. The drones are used to collaborating with each other and value
    each others' input far more than they do tools provided from above.
    Similarly, management is <i>incapable</i> of understanding many of
    the problems which occur in the production process as they happen,
    supposing they even look for them at all.&nbsp; Furthermore, getting
    the kind of feedback needed to iterate and improve is fast and
    straightforward between drones.<br>
    <br>
    This is why much of the approach around things like Kaizen and Scrum
    focus on empowering the drone to streamline production
    themselves.&nbsp; The concept is generally referred to as <a
      moz-do-not-send="true"
      href="https://en.wikipedia.org/wiki/Traditional_knowledge">Metis</a>,
    and it is valuable for management to periodically inspect and
    experiment with cross-pollination of this across divisions to
    increase productivity.<br>
    <br>
    <h3>War story time</h3>
    <p>For those of you not familiar with me, I have a decade of
      experience automating QA processes and testing in general.<br>
      This means that the vast majority of my selling has been of two
      kinds:<br>
    </p>
    <ul>
      <li>Selling tactical/strategic/logistic intelligence reports</li>
      <li>Selling colleagues on tools to improve their productivity<br>
      </li>
    </ul>
    <p>That said, I also wore "all the hats" in my startup days at
      hailstrike, and had to talk a customer down from bringing their
      shotgun to our office.<br>
      I handled that one reasonably well, as the week beforehand I'd
      read Carl Sewell's <a moz-do-not-send="true"
href="https://www.amazon.com/Customers-Life-One-Time-Lifetime-Customer/dp/0385504454/ref=sr_1_1?dchild=1&amp;keywords=carl+sewell+customers+for+life&amp;qid=1619043960&amp;sr=8-1">Customers
        for Life</a> and Harry Browne's <a moz-do-not-send="true"
href="https://www.amazon.com/Secret-Selling-Anything-Harry-Browne-ebook/dp/B00M19W20Y">Secret
        of selling anything</a>.<br>
      The problem was that one of the cronies of our conman CEO was a
      sales cretin there and promised the customer a feature that didn't
      exist and didn't give us a heads up.<br>
      It took me a bit to calm him down and assure him he was talking to
      a person that could actually help him, but after that I found out
      what motivated him and devised a much simpler way to get him what
      he wanted.<br>
      A quick code change, a deploy and call back later to walk him
      through a few things to do on his end to wrangle data in Excel and
      we had a happy camper.<br>
    </p>
    <p>He had wanted a way to bulk import a number of addresses into our
      systems and get a list of hailstorms which likely impacted the
      address in question, and a link into our app which would pull the
      storm map view immediately (that they could then do a 1-click
      report generate for homeowners).<br>
    </p>
    <p>We had a straightforward way of doing this for one address at a
      time, but I had recently completed optimizations that made it
      feasible to do many as part of our project to generate reports up
      to two years back for any address.<br>
      Our application was API driven and already had a means to process
      batched requests, so it was a simple matter of building an excel
      macro talking to our servers which he could plug his auth
      credentials into.<br>
      I built this that afternoon and sent it his way.&nbsp; This
      started a good email chain where we made it an official feature of
      the application.<br>
    </p>
    <p>It took a bit longer to build this natively into our application,
      but before the week was up I'd plumbed the same API calls up to
      our UI and this feature was widely available to our customers.<br>
      I was also able to give a stern talking to our sales staff (and
      gave them copies of C4L and SSS) which kept this from happening
      going forward, but the company ultimately failed thanks to
      aforementioned conman CEO looting the place.<br>
    </p>
    <h3>The war within</h3>
    <p>After that experience I went back to being a salaryman over at
      cPanel.&nbsp; There I focused mostly on selling productivity tools
      internally until I transitioned into a development role.<br>
    </p>
    <p>I'd previously worked on a system we called "QAPortal" which was
      essentially a testing focused virtual machine orchestration
      service based on KVM.&nbsp; Most of the <a moz-do-not-send="true"
href="https://en.wikipedia.org/wiki/Comparison_of_open-source_configuration_management_software">orchestration
        services</a> we take for granted today were in their infancy at
      that time and just not stable or reliable enough to do the
      job.&nbsp; Commercial options like CloudFormation or VSphere were
      also quite young and expensive, so we got things done using perl,
      libvirt and a webapp for a reasonable cost.&nbsp; It also had some
      rudimentary test management features bolted on.<br>
    </p>
    <p>That said, it had serious shortcomings, and the system
      essentially was unchanged for the 2 year hiatus I had over at
      hailstrike as all the developers moved on to something else after
      the sponsoring manager got axed due to his propensity to have
      shouting matches with his peers.<br>
      I was quickly tasked with coming up with a replacement.&nbsp; The
      department evaluated test management systems and eventually
      settled on TestRail, which I promptly wrote the perl API client
      for and put it on CPAN.<br>
      The hardware and virtual machine orchestration was replaced with
      an openstack cluster, which I wrote an (internal) API library for.<br>
      I then extended the test runner `prove` to talk to and multiplex
      it's argument list over the various machines we needed to
      orchestrate and report results to our test management system.<br>
      All said, I replaced the old system within about 6 months.&nbsp;
      If it were done today, it would have taken even less time thanks
      to the advances in container orchestration which have happened in
      the intervening time.&nbsp; The wide embrace of <a
        moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Service-oriented_architecture">SOAs</a>
      has made life a lot better.<br>
    </p>
    <p>Now the team had the means to execute tests massively in parallel
      across our needed configurations, but not every team member was
      technical enough to manage this all straightforwardly from the
      command line.&nbsp; They had become used to the old interface, so
      in a couple of weekends I built some PHP scripts to wrap our apps
      as an API service and threw up a jQuery frontend to monitor test
      execution, manage VMs and handle a few other things the old system
      also accomplished.<br>
      Feedback was a lot easier than with external customers, as my
      fellow QAs were not shy about logging bugs and feature requests.<br>
    </p>
    <p>I suspect this is a lot of the reason why companies carefully
      cultivate alpha and beta testers from their early adopter group of
      rabid fans.&nbsp; Getting people in the "testing mode" is a
      careful art which I had to learn administering exploratory test
      sessions back at TI, and not to be discarded carelessly.&nbsp;
      That is essentially the core of the issue when it comes to getting
      valid reports back from customers.&nbsp; You have to do Carl
      Sewell's trick of asking "what could have worked better, what was
      annoying...", as those are the sort of user feedback that you want
      rather than flat-out bugs.&nbsp; Anything which breaks the
      customers' immersion in the product must be stamped out -- you
      always have to remember you are here to <i>help</i> the user, not
      irritate them.</p>
    <p>Rewarding these users with status, swag and early access was the
      most reliable way to weed out time-wasters; you only want people
      willing to emotionally invest, and that means rewards have to
      encourage deeper integration with the product and the
      business.&nbsp; It also doesn't hurt that it's a lot cheaper and
      easier to justify as expenses than bribes.<br>
    </p>
    <h3>Are ya winning son?<br>
    </h3>
    <p>Measuring adoption of software and productivity ideas in general
      can be tricky unless you have a way to either knock on the door or
      phone home. Regardless of the approach taken, you also have to
      track it going forwards, but thankfully software makes that part
      easy nowadays.<br>
      Sometimes you use A/B tests and other standard conversion metrics,
      as I used extensively back at HailStrike.&nbsp; I may have tested
      as much copy as I did software!&nbsp; Truly the job is just
      writing and selling when you get down to it.<br>
    </p>
    <p>In the case of inter-organization projects most of the time it's
      literally knocking on the door and talking to someone.&nbsp; At
      some level people are going to "buy" what you are doing, even if
      it's just giving advice.&nbsp; This is nature's way of telling you
      "do more of this, and less of the rest".<br>
    </p>
    <p>I can say with confidence that the best tool for the job when it
      comes to storing this data is a search engine, as you eventually
      want to look for patterns in "what worked and didn't".&nbsp;
      Search engines and Key-Value stores give you more flexibility in
      what <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Information_retrieval">IR
        algorithm</a> best matches the needs of the moment.&nbsp; I use
      this trick with test data as well; all test management systems use
      databases which tend to make building reports cumbersome.<br>
    </p>
    <h3>Time Preference versus Subjective Value</h3>
    <p>Rather than flippantly dismiss the original question, I would
      like to revisit the problem.&nbsp; While it is obvious that I will
      probably gain more over the long term by sacrificing my desire to
      do something fun instead of writing this article, one must also
      take into consideration the law of <a moz-do-not-send="true"
href="https://en.wikipedia.org/wiki/Marginal_utility#Diminishing_marginal_utility">diminishing
        marginal utility and the Paradox of Value</a>.&nbsp; Thinking
      long term means nothing when one is insolvent or dead without
      heirs tomorrow.&nbsp; There will always be an infinite number of
      possible ends for which I sacrifice my finite means.&nbsp; As an
      optimization problem, it is NP hard.&nbsp; The best we can do is
      to use the <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Kelly_criterion">Kelly
        Criterion</a> to distribute our time and other assets wisely
      among the opportunities we best understand the risks about.<br>
    </p>
    <p>Building an online reputation is quite expensive and time
      consuming, but is beginning to pay off.&nbsp; It doesn't hurt that
      I'm pursuing multiple aims simultaneously (building a MicroISV
      product, chasing contracts) with everything I write these
      days.&nbsp; That said it cannot be denied that hanging out your
      shingle is tantamount to a financial suicide mission without
      multiple years of runway.&nbsp; Had I not spent my entire adult
      life toiling, living below my means and not taking debts, none of
      this would be possible.&nbsp; In many ways it's a lot like going
      back to college, but the hard knocks I'm getting these days have
      made me learn a whole lot more than a barrel full of professors.<br>
    </p>
    <p>For those who insist on the technical answer to this question, I
      would direct you to observe the design of <a
        moz-do-not-send="true"
        href="https://metacpan.org/pod/Selenium::Client">Selenium::Client</a>
      versus that of <a moz-do-not-send="true"
        href="https://metacpan.org/pod/Selenium::Remote::Driver">Selenium::Remote::Driver.</a>&nbsp;
      This is pretty much <a moz-do-not-send="true"
        href="https://troglodyne.net/posts/1612566669">my signature case</a>
      for why picking a good design from the beginning and putting in
      the initial effort to think is worth it.&nbsp; My go-to approach
      with most <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Big_ball_of_mud">big balls
        of mud</a> is to stop the bleeding with modular design.&nbsp;
      Building standalone plugins that can ship by themselves was a very
      effective approach at cPanel, and works very well when dealing
      with <a moz-do-not-send="true"
        href="http://www.catb.org/jargon/html/B/Bad-and-Wrong.html">Bad
        and Right</a> systems.&nbsp; What is a lot harder to deal with
      is "Good and Wrong" systems, usually the result of <a
        moz-do-not-send="true"
        href="http://www.catb.org/jargon/html/C/creationism.html">creationist</a>
      production.&nbsp; When dealing with a program that puts users and
      developers into <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Procrustes">Procrustes' bed</a>
      rather than conforming to their needs you usually have to start
      back from 0.&nbsp; Ironically most such projects are the result of
      the misguided decision to "rewrite it, but correctly this time".<br>
    </p>
    <p>Given cPanel at the time was a huge monorepo sort of personifying
      "bad design, good execution", many "lets rewrite it, but right
      this time" projects happened and failed, mostly due to having
      forgotten the reasons it was written the way it had been in the
      first place.&nbsp; New versions of user interfaces failed to
      delight users thanks to removing features people didn't know were
      used extensively or making things more difficult for users in the
      name of "cleaner" and "industry standard" design.&nbsp; A lot of
      pain can be brought to a firm when applying development standards
      begins to override pleasing the customer.&nbsp; The necessity of
      doing just that eventually resulted in breaking the monolith to
      some extent, as building parallel distribution mechanisms was the
      only means to escape "standardization" efforts which hindered
      satisfying customer needs in a timely manner.<br>
    </p>
    <p>This is because attempting to standardize across a monorepo
      inevitably means you can't find the "always right" one-size
      fits-all solution and instead are fitting people into the iron
      bed.&nbsp; The solution of course is <i>better organizational
        design</i> rather than program design, namely to shatter the
      monolith.&nbsp; This is also valuable at a certain firm scale
      (dunbar's number again), as nobody can fit it all into their head
      without resorting to public interfaces, SOA and so forth.&nbsp;
      Reorientation to this approach is the <a moz-do-not-send="true"
        href="https://gist.github.com/chitchcock/1281611">textbook
        example</a> of short-term pain that brings long-term benefit,
      and I've leveraged it multiple times to great effect in my career.<br>
    </p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1619710468</guid>
<pubDate>2021-04-29T15:34:28</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1619710468" />
</item>
<item>
<title>How to (not) do job interviews</title>
<link>http://troglodyne.net/posts/6ee3b3f4-13de-11ec-84d9-bbb6019e49c7</link>
<description><![CDATA[The name of the game is building emotional investment, and most of the mechanisms that work elsewhere work here too.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6ee3b3f4-13de-11ec-84d9-bbb6019e49c7</guid>
<pubDate>2021-04-28T16:29:05</pubDate>
<enclosure url="http://troglodyne.net/posts/6ee3b3f4-13de-11ec-84d9-bbb6019e49c7" type="text/html" />
</item>
<item>
<title>How to (not) do job interviews</title>
<link>http://troglodyne.net/posts/1619627345</link>
<description><![CDATA[The name of the game is building emotional investment, and most of the mechanisms that work elsewhere work here too.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1619627345</guid>
<pubDate>2021-04-28T16:29:05</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1619627345" />
</item>
<item>
<title>Power in the Firm, and getting fired</title>
<link>http://troglodyne.net/posts/6e0a72ed-13de-11ec-84d9-e2c98a80c249</link>
<description><![CDATA[<p>
      I have been fired multiple times in my life. Each time it has been
      because I violated a fundamental <a
        href="https://www.librarything.com/work/8778/book/186907315">rule
        of power</a>.
      Where I had stayed employed when others were cut it was also due
      to "observation of the laws" of power.
      This is not to say I understood this at the time, but to observe
      that "this time is <em>not</em> different".
    </p>
    <p>
      The first "real job" I got out of college was testing calculators
      for Texas Instruments.
      I subcontracted there for about 4 years, and was one of the few
      who survived a ruthless layoff associated with the 07/08 panic.
      This was a very close run thing. There was one day in which I was
      fired and re-hired in the same day.
    </p>
    <p>
      It is clear in retrospect that the reason I stuck around was due
      to being better at finding issues than all my peers.
      I had by that time found a number of critical issues with the
      multi-line scientifics by mapping out the memory pages and
      watching for stomped flags.
      Nobody else testing the products at the time came close to
      understanding the hardware at this level, making me indispensable.
    </p>
    <p>
      Which is to say I focused like a good protestant work ethic boy on
      laws #9 and #11.
      Demonstrate, don't explicate. Keep others dependent on you to
      achieve freedom.
      I keep going back to this over my career, as it worked.<br>
    </p>
    <p>I also learned law #13 "Only appeal to self-interest" when it
      came to seeking promotion and favor from management.&nbsp; I found
      quickly that "job descriptions" were universally meaningless and
      the only important thing was delivering on stuff your manager was
      emotionally invested in.<br>
    </p>
    <p>
      This was about two years before I got fired.
      I went on to do more things for the firm which nobody else
      understood, such as solving a data encoding issue with archival
      documents and porting the TI-8X emulator to linux.
      I had made a good number of friends and was well liked at the
      firm.
    </p>
    <p>
      Nevertheless, this made me a bit too comfortable.
      I was also still a pretty naive young man at the time, and
      actually believed upper management would appreciate serious
      criticism.
      This is of course not the case, and they see it as an affront and
      out of place.
      To do this is to violate rules of power #1 and #19, "Don't
      outshine the master" and "Don't offend the wrong people".
      Like my victories this has also bitten me more than once.
    </p>
    <p>
      Interestingly enough a couple of months after my ouster, I got an
      offer to work on the programming of the color TI-84 from one of
      the programmers there I had a good relationship with.
      Apparently the criticisms which I had of management were quite
      timely and the issues I had brought up promptly blown up in their
      face like backdraft.
      As such, there was no resistance to my return as all oxen gored
      were now out of the picture.
    </p>
    <p>
      I had taken a job with cPanel by then though, a firm which I would
      spend 8 years at.
      I also rapidly rose to a position of indispensability in the QA
      organization there, but took a brief hiatus to work with my cousin
      at his startup HailStrike.
      In retrospect this should have been an obvious violation of Power
      law #10 "avoid the unhappy and unlucky".
      The company was a reject bin in many ways.</p>
    <p>
      Nevertheless due to my upbringing which had turned me into the
      stereotypical "nice guy" who immolates himself to keep others
      warm, I did a lot of good work there.
      I built a new product from the ground up and re-wrote the existing
      one to not have horrible projection bugs and awful performance.
      That said, nothing could save that firm, as my cousin and his
      partner hired a con-man to run the firm thanks to their lack of
      self-confidence.
      After about a year and a successful funding round, the co-founders
      went on a month long vacation and returned to find the place
      looted.
    </p>
    <p>
      In that time and in the aftermath I basically kept tech end of the
      shop going single-handedly <em>for minimum wage</em>.
      After about 6 months of this I cut bait and returned to cPanel,
      being close to "zeroed out" financially.
      All I got for the trouble was some worthless stock in a firm which
      languishes to this day.
    </p>
    <p>
      Meanwhile cPanel's QA department hadn't changed much from where I
      had left it.
      They were eager to make some forward progress and remembered my
      impact.
      So my departure at least had the positive effect of resulting in a
      big raise.
      Law #16 "Use absence to increase respect and honor" in action.
    </p>
    <p>
      For the next 5 or so years I became the most senior man in the
      department.
      I made a number of tools without which the department couldn't do
      their jobs.
      I also was #1 across the board in test execution and bug filing
      metrics.
    </p>
    <p>
      So far, so good.
      I also cultivated better options to effect a promotion and
      significant raise in my last two years, but this would prove my
      undoing.
      Much ink has been spilled about how it's always better to take the
      other offer (much of which I had read!) but I was emotionally
      invested in the firm after 6 years and accepted the counteroffer.<br>
    </p>
    <p>
      I was now writing product code rather than automation for our QA
      workflow.
      Similar to in my prior role, I quickly rose to the top 5 bug
      fixers and committers at the firm.
      This, however is not the same as indispensability.
    </p>
    <p>
      It turns out that you need to work on products that matter if you
      want to stick around.
      At TI, I worked on cash cows, and these things will forever need
      their indispensable people.
      However at cPanel they had a monoproduct which was itself an
      aglommeration of various sub-products some of which were important
      and not.
      The teams I was put on were rarely working on anything the
      customer was particularly interested in.
    </p>
    <p>
      To be fair, this is the case across much of the organization.
      For years only the CEO's team was the one working on anything
      relevant to customers.
      The rest of the firm was run autonomously by the middle management
      and fell victim to the principal-agent problems that entails.
    </p>
    <p>
      As a middle manager, to aggrandize yourself you generally want to
      weed out the indispensable and maximize your headcounts.
      This is generally accomplished by two means:
    </p>
    <ol>
      <li>allowing the indispensable to silo and thus violate rule #18
        "do not isolate yourself".</li>
      <li>making sure you don't take any risks you can be blamed for,
        and blaming failures on lack of manpower</li>
    </ol>
    The consequence of 2) is that nothing of consequence is worked on,
    meaning that no new person will ever achieve true indispensability.
    We had a core cabal of old developers most of whom were siloed (and
    gradually being pushed away), or had mentally checked out themselves
    due to working on unimportant tasks.
    I was obviously not among either as I "still cared" rather than
    being checked out (and thus not perceived as threatening).<br>
    <br>
    It also didn't hurt that up to that point I used programming as a
    superpower in a field that traditionally has little power in
    development organizations (QA), or worked on cash cows (which are
    rarely influential).&nbsp; The powerful never feel necessitous, and
    when push comes to shove they'll throw their best overboard.&nbsp; I
    had unwittingly aligned with weak factions until this point, which
    is a necessary (but not sufficient) condition for becoming
    indispensable.&nbsp; Now that I was a part of the engineering
    department which dominated the company, there could be no allies to
    protect my independence.<br>
    <p></p>
    <p>
      I was eventually assigned a new team and manager which I should in
      retrospect have realized was a trap.
      I had built quite the reputation for independence while I was
      there (which is normal with the indispensable) and clashed
      multiple times with this manager.
      Enough things piled up over time which were not explicitly
      breaking the rules but did not signal submission that he formed a
      negative opinion of me.
      I'd been making a number of other changes in my life at the time
      which were bringing refreshing youthful joy, so I suppose it is
      not surprising I returned to the indiscretions from my youth which
      tripped me up at TI.
    </p>
    <p>
      All it took from there was a minor dispute which could easily have
      been resolved peacefully being escalated in bad faith.&nbsp; Some
      of this was simply because I fought the situation at all.&nbsp;
      Bosses like to feel like the "cop" in the relationship in these
      situations, and we all know how cops feel about anyone who doesn't
      instantly surrender, grovel and degrade themselves for daring to
      attract their ire. This is why rule of power #22 is a thing.&nbsp;
      Surrender is the best option in such situations where you are
      already "caught up", as bosses think any benevolence they show
      from that point is a thumb-screw they can use on demand. Obviously
      you would prefer these thumbscrews not be used, so the tactic is
      to buy time and enough freedom of action to get out of there.<br>
    </p>
    <p>Rule #42 also comes into play, "Strike the Shepard and the sheep
      scatter".&nbsp; Even if you are in the right, management cannot
      tolerate defiance spreading.&nbsp; It's simply inviting further
      attack.&nbsp; While this is effective at keeping management
      powerful, it also has the effect of entrenching whatever errors
      they are engaged in.<br>
    </p>
    <p>At the end of the day the question that must be asked is "would
      you rather be happy, or right?"&nbsp; Being emotionally invested
      in the firm you work for <i>and your role in it</i> means it <i>must</i>
      "do right" in order for you to be happy.&nbsp; This is a recipe
      for disaster, as everyone's emotional needs from the firm differ
      and become guaranteed to clash past <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar's
        number</a>.&nbsp; This is why Power law #20 is a thing: "commit
      to no one".<br>
    </p>
    <p>This desire to have a useful <i>cult</i>ure at a company and a
      good "mission" is power law #27, "Use people's need to believe to
      create a cult-like following".&nbsp; While you can't hate the
      player for "playing the game", it is straightforward to realize
      that there are a great deal better things out there to direct your
      belief and worship towards than a<i> corporation</i>.&nbsp; All
      the senior developers I've known who were checked out totally
      about the firm had the right idea all along.&nbsp; The company can
      want a certain culture all it wants and even go to great lengths
      to inculcate it, but it simply can't work past a certain
      scale.&nbsp; You have to insulate yourself from this and resist
      getting sheep-dipped into their hyperreality if you want to remain
      happy.&nbsp; Focus instead on doing the things that give you power
      over your situation, which is real freedom.
    </p>
    <p>The shock of being removed from a place I'd been 8 years with a
      number of good friends took a while to absorb, but it's pretty
      clear where I steered wrongly.
      I should have learned the lesson of the <a
        href="https://en.wikipedia.org/wiki/Francesco_Bussone_da_Carmagnola">Count
        of Carmagnola</a>.
      You can't be a star when what they <i>need </i>is a cog.<br>
    </p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6e0a72ed-13de-11ec-84d9-e2c98a80c249</guid>
<pubDate>2021-04-27T15:31:57</pubDate>
<enclosure url="http://troglodyne.net/posts/6e0a72ed-13de-11ec-84d9-e2c98a80c249" type="text/html" />
</item>
<item>
<title>Power in the Firm, and getting fired</title>
<link>http://troglodyne.net/posts/1619537517</link>
<description><![CDATA[<p>
      I have been fired multiple times in my life. Each time it has been
      because I violated a fundamental <a
        href="https://www.librarything.com/work/8778/book/186907315">rule
        of power</a>.
      Where I had stayed employed when others were cut it was also due
      to "observation of the laws" of power.
      This is not to say I understood this at the time, but to observe
      that "this time is <em>not</em> different".
    </p>
    <p>
      The first "real job" I got out of college was testing calculators
      for Texas Instruments.
      I subcontracted there for about 4 years, and was one of the few
      who survived a ruthless layoff associated with the 07/08 panic.
      This was a very close run thing. There was one day in which I was
      fired and re-hired in the same day.
    </p>
    <p>
      It is clear in retrospect that the reason I stuck around was due
      to being better at finding issues than all my peers.
      I had by that time found a number of critical issues with the
      multi-line scientifics by mapping out the memory pages and
      watching for stomped flags.
      Nobody else testing the products at the time came close to
      understanding the hardware at this level, making me indispensable.
    </p>
    <p>
      Which is to say I focused like a good protestant work ethic boy on
      laws #9 and #11.
      Demonstrate, don't explicate. Keep others dependent on you to
      achieve freedom.
      I keep going back to this over my career, as it worked.<br>
    </p>
    <p>I also learned law #13 "Only appeal to self-interest" when it
      came to seeking promotion and favor from management.&nbsp; I found
      quickly that "job descriptions" were universally meaningless and
      the only important thing was delivering on stuff your manager was
      emotionally invested in.<br>
    </p>
    <p>
      This was about two years before I got fired.
      I went on to do more things for the firm which nobody else
      understood, such as solving a data encoding issue with archival
      documents and porting the TI-8X emulator to linux.
      I had made a good number of friends and was well liked at the
      firm.
    </p>
    <p>
      Nevertheless, this made me a bit too comfortable.
      I was also still a pretty naive young man at the time, and
      actually believed upper management would appreciate serious
      criticism.
      This is of course not the case, and they see it as an affront and
      out of place.
      To do this is to violate rules of power #1 and #19, "Don't
      outshine the master" and "Don't offend the wrong people".
      Like my victories this has also bitten me more than once.
    </p>
    <p>
      Interestingly enough a couple of months after my ouster, I got an
      offer to work on the programming of the color TI-84 from one of
      the programmers there I had a good relationship with.
      Apparently the criticisms which I had of management were quite
      timely and the issues I had brought up promptly blown up in their
      face like backdraft.
      As such, there was no resistance to my return as all oxen gored
      were now out of the picture.
    </p>
    <p>
      I had taken a job with cPanel by then though, a firm which I would
      spend 8 years at.
      I also rapidly rose to a position of indispensability in the QA
      organization there, but took a brief hiatus to work with my cousin
      at his startup HailStrike.
      In retrospect this should have been an obvious violation of Power
      law #10 "avoid the unhappy and unlucky".
      The company was a reject bin in many ways.</p>
    <p>
      Nevertheless due to my upbringing which had turned me into the
      stereotypical "nice guy" who immolates himself to keep others
      warm, I did a lot of good work there.
      I built a new product from the ground up and re-wrote the existing
      one to not have horrible projection bugs and awful performance.
      That said, nothing could save that firm, as my cousin and his
      partner hired a con-man to run the firm thanks to their lack of
      self-confidence.
      After about a year and a successful funding round, the co-founders
      went on a month long vacation and returned to find the place
      looted.
    </p>
    <p>
      In that time and in the aftermath I basically kept tech end of the
      shop going single-handedly <em>for minimum wage</em>.
      After about 6 months of this I cut bait and returned to cPanel,
      being close to "zeroed out" financially.
      All I got for the trouble was some worthless stock in a firm which
      languishes to this day.
    </p>
    <p>
      Meanwhile cPanel's QA department hadn't changed much from where I
      had left it.
      They were eager to make some forward progress and remembered my
      impact.
      So my departure at least had the positive effect of resulting in a
      big raise.
      Law #16 "Use absence to increase respect and honor" in action.
    </p>
    <p>
      For the next 5 or so years I became the most senior man in the
      department.
      I made a number of tools without which the department couldn't do
      their jobs.
      I also was #1 across the board in test execution and bug filing
      metrics.
    </p>
    <p>
      So far, so good.
      I also cultivated better options to effect a promotion and
      significant raise in my last two years, but this would prove my
      undoing.
      Much ink has been spilled about how it's always better to take the
      other offer (much of which I had read!) but I was emotionally
      invested in the firm after 6 years and accepted the counteroffer.<br>
    </p>
    <p>
      I was now writing product code rather than automation for our QA
      workflow.
      Similar to in my prior role, I quickly rose to the top 5 bug
      fixers and committers at the firm.
      This, however is not the same as indispensability.
    </p>
    <p>
      It turns out that you need to work on products that matter if you
      want to stick around.
      At TI, I worked on cash cows, and these things will forever need
      their indispensable people.
      However at cPanel they had a monoproduct which was itself an
      aglommeration of various sub-products some of which were important
      and not.
      The teams I was put on were rarely working on anything the
      customer was particularly interested in.
    </p>
    <p>
      To be fair, this is the case across much of the organization.
      For years only the CEO's team was the one working on anything
      relevant to customers.
      The rest of the firm was run autonomously by the middle management
      and fell victim to the principal-agent problems that entails.
    </p>
    <p>
      As a middle manager, to aggrandize yourself you generally want to
      weed out the indispensable and maximize your headcounts.
      This is generally accomplished by two means:
    </p>
    <ol>
      <li>allowing the indispensable to silo and thus violate rule #18
        "do not isolate yourself".</li>
      <li>making sure you don't take any risks you can be blamed for,
        and blaming failures on lack of manpower</li>
    </ol>
    The consequence of 2) is that nothing of consequence is worked on,
    meaning that no new person will ever achieve true indispensability.
    We had a core cabal of old developers most of whom were siloed (and
    gradually being pushed away), or had mentally checked out themselves
    due to working on unimportant tasks.
    I was obviously not among either as I "still cared" rather than
    being checked out (and thus not perceived as threatening).<br>
    <br>
    It also didn't hurt that up to that point I used programming as a
    superpower in a field that traditionally has little power in
    development organizations (QA), or worked on cash cows (which are
    rarely influential).&nbsp; The powerful never feel necessitous, and
    when push comes to shove they'll throw their best overboard.&nbsp; I
    had unwittingly aligned with weak factions until this point, which
    is a necessary (but not sufficient) condition for becoming
    indispensable.&nbsp; Now that I was a part of the engineering
    department which dominated the company, there could be no allies to
    protect my independence.<br>
    <p></p>
    <p>
      I was eventually assigned a new team and manager which I should in
      retrospect have realized was a trap.
      I had built quite the reputation for independence while I was
      there (which is normal with the indispensable) and clashed
      multiple times with this manager.
      Enough things piled up over time which were not explicitly
      breaking the rules but did not signal submission that he formed a
      negative opinion of me.
      I'd been making a number of other changes in my life at the time
      which were bringing refreshing youthful joy, so I suppose it is
      not surprising I returned to the indiscretions from my youth which
      tripped me up at TI.
    </p>
    <p>
      All it took from there was a minor dispute which could easily have
      been resolved peacefully being escalated in bad faith.&nbsp; Some
      of this was simply because I fought the situation at all.&nbsp;
      Bosses like to feel like the "cop" in the relationship in these
      situations, and we all know how cops feel about anyone who doesn't
      instantly surrender, grovel and degrade themselves for daring to
      attract their ire. This is why rule of power #22 is a thing.&nbsp;
      Surrender is the best option in such situations where you are
      already "caught up", as bosses think any benevolence they show
      from that point is a thumb-screw they can use on demand. Obviously
      you would prefer these thumbscrews not be used, so the tactic is
      to buy time and enough freedom of action to get out of there.<br>
    </p>
    <p>Rule #42 also comes into play, "Strike the Shepard and the sheep
      scatter".&nbsp; Even if you are in the right, management cannot
      tolerate defiance spreading.&nbsp; It's simply inviting further
      attack.&nbsp; While this is effective at keeping management
      powerful, it also has the effect of entrenching whatever errors
      they are engaged in.<br>
    </p>
    <p>At the end of the day the question that must be asked is "would
      you rather be happy, or right?"&nbsp; Being emotionally invested
      in the firm you work for <i>and your role in it</i> means it <i>must</i>
      "do right" in order for you to be happy.&nbsp; This is a recipe
      for disaster, as everyone's emotional needs from the firm differ
      and become guaranteed to clash past <a moz-do-not-send="true"
        href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar's
        number</a>.&nbsp; This is why Power law #20 is a thing: "commit
      to no one".<br>
    </p>
    <p>This desire to have a useful <i>cult</i>ure at a company and a
      good "mission" is power law #27, "Use people's need to believe to
      create a cult-like following".&nbsp; While you can't hate the
      player for "playing the game", it is straightforward to realize
      that there are a great deal better things out there to direct your
      belief and worship towards than a<i> corporation</i>.&nbsp; All
      the senior developers I've known who were checked out totally
      about the firm had the right idea all along.&nbsp; The company can
      want a certain culture all it wants and even go to great lengths
      to inculcate it, but it simply can't work past a certain
      scale.&nbsp; You have to insulate yourself from this and resist
      getting sheep-dipped into their hyperreality if you want to remain
      happy.&nbsp; Focus instead on doing the things that give you power
      over your situation, which is real freedom.
    </p>
    <p>The shock of being removed from a place I'd been 8 years with a
      number of good friends took a while to absorb, but it's pretty
      clear where I steered wrongly.
      I should have learned the lesson of the <a
        href="https://en.wikipedia.org/wiki/Francesco_Bussone_da_Carmagnola">Count
        of Carmagnola</a>.
      You can't be a star when what they <i>need </i>is a cog.<br>
    </p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1619537517</guid>
<pubDate>2021-04-27T15:31:57</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1619537517" />
</item>
<item>
<title>Telling Stories in corporate</title>
<link>http://troglodyne.net/posts/700efaeb-13de-11ec-84d9-e77be8da7e57</link>
<description><![CDATA[Ever since I struck out on my own, I have done far more job
    interviews and storytelling than my entire carrer thus far.
    Most of the interviews for development and testing contracts are
    talking through problems.
    You <em>must</em> tell a story, as this is how people internalize
    your attributes and form emotional investments.
    I can talk about the lessons I have learned or the <a
      moz-do-not-send="true" href="https://garba.org/posts/2021/uml/">design
      of a thing</a> until I am blue in the face, but it won't matter
    unless people know where they come from.
    This is because people don't engage the predictive engine <a
href="https://www.wired.com/story/karl-friston-free-energy-principle-artificial-intelligence/">in
      their hindbrain</a> if you don't tell a story.&nbsp; People don't
    get into <a moz-do-not-send="true"
      href="http://esr.ibiblio.org/?p=8558">camshaft thinking</a>
    (imagination) without emotionally investing in knowing how it works,
    and as such are in "internal monologue" mode.&nbsp; A story is the
    only thing this mode of thought can comprehend or output, and is a <i>necessary
      prerequisite</i> to get into the mode of thinking where
    imagination "fills in the blanks".&nbsp; By the time they get there,
    diagrams and so forth are unnecessary unless you are interested in
    mass production which comes for free with software.<br>
    <br>
    When you tell a story, people "think past the sale", and start to
    see themselves doing business with you unconsciously.
    If you don't tell a story, people default to their lower
    consciousness which is stimulus-response.
    In this case, if you aren't attractive from a "mode 1" (judging a
    book by it's cover) point of view, good luck.
    For knowledge work, this is only the case for established
    intellectuals with some degree of fame.
    This is why everyone has to do this "online brand" thing; eventually
    somebody fishing will see you in the net and haul you in.<br>
    <br>
    That said, your online brand can only get you in the door.
    From there people in the knowledge trades have an innate skepticism
    beaten into them via the scientific method.
    This has to be overcome, and the way this is usually done is by
    telling stories which the interlocutor identifies with.
    The whole goal is for both the interviewer and evaluator to be
    congruent with what each expects from the other.
    This is why it always ends up being the senior development staff
    that does the heavy lifting here.
    They've heard this story enough times to sniff out the little
    details that break them out of their suspension of disbelief (also
    known as "benefit of the doubt").
    This has a high rate of success, as it is difficult to fake having
    reasoning skills, and being able to practically apply them.
    It's also difficult to fake the little details which we encounter in
    the course of our daily toil.
    Difficult, but not impossible.<br>
    <br>
    I remember setting up those little programming puzzles on <a
      moz-do-not-send="true" href="https://www.hackerrank.com/">hackerrank</a>
    for the candidates to chew through.
    My colleague who was working on this with me on it at the time had
    some anxiety as to whether they were being specific enough in the
    description of the problems.
    I thought of how the application process ought to feel both to the
    applicant and evaluator in order to maximize the potential they can
    show and give ample opportunity to display their deficiencies.
    The job-seeker's story is supposed to be a gauntlet of increasing
    difficulty, hopefully revealing the core qualities needed in our
    work.<br>
    <br>
    In that vein, I suggested we nail down problem 1 as well as
    possible, while leaving the second vague.
    This gives people the ability to show both how efficiently they
    operate when things are concrete and how quickly they pick up on our
    "trick" question which is ill-defined and start giving us options.
    The two hardest problems in software are choosing optimal algorithms
    and reducing vague requirements into concrete, testable execution
    constraints.
    Everything else is straightforward testing, investigation and <a
      href="https://en.wikipedia.org/wiki/Simulated_annealing">annealing</a>.<br>
    <br>
    This is not to say that software organizations don't have other
    (mostly logistical and marketing) problems to solve, but that these
    are the core ones of interest to engineering.
    As an interviewer you have to lead the horse to water and see if
    they'll drink.
    The interviewer should focus on getting them interested enough in
    their stories that the evaluator shares some back.
    Reciprocity is the best sign of developing emotional investment.<br>
    <br>
    You may have noticed I'm telling a story right now.
    It's uncanny how well this works on you <em>even when you know how
      the sausage is made</em>!
    I've been on both sides of the table when it's clear that "they know
    you know, and you know they know" based on the responses.
    In these cases <a href="https://en.wikipedia.org/wiki/Fourth_wall">breaking
      the fourth wall</a> is even more convincing of a story as it too <em>is
      a story</em>.<br>
    <br>
    This is unfortunately a rarity on both sides.
    All the world's a stage, and we are merely players.
    A performance cannot truly be great unless both sides can <em>believe</em>
    it and <em>find more significance therein than their reality</em>!
    This is <em>despite</em> foreknowledge that it's a <em>performance</em>
    and not a <em>demonstration</em>.
    To succeed, one has to get fully <a
      href="https://en.wiktionary.org/wiki/sheep-dip#Verb">sheep-dipped</a>
    into the <a href="https://en.wikipedia.org/wiki/Hyperreality">hyperreality</a>
    you want to hop into.<br>
    <br>
    On that note, I will be putting out a series of war stories soon
    both as practice for upcoming contracts and for your enjoyment.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/700efaeb-13de-11ec-84d9-e77be8da7e57</guid>
<pubDate>2021-04-26T15:13:59</pubDate>
<enclosure url="http://troglodyne.net/posts/700efaeb-13de-11ec-84d9-e77be8da7e57" type="text/html" />
</item>
<item>
<title>Telling Stories in corporate</title>
<link>http://troglodyne.net/posts/1619450039</link>
<description><![CDATA[Ever since I struck out on my own, I have done far more job
    interviews and storytelling than my entire carrer thus far.
    Most of the interviews for development and testing contracts are
    talking through problems.
    You <em>must</em> tell a story, as this is how people internalize
    your attributes and form emotional investments.
    I can talk about the lessons I have learned or the <a
      moz-do-not-send="true" href="https://garba.org/posts/2021/uml/">design
      of a thing</a> until I am blue in the face, but it won't matter
    unless people know where they come from.
    This is because people don't engage the predictive engine <a
href="https://www.wired.com/story/karl-friston-free-energy-principle-artificial-intelligence/">in
      their hindbrain</a> if you don't tell a story.&nbsp; People don't
    get into <a moz-do-not-send="true"
      href="http://esr.ibiblio.org/?p=8558">camshaft thinking</a>
    (imagination) without emotionally investing in knowing how it works,
    and as such are in "internal monologue" mode.&nbsp; A story is the
    only thing this mode of thought can comprehend or output, and is a <i>necessary
      prerequisite</i> to get into the mode of thinking where
    imagination "fills in the blanks".&nbsp; By the time they get there,
    diagrams and so forth are unnecessary unless you are interested in
    mass production which comes for free with software.<br>
    <br>
    When you tell a story, people "think past the sale", and start to
    see themselves doing business with you unconsciously.
    If you don't tell a story, people default to their lower
    consciousness which is stimulus-response.
    In this case, if you aren't attractive from a "mode 1" (judging a
    book by it's cover) point of view, good luck.
    For knowledge work, this is only the case for established
    intellectuals with some degree of fame.
    This is why everyone has to do this "online brand" thing; eventually
    somebody fishing will see you in the net and haul you in.<br>
    <br>
    That said, your online brand can only get you in the door.
    From there people in the knowledge trades have an innate skepticism
    beaten into them via the scientific method.
    This has to be overcome, and the way this is usually done is by
    telling stories which the interlocutor identifies with.
    The whole goal is for both the interviewer and evaluator to be
    congruent with what each expects from the other.
    This is why it always ends up being the senior development staff
    that does the heavy lifting here.
    They've heard this story enough times to sniff out the little
    details that break them out of their suspension of disbelief (also
    known as "benefit of the doubt").
    This has a high rate of success, as it is difficult to fake having
    reasoning skills, and being able to practically apply them.
    It's also difficult to fake the little details which we encounter in
    the course of our daily toil.
    Difficult, but not impossible.<br>
    <br>
    I remember setting up those little programming puzzles on <a
      moz-do-not-send="true" href="https://www.hackerrank.com/">hackerrank</a>
    for the candidates to chew through.
    My colleague who was working on this with me on it at the time had
    some anxiety as to whether they were being specific enough in the
    description of the problems.
    I thought of how the application process ought to feel both to the
    applicant and evaluator in order to maximize the potential they can
    show and give ample opportunity to display their deficiencies.
    The job-seeker's story is supposed to be a gauntlet of increasing
    difficulty, hopefully revealing the core qualities needed in our
    work.<br>
    <br>
    In that vein, I suggested we nail down problem 1 as well as
    possible, while leaving the second vague.
    This gives people the ability to show both how efficiently they
    operate when things are concrete and how quickly they pick up on our
    "trick" question which is ill-defined and start giving us options.
    The two hardest problems in software are choosing optimal algorithms
    and reducing vague requirements into concrete, testable execution
    constraints.
    Everything else is straightforward testing, investigation and <a
      href="https://en.wikipedia.org/wiki/Simulated_annealing">annealing</a>.<br>
    <br>
    This is not to say that software organizations don't have other
    (mostly logistical and marketing) problems to solve, but that these
    are the core ones of interest to engineering.
    As an interviewer you have to lead the horse to water and see if
    they'll drink.
    The interviewer should focus on getting them interested enough in
    their stories that the evaluator shares some back.
    Reciprocity is the best sign of developing emotional investment.<br>
    <br>
    You may have noticed I'm telling a story right now.
    It's uncanny how well this works on you <em>even when you know how
      the sausage is made</em>!
    I've been on both sides of the table when it's clear that "they know
    you know, and you know they know" based on the responses.
    In these cases <a href="https://en.wikipedia.org/wiki/Fourth_wall">breaking
      the fourth wall</a> is even more convincing of a story as it too <em>is
      a story</em>.<br>
    <br>
    This is unfortunately a rarity on both sides.
    All the world's a stage, and we are merely players.
    A performance cannot truly be great unless both sides can <em>believe</em>
    it and <em>find more significance therein than their reality</em>!
    This is <em>despite</em> foreknowledge that it's a <em>performance</em>
    and not a <em>demonstration</em>.
    To succeed, one has to get fully <a
      href="https://en.wiktionary.org/wiki/sheep-dip#Verb">sheep-dipped</a>
    into the <a href="https://en.wikipedia.org/wiki/Hyperreality">hyperreality</a>
    you want to hop into.<br>
    <br>
    On that note, I will be putting out a series of war stories soon
    both as practice for upcoming contracts and for your enjoyment.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1619450039</guid>
<pubDate>2021-04-26T15:13:59</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1619450039" />
</item>
<item>
<title>April 2021 Houstonpm: pairwise technicals</title>
<link>http://troglodyne.net/posts/6e74f22a-13de-11ec-84d9-8ae74c97c56d</link>
<description><![CDATA[<ul>
<li><a href="https://troglodyne.net/posts/1618336523">General presentation</a></li>
<li><a href="https://troglodyne.net/posts/1618336942">Detailed write-up</a></li>
</ul>
A re-record of the technical and maths-heavy aspects of my April 2021 <a href="https://houston.pm.org">Houston.pm</a> presentation.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6e74f22a-13de-11ec-84d9-8ae74c97c56d</guid>
<pubDate>2021-04-13T18:05:36</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/6e74f22a-13de-11ec-84d9-8ae74c97c56d" />
</item>
<item>
<title>April 2021 Houstonpm: pairwise technicals</title>
<link>http://troglodyne.net/posts/1618337136</link>
<description><![CDATA[<ul>
<li><a href="https://troglodyne.net/posts/1618336523">General presentation</a></li>
<li><a href="https://troglodyne.net/posts/1618336942">Detailed write-up</a></li>
</ul>
A re-record of the technical and maths-heavy aspects of my April 2021 <a href="https://houston.pm.org">Houston.pm</a> presentation.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1618337136</guid>
<pubDate>2021-04-13T18:05:36</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1618337136" />
</item>
<item>
<title>April Houstonpm: pairwise</title>
<link>http://troglodyne.net/posts/70921f24-13de-11ec-84d9-dd1f44ba3468</link>
<description><![CDATA[Here's a re-record of the non-technical aspects of my presentation made to <a href="https://houston.pm.org">Houston.pm</a> in April 2021.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/70921f24-13de-11ec-84d9-dd1f44ba3468</guid>
<pubDate>2021-04-13T17:55:23</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/70921f24-13de-11ec-84d9-dd1f44ba3468" />
</item>
<item>
<title>April Houstonpm: pairwise</title>
<link>http://troglodyne.net/posts/1618336523</link>
<description><![CDATA[Here's a re-record of the non-technical aspects of my presentation made to <a href="https://houston.pm.org">Houston.pm</a> in April 2021.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1618336523</guid>
<pubDate>2021-04-13T17:55:23</pubDate>
<enclosure url="http://troglodyne.net/posts/1618336523" type="text/html" />
</item>
<item>
<title>Playwright, Selenium and Perl</title>
<link>http://troglodyne.net/posts/6f66c9bc-13de-11ec-84d9-faa00f1ab409</link>
<description><![CDATA[<p>
Last week Sebastian Riedel did some mojo testing using Playwright, I encourage you to see his work <a href="https://dev.to/kraih/playwright-and-mojolicious-21hn">here</a>.
It would have been neat if he'd used <a href="https://metacpan.org/pod/Playwright">my playwright module on CPAN</a> (as it was built to solve this specific problem).
He did so in a way which is inside-out from my approach.
</p><p>
That's just fine! TIMTOWTDI is the rule in Perl, after all.
For me, this underlines one of the big difficulties for even a small OSS developer;
If you build it, nobody will come for years if you don't aggressively evangelize it.
</p><p>
On that front, I've made some progress;
playwright-perl got a ++ from at least one other PAUSE author and I got my first ever gratuity for writing open source software thanks to said module.
This is a pretty stark contrast from the 100% thankless task of <a href="https://metacpan.org/pod/Selenium::Remote::Driver">Selenium::Remote::Driver</a>, which is <em>a lot</em> more work to maintain.
</p><p>
This is a good point to segue into talking about Sebastian's article.
Therein he mentions that some of the tricks Playwright are using might end up being a maintenance landmine down the road.
Having both worked at a place which has maintained patches to upstream software for years at a time and maintained a selenium API client for years I can say with confidence this is less of a problem than selenium has.
</p><p>
The primary trouble with selenium over the years has to do with the fact that it is <em>simply not a priority</em> for any of the browser vendors.
The vast majority of issues filed on Selenium::Remote::Driver over the years have been like <a href="https://github.com/teodesian/Selenium-Remote-Driver/issues/470">this one</a>:
In essence, the browser vendor issues a broken driver for a release and we either can ignore it as transient or have to add a polyfill if it persists across releases.
Selenium::Remote::Driver is more polyfill than client at this point (partially due to the new <a href="https://www.w3.org/TR/webdriver/">WC3</a> selenium standard not implementing much of the older <a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol">JSONWire</a> spec).
</p><p>
Historically, Chrome has been the biggest repeat offender in releasing broken drivers.
However post-layoffs, it appears Mozilla is getting in on this game as well.
Add people frequently using drivers of versions which are incompatible with their browser and encountering undefined behavior,
and you begin to understand <em>why</em> microsoft decided to micromanage the browsers the way they did in Playwright.
In practice, you need this level of control to have your testing framework be less buggy than the system you want to test with it.
</p><p>
In the end, the reason selenium sticks to open protocols is <em>because</em> they don't have the resources to devote to proper maintenance.
I regard a firm which maintains patchsets as a positive; this signals they are actually willing to devote resources to maintenance.
They would not have written and shipped them had they not been willing to; most especially not at a firm like Microsoft which is well aware of the consequences.
</p>
<h3>Selenium's dark secret</h3>
<p>
While Sebastian didn't mention these, there are also a number of other drawbacks to selenium other than selenium sticking to open protocols.
The most glaring of which is that most of the browser vendors <em>do not support</em> getting non-standard attribute values (such as the aria* family) which are highly relevant.
You must resort to simply executing javascript code, which more or less defeats the purpose of 90% of the Selenium API.
This is the approach pretty much all the polyfills in Selenium::Remote::Driver take.
</p>
<p>
Another huge controversy over the last half-decade was the "Element Overlap" check, which was buggy for years (especially when negative margin was involved) and still can't be turned off reliably.
By contrast, Playwright's check is easy to turn off and has always worked correctly.
It sounds like Microsoft learned the right lesson instead of being insensitive to the will of the vast majority of users.
</p><p>
The "Upgrade" to the WC3 protocol also removed a great deal of functionality, while giving us less new features than were removed from the JSONWire spec.
Back then the drivers were <em>even more</em> unreliable than they are now;
The primary point of the standards was to try and find a minimum set of functionality that they could reliably maintain, an effort which is a clear failure at this point.
</p><p>
Microsoft's approach of just letting the browser vendors do their thing and <em>adapt to them</em> rather than demanding they <em>adapt to testers</em> is far better.
In my career this always works out the same way.
Your life as a developer and tester gets a lot better when you take the software you work with largely as a given.
</p>
<h3>Why did playwright have to be made at all?</h3>
<p>
All the points above lead one to conclude the only thing you can rely on in selenium is the javascript interpreter.
So why not just skip selenium and write tests with something like protractor?
This is in fact what a number of organizations have done.
</p><p>
It's not like the WC3 API gives you anything above and beyond what the JS interpreter can give you, so it makes a lot of sense from a practical perspective.
Playwright on the other hand gives you easy access to everything enabled by the DevToolsProtocol on every browser with a unified API.
Selenium 4.0 offers the ability to talk to the DevToolsProtocol, but without a unified API.
This is why I consider Selenium an obsolete protocol which has been leapfrogged entirely by Playwright.
</p>
<h3>Selenium's Enduring Strengths</h3>
<p>
This is not to say that Selenium does not have some features which are still not met by the Playwright team.
In particular the built-in <a href="https://www.selenium.dev/documentation/en/grid/">Selenium Grid</a> which has been massively strengthened in Selenium 4.0.
This is enabled by it being a server based approach, rather than just a library for talking to the browser.
</p><p>
Obviously, this is quickly solved with but another layer of abstraction.
I did precisely that to accomplish the first Playwright client not made by Microsoft.
The server-based approach I took would allow me to replicate Selenium's grid functionality in the future with Playwright...
but that's probably not needed in our modern era of coverage reporters and containers.
That's why my current project <a href="https://troglodyne.net/video/1616627599">Pairwise</a> is aimed at simplifying this workflow specifically.
</p>
<h3>The holy grail of acceptance testing</h3>
<p>
Back in the JSONWire days, Microsoft UI had the genius idea to unify <em>desktop</em> testing under the Selenium API with <a href="https://github.com/Microsoft/WinAppDriver">WinAppDriver</a>.
This unfortunately has been abandoned in favor of making VSCode a world-beater.
This was clearly the right move for microsoft, as even I have been largely converted from my vim + tmux workflow.
I <em>still</em> think this is an amazing idea, and (if nobody beats me to it) I want to make an equivalent for linux (using XTest) and OSX...and windows, but all using the Playwright API instead.
</p>
<h3>Working with Playwright as a client maintainer</h3>
<p>
Playwright also made another design decision which guarantees it will be easy to spread and write clients for.
It ships with a machine-readable specification, while Selenium has never (and likely <em>will</em> never do so).
Since <a href="https://github.com/SeleniumHQ/selenium">SeleniumHQ's 4.0 JAR</a> made breaking changes, I decided to make a new client <a href="https://metacpan.org/pod/Selenium::Client">Selenium::Client</a>.
I liked the approach of dynamically making classes based upon a spec, and did so for the next generation selenium client.
However, this required that I parse the specification document, which was a nontrivial task (see <a href="https://metacpan.org/pod/Selenium::Specification">Selenium::Specification</a>).
</p><p>
The intention long-term is to replace the guts of Selenium::Remote::Driver with Selenium::Client to reduce maintenance burden;
this will take some time given how difficult it will be to untangle due to the module being a <a href="https://en.wikipedia.org/wiki/Big_ball_of_mud">big ball of mud</a>.
</p>
<h3>Closing Thoughts</h3>
<p>
The rest of Sebastian's article goes over the practical points of embedding your perl application inside Node to test it.
Much of these are the same concerns (ensuring the server is up before testing, bringing it down correctly, ensuring deps) which I had with the server.
Similarly, build toolchain issues are about the same either way; you'll have to wrangle both cpan and npm one way or another.
In the end it comes down to personal preference; do you want to write Playwright in perl or JS?
</p><p>
For guys like Sebastian and I who are as fluent in Javascript as Perl, his approach actually makes a lot of sense and is a lot less work than making a module like Playwright-perl.
The path to scaling is also less work than building in a grid-like functionality to Playwright-perl;
Kubernetes deployment of a bunch of containers each running some subset of tests and using a coverage reporter isn't exactly rocket science.
That said, doing the same with scripts built atop playwright-perl won't exactly be difficult either.
</p><p>
For those of you more comfortable in Perl than JS, I think you'll be well served by playwright-perl.
Feel free to give it a shot if this sounds like you.
If you like it a lot, <a href="https://www.paypal.com/paypalme/troglodynellc" title="SELLOUT mode activated">feel free to send me a gratuity</a>,
<a href="https://github.com/teodesian/playwright-perl">become a patron</a>,
or log some bugs if you don't like it so much.
</p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6f66c9bc-13de-11ec-84d9-faa00f1ab409</guid>
<pubDate>2021-03-29T22:38:37</pubDate>
<enclosure url="http://troglodyne.net/posts/6f66c9bc-13de-11ec-84d9-faa00f1ab409" type="text/html" />
</item>
<item>
<title>Playwright, Selenium and Perl</title>
<link>http://troglodyne.net/posts/1617057517</link>
<description><![CDATA[<p>
Last week Sebastian Riedel did some mojo testing using Playwright, I encourage you to see his work <a href="https://dev.to/kraih/playwright-and-mojolicious-21hn">here</a>.
It would have been neat if he'd used <a href="https://metacpan.org/pod/Playwright">my playwright module on CPAN</a> (as it was built to solve this specific problem).
He did so in a way which is inside-out from my approach.
</p><p>
That's just fine! TIMTOWTDI is the rule in Perl, after all.
For me, this underlines one of the big difficulties for even a small OSS developer;
If you build it, nobody will come for years if you don't aggressively evangelize it.
</p><p>
On that front, I've made some progress;
playwright-perl got a ++ from at least one other PAUSE author and I got my first ever gratuity for writing open source software thanks to said module.
This is a pretty stark contrast from the 100% thankless task of <a href="https://metacpan.org/pod/Selenium::Remote::Driver">Selenium::Remote::Driver</a>, which is <em>a lot</em> more work to maintain.
</p><p>
This is a good point to segue into talking about Sebastian's article.
Therein he mentions that some of the tricks Playwright are using might end up being a maintenance landmine down the road.
Having both worked at a place which has maintained patches to upstream software for years at a time and maintained a selenium API client for years I can say with confidence this is less of a problem than selenium has.
</p><p>
The primary trouble with selenium over the years has to do with the fact that it is <em>simply not a priority</em> for any of the browser vendors.
The vast majority of issues filed on Selenium::Remote::Driver over the years have been like <a href="https://github.com/teodesian/Selenium-Remote-Driver/issues/470">this one</a>:
In essence, the browser vendor issues a broken driver for a release and we either can ignore it as transient or have to add a polyfill if it persists across releases.
Selenium::Remote::Driver is more polyfill than client at this point (partially due to the new <a href="https://www.w3.org/TR/webdriver/">WC3</a> selenium standard not implementing much of the older <a href="https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol">JSONWire</a> spec).
</p><p>
Historically, Chrome has been the biggest repeat offender in releasing broken drivers.
However post-layoffs, it appears Mozilla is getting in on this game as well.
Add people frequently using drivers of versions which are incompatible with their browser and encountering undefined behavior,
and you begin to understand <em>why</em> microsoft decided to micromanage the browsers the way they did in Playwright.
In practice, you need this level of control to have your testing framework be less buggy than the system you want to test with it.
</p><p>
In the end, the reason selenium sticks to open protocols is <em>because</em> they don't have the resources to devote to proper maintenance.
I regard a firm which maintains patchsets as a positive; this signals they are actually willing to devote resources to maintenance.
They would not have written and shipped them had they not been willing to; most especially not at a firm like Microsoft which is well aware of the consequences.
</p>
<h3>Selenium's dark secret</h3>
<p>
While Sebastian didn't mention these, there are also a number of other drawbacks to selenium other than selenium sticking to open protocols.
The most glaring of which is that most of the browser vendors <em>do not support</em> getting non-standard attribute values (such as the aria* family) which are highly relevant.
You must resort to simply executing javascript code, which more or less defeats the purpose of 90% of the Selenium API.
This is the approach pretty much all the polyfills in Selenium::Remote::Driver take.
</p>
<p>
Another huge controversy over the last half-decade was the "Element Overlap" check, which was buggy for years (especially when negative margin was involved) and still can't be turned off reliably.
By contrast, Playwright's check is easy to turn off and has always worked correctly.
It sounds like Microsoft learned the right lesson instead of being insensitive to the will of the vast majority of users.
</p><p>
The "Upgrade" to the WC3 protocol also removed a great deal of functionality, while giving us less new features than were removed from the JSONWire spec.
Back then the drivers were <em>even more</em> unreliable than they are now;
The primary point of the standards was to try and find a minimum set of functionality that they could reliably maintain, an effort which is a clear failure at this point.
</p><p>
Microsoft's approach of just letting the browser vendors do their thing and <em>adapt to them</em> rather than demanding they <em>adapt to testers</em> is far better.
In my career this always works out the same way.
Your life as a developer and tester gets a lot better when you take the software you work with largely as a given.
</p>
<h3>Why did playwright have to be made at all?</h3>
<p>
All the points above lead one to conclude the only thing you can rely on in selenium is the javascript interpreter.
So why not just skip selenium and write tests with something like protractor?
This is in fact what a number of organizations have done.
</p><p>
It's not like the WC3 API gives you anything above and beyond what the JS interpreter can give you, so it makes a lot of sense from a practical perspective.
Playwright on the other hand gives you easy access to everything enabled by the DevToolsProtocol on every browser with a unified API.
Selenium 4.0 offers the ability to talk to the DevToolsProtocol, but without a unified API.
This is why I consider Selenium an obsolete protocol which has been leapfrogged entirely by Playwright.
</p>
<h3>Selenium's Enduring Strengths</h3>
<p>
This is not to say that Selenium does not have some features which are still not met by the Playwright team.
In particular the built-in <a href="https://www.selenium.dev/documentation/en/grid/">Selenium Grid</a> which has been massively strengthened in Selenium 4.0.
This is enabled by it being a server based approach, rather than just a library for talking to the browser.
</p><p>
Obviously, this is quickly solved with but another layer of abstraction.
I did precisely that to accomplish the first Playwright client not made by Microsoft.
The server-based approach I took would allow me to replicate Selenium's grid functionality in the future with Playwright...
but that's probably not needed in our modern era of coverage reporters and containers.
That's why my current project <a href="https://troglodyne.net/video/1616627599">Pairwise</a> is aimed at simplifying this workflow specifically.
</p>
<h3>The holy grail of acceptance testing</h3>
<p>
Back in the JSONWire days, Microsoft UI had the genius idea to unify <em>desktop</em> testing under the Selenium API with <a href="https://github.com/Microsoft/WinAppDriver">WinAppDriver</a>.
This unfortunately has been abandoned in favor of making VSCode a world-beater.
This was clearly the right move for microsoft, as even I have been largely converted from my vim + tmux workflow.
I <em>still</em> think this is an amazing idea, and (if nobody beats me to it) I want to make an equivalent for linux (using XTest) and OSX...and windows, but all using the Playwright API instead.
</p>
<h3>Working with Playwright as a client maintainer</h3>
<p>
Playwright also made another design decision which guarantees it will be easy to spread and write clients for.
It ships with a machine-readable specification, while Selenium has never (and likely <em>will</em> never do so).
Since <a href="https://github.com/SeleniumHQ/selenium">SeleniumHQ's 4.0 JAR</a> made breaking changes, I decided to make a new client <a href="https://metacpan.org/pod/Selenium::Client">Selenium::Client</a>.
I liked the approach of dynamically making classes based upon a spec, and did so for the next generation selenium client.
However, this required that I parse the specification document, which was a nontrivial task (see <a href="https://metacpan.org/pod/Selenium::Specification">Selenium::Specification</a>).
</p><p>
The intention long-term is to replace the guts of Selenium::Remote::Driver with Selenium::Client to reduce maintenance burden;
this will take some time given how difficult it will be to untangle due to the module being a <a href="https://en.wikipedia.org/wiki/Big_ball_of_mud">big ball of mud</a>.
</p>
<h3>Closing Thoughts</h3>
<p>
The rest of Sebastian's article goes over the practical points of embedding your perl application inside Node to test it.
Much of these are the same concerns (ensuring the server is up before testing, bringing it down correctly, ensuring deps) which I had with the server.
Similarly, build toolchain issues are about the same either way; you'll have to wrangle both cpan and npm one way or another.
In the end it comes down to personal preference; do you want to write Playwright in perl or JS?
</p><p>
For guys like Sebastian and I who are as fluent in Javascript as Perl, his approach actually makes a lot of sense and is a lot less work than making a module like Playwright-perl.
The path to scaling is also less work than building in a grid-like functionality to Playwright-perl;
Kubernetes deployment of a bunch of containers each running some subset of tests and using a coverage reporter isn't exactly rocket science.
That said, doing the same with scripts built atop playwright-perl won't exactly be difficult either.
</p><p>
For those of you more comfortable in Perl than JS, I think you'll be well served by playwright-perl.
Feel free to give it a shot if this sounds like you.
If you like it a lot, <a href="https://www.paypal.com/paypalme/troglodynellc" title="SELLOUT mode activated">feel free to send me a gratuity</a>,
<a href="https://github.com/teodesian/playwright-perl">become a patron</a>,
or log some bugs if you don't like it so much.
</p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1617057517</guid>
<pubDate>2021-03-29T22:38:37</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1617057517" />
</item>
<item>
<title>Announcing a new OSS tool: pairwise</title>
<link>http://troglodyne.net/posts/7042a214-13de-11ec-84d9-a2903ed4840d</link>
<description><![CDATA[While there are a number of other tools to do pairwise execution, none of them quite have the qualities needed by modern development organizations.  I aim to fix that.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/7042a214-13de-11ec-84d9-a2903ed4840d</guid>
<pubDate>2021-03-24T23:13:19</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/7042a214-13de-11ec-84d9-a2903ed4840d" />
</item>
<item>
<title>Announcing a new OSS tool: pairwise</title>
<link>http://troglodyne.net/posts/1616627599</link>
<description><![CDATA[While there are a number of other tools to do pairwise execution, none of them quite have the qualities needed by modern development organizations.  I aim to fix that.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1616627599</guid>
<pubDate>2021-03-24T23:13:19</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1616627599" />
</item>
<item>
<title>Q2 2021 Retrospective</title>
<link>http://troglodyne.net/posts/703eb21e-13de-11ec-84d9-9ee57b14adb2</link>
<description><![CDATA[6 Months in.  Thoughts on where I need to keep developing and "Stacking the Bricks" that I should have done more of earlier in my Career.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/703eb21e-13de-11ec-84d9-9ee57b14adb2</guid>
<pubDate>2021-03-23T17:44:54</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/703eb21e-13de-11ec-84d9-9ee57b14adb2" />
</item>
<item>
<title>Q2 2021 Retrospective</title>
<link>http://troglodyne.net/posts/1616521494</link>
<description><![CDATA[6 Months in.  Thoughts on where I need to keep developing and "Stacking the Bricks" that I should have done more of earlier in my Career.]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1616521494</guid>
<pubDate>2021-03-23T17:44:54</pubDate>
<enclosure url="http://troglodyne.net/posts/1616521494" type="text/html" />
</item>
<item>
<title>Async/Await? Real men prefer Promise.all()</title>
<link>http://troglodyne.net/posts/6fc05049-13de-11ec-84d9-e3b1a9d1a692</link>
<description><![CDATA[<p>
I've been writing a bunch of TypeScript lately, and figured out why most of the "Async" modules out there are actually fakin' the funk with coroutines.
</p>
<p>
Turns out even pedants like programmers aren't immune to meaning drift!  I guess I'm an old man now lol.
</p>
<p>
Article mentioned:
<a href="https://troglodyne.net/posts/1615831259">Troglodyne Q3 Open Source goals</a>
</p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/6fc05049-13de-11ec-84d9-e3b1a9d1a692</guid>
<pubDate>2021-03-16T00:04:13</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/6fc05049-13de-11ec-84d9-e3b1a9d1a692" />
</item>
<item>
<title>Async/Await? Real men prefer Promise.all()</title>
<link>http://troglodyne.net/posts/1615853053</link>
<description><![CDATA[<p>
I've been writing a bunch of TypeScript lately, and figured out why most of the "Async" modules out there are actually fakin' the funk with coroutines.
</p>
<p>
Turns out even pedants like programmers aren't immune to meaning drift!  I guess I'm an old man now lol.
</p>
<p>
Article mentioned:
<a href="https://troglodyne.net/posts/1615831259">Troglodyne Q3 Open Source goals</a>
</p>]]></description>
<author>george</author>
<guid isPermaLink="true">http://troglodyne.net/posts/1615853053</guid>
<pubDate>2021-03-16T00:04:13</pubDate>
<enclosure type="text/html" url="http://troglodyne.net/posts/1615853053" />
</item>
</channel>
</rss>
