<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://chrisfun.xyz/feed.xml" rel="self" type="application/atom+xml" /><link href="http://chrisfun.xyz/" rel="alternate" type="text/html" /><updated>2026-05-05T03:05:24+00:00</updated><id>http://chrisfun.xyz/feed.xml</id><title type="html">chrisfun</title><subtitle>My not-a-professional website</subtitle><entry><title type="html">My letter to my reps regarding California’s age verification law</title><link href="http://chrisfun.xyz/letter" rel="alternate" type="text/html" title="My letter to my reps regarding California’s age verification law" /><published>2026-03-30T00:00:00+00:00</published><updated>2026-03-30T00:00:00+00:00</updated><id>http://chrisfun.xyz/ab-1043</id><content type="html" xml:base="http://chrisfun.xyz/letter"><![CDATA[<p>My name’s Chris Taylor. I’m a software engineer and a constituent in your district. I grew up in California and got a computer engineering degree from UCSB (the one by the beach). I’ve worked on defense robotics, drones, and other high-stakes industrial systems (trains, forklift trucks), with experience in cybersecurity and AI.</p>

<p>Having lived in a number of states, I’ve come to appreciate what a good job California does at legislating technology, like protecting consumers from abusive business practices, protecting startups’ ability to compete with incumbents, or protecting people’s data privacy.</p>

<p>Given the Golden State’s generally good track record legislating technology, I am very frustrated that it is taking a turn for the worse with the recent passage of AB 1043.</p>

<p>AB 1043’s intent is noble. As author Buffy Wicks puts it, big tech companies drag their feet on protecting children online because they claim they don’t know how old their users are. AB 1043 closes this loophole by forcing all applications to request a signal from the operating system on the user’s age. What I like about the bill is there is no ID verification required. A parent inputs their child’s age on their initial account setup, and, in theory, apps request the age signal from the OS and can switch on additional safeguards to protect children from harm online. This is a massive improvement over similar age gating laws because it doesn’t require the collection of sensitive biometric information.</p>

<p>What frustrates me about this bill is that its authors seem to have drafted it under the very myopic mental model of a parent setting up their child’s account on a device created by a well-funded tech company, ignoring many other important details of the tech ecosystem and the hardworking people behind it.</p>

<p>Buffy Wicks, who introduced the bill, repeatedly referred to examples of setting up tablets for her 4-year-old and 8-year-old in hearings. She did not mention any other use case. Nichole Rocha, a tech policy advisor, seemed surprised by an opposition letter from Lenovo explaining that, unlike Apple and Google, Lenovo doesn’t make the operating system on their devices. Nichole remarked “So, when their opposition came in, I was looking at my laptop trying to figure out how this would actually work.” This remark was from a committee hearing on July 15th, 2025, <em>five months after the bill was introduced</em>.</p>

<p>During hearings, Assembly Members seemed to have only big tech companies in mind when considering who would be affected:</p>

<ul>
  <li>Buffy Wicks mentioned “The first phone calls I made when I decided to do this was to Apple and Google”.</li>
  <li>Wicks also repeatedly said “They literally have thousands of engineers”.</li>
  <li>When naming examples of developers, Wicks said “the developers, that is the, you know, <strong>Meta</strong>, et cetera”.</li>
  <li>Tina McKinnor, when questioning Robert Singleton, a lobbyist for big tech companies, mentioned “When I look up a face cream, all of a sudden on <strong>Facebook</strong> I have 100 advertisements of face creams. So we could do that, but we can’t put in age verification.”</li>
  <li>The only opposition testimony came from the Chamber of Progress, which represents big tech companies.</li>
</ul>

<p>The reality is, much of the backbone of our digital infrastructure rests not on proprietary software created by for-profit big tech companies, but on <em>open source software</em>. Like a cooking recipe without a paywall, open source software is freely available for anyone to inspect, modify, and use. Most servers, mobile devices, drones, routers, robots, even medical devices, rely on open source software for critical functions. This is for many reasons: it’s easier for security researchers to audit, it’s cheaper for companies to share software rather than reinvent the wheel, and it gives tech enthusiasts and entrepreneurs the freedom to tinker and innovate.</p>

<p>While big tech companies do contribute, open source software is typically not supported by “thousands of engineers”, but instead by hobbyists, unpaid volunteers, and nonprofits. Sometimes a single unpaid volunteer might end up supporting an extremely critical part of the technology infrastructure. This is called the “Nebraska problem”, which jokingly refers to a notional unpaid developer from Nebraska, as <a href="https://xkcd.com/2347/">this xkcd comic explains</a>. Sometimes the technologies they maintain become so important that they can threaten our national security. In 2024, a nation-state actor targeted a burned-out, unpaid volunteer maintaining an open source application and almost gave themselves a backdoor into millions of servers around the world, potentially compromising vast troves of sensitive data (including data on children). <a href="https://www.youtube.com/watch?v=aoag03mSuXQ">Watch this Veritasium video to learn more</a>.</p>

<p>AB 1043 would make the Nebraska problem even worse. Under § 1798.501(b)(1), it forces developers to request age signals, causing additional child-adjacent regulations to kick in once they have actual knowledge their user is a child. Operating system providers, under § 1798.501(a), are forced to provide the age signals. If OS providers or developers don’t comply, they could be subject to ruinous fines. See <a href="https://runxiyu.org/comp/ab1043/">this blog post</a> or <a href="https://agelesslinux.org/">agelesslinux.org</a> for more analysis.</p>

<p>Another problem with § 1798.501(b)(1) is that it forces <em>all</em> apps, even ones completely benign to children like calculator or recipe apps, to request age signals. The best policy that would help kids online, in my opinion, is protecting their privacy so they don’t become targets to predators. Cybersecurity is an expensive afterthought for many developers, and this provision will probably backfire by identifying users as underage to bad actors who shouldn’t know their age at all.</p>

<p>No one raised these issues in any AB 1043 committee hearing.</p>

<p>But the problems don’t end there. I think AB 1043 will also harm the intellectual curiosity and education of our children.</p>

<p>When I was 12 (the lowest age bracket of AB 1043), I first learned software development. I learned how to program a robot to roam around, avoid obstacles, and battle other robots. This was so much fun that over the subsequent years I taught myself much more. I had a website where I shared artwork and animations, I made a website for PC enthusiasts to shop for computer parts, I made useful little apps on my HP calculator, and I tinkered with drones and remote-controlled vehicles. Throughout my journey, I relied on free access to open source software and technologists willing to share their knowledge, like Adafruit Industries (which <a href="https://blog.adafruit.com/2026/02/23/colorado-wants-your-operating-system-to-card-you">has spoken out</a> against Colorado’s similar bill).</p>

<p>In a post-AB 1043 world, my journey would be very different. Already, open source projects are simply choosing to opt-out rather than comply with the expensive regulatory burden. The open-source operating systems MidnightBSD, Arch Linux 32, and <a href="https://github.com/BryanLunduke/DoesItAgeVerify">many others</a> have updated their terms of service to exclude California. DB48X, an HP calculator emulator, has done the same. That one particularly hurts, considering my fond memories of programming those calculators in high school.</p>

<p>I fear many more projects will take the same path, either by excluding California or excluding children and teenagers. I also fear that we’re jailing children in a walled garden curated by a handful of tech companies with the resources to eat the regulatory costs. This is a dystopian hell that I wouldn’t want my children to live in.</p>

<p>January 1st, 2027, when AB 1043 goes into effect, is still months away and we have time to fix it. This is what I’d suggest:</p>

<ul>
  <li>Narrow the scope of AB 1043 to exclude open source. Colorado lawmakers are considering this for SB26-051 and are working with System76, a local PC-building business, on it. The real targets of this bill are commercial app developers and device makers who profit off children. Since for-profit OS providers and developers don’t give away their source code for free, the bill’s intent is still intact.</li>
  <li>Exempt developers from liability if their application is benign to children. It doesn’t make sense that a calculator app should request and handle age signals in the same way Snapchat would.</li>
  <li>Narrow the scope of AB 1043 to what its authors originally intended: parents setting up devices for their children. Create a way for parents to know which devices support age attestation and which don’t, so they can make informed choices (e.g. iPads will support it, custom-built computers will not). It’s like the Energy Star logo: if you follow the regulations, you get to display the logo.</li>
</ul>

<p>So far, California has an excellent legal framework protecting people’s freedom to innovate. Having lived in a number of states, I think California is by far the best state to start a technology business or recruit talent. Please keep it that way.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[My name’s Chris Taylor. I’m a software engineer and a constituent in your district. I grew up in California and got a computer engineering degree from UCSB (the one by the beach). I’ve worked on defense robotics, drones, and other high-stakes industrial systems (trains, forklift trucks), with experience in cybersecurity and AI.]]></summary></entry><entry><title type="html">I’ve returned to Linux but I miss PowerShell</title><link href="http://chrisfun.xyz/PowerShell/" rel="alternate" type="text/html" title="I’ve returned to Linux but I miss PowerShell" /><published>2025-07-26T00:00:00+00:00</published><updated>2025-07-26T00:00:00+00:00</updated><id>http://chrisfun.xyz/powershell</id><content type="html" xml:base="http://chrisfun.xyz/PowerShell/"><![CDATA[<p>At my previous job, we all used Windows. At first I insisted on doing everything in Windows Subsystem for Linux (WSL) or Linux-based Docker containers, but eventually I gave in and went native.</p>

<p>I read <a href="https://www.manning.com/books/learn-PowerShell-in-a-month-of-lunches">Learn PowerShell in a Month of Lunches</a> so I’d actually understand things instead of cobbling together snippets from search or LLMs.</p>

<p>Then, at a subsequent job, I went back to Linux. I thought I’d feel relieved to be back in my comfort zone of not developing on Windows. But instead, as I went back to the standard Linux shells<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> (bash/zsh), I found myself missing some PowerShell features.</p>

<p>These are some features that I miss.</p>

<h2 id="tab-completion-for-free">Tab completion for free</h2>

<p>I still have not bothered to add tab completion to my shell scripts because of the extra steps involved. I am lazy.</p>

<p>PowerShell gives you this for free when you write a “cmdlet” (like a shell function). Here’s an example cmdlet:</p>
<pre><code class="language-PowerShell">function Test-MyCmdlet {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Argument
    )

    Write-Output $Argument
}
</code></pre>
<p>Save it to <code class="language-plaintext highlighter-rouge">Scripts.ps1</code>, then:</p>

<pre><code class="language-PowerShell">. Scripts.ps1
Test-MyCmdlet -Ar  # Press tab
Test-MyCmdlet -Argument
</code></pre>

<h2 id="vscodes-debugger">vscode’s debugger</h2>

<p>Eventually your spicy one-liner in the CLI will grow out of control and you need to turn it into a script.
Sometimes, you might need to debug that script.</p>

<p>vscode with the <a href="https://marketplace.visualstudio.com/items/?itemName=ms-vscode.PowerShell">PowerShell</a> extension does this with no extra steps.</p>

<p>Add a breakpoint: 
<img src="/assets/powershell/powershell-run.png" alt="" />
and hit run: 
<img src="/assets/powershell/powershell-debug.png" alt="" />
<a href="https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug">Bash Debug</a> is a close second. Its main limitation is it doesn’t seem to be aware of variables scopes. Whereas most debuggers can show you local variables like gdb’s <code class="language-plaintext highlighter-rouge">info locals</code>, <code class="language-plaintext highlighter-rouge">bashdb</code>’s <code class="language-plaintext highlighter-rouge">info variables</code> shows way too much.</p>

<p>To debug bash scripts I usually use <code class="language-plaintext highlighter-rouge">set -x</code> which is good enough.</p>

<h2 id="vscode-editing">vscode editing</h2>

<p>vscode with the PowerShell extension has decent autocomplete and linting.</p>

<p><img src="/assets/powershell/powershell-autocomplete.png" alt="" />
I haven’t seen a bash/zsh script editor with this kind of autocomplete and I’m not sure how feasible it would be to make this work, considering current shell completions reflect the system they run on and not strictly the command syntax.</p>

<p>For example,</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl is-act
</code></pre></div></div>
<p>tab-completing to</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl is-active
</code></pre></div></div>

<p>is fine for scripting, but</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl is-active Netwo
</code></pre></div></div>
<p>tab-completing to</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl is-active NetworkManager.service
</code></pre></div></div>
<p>would be deceptive because it only works on systems where <code class="language-plaintext highlighter-rouge">NetworkManager</code> is installed.</p>

<p>I will say <a href="https://www.shellcheck.net">shellcheck</a> is quite good for linting.</p>

<h2 id="a-package-manager">A package manager</h2>

<p><code class="language-plaintext highlighter-rouge">Install-Module</code> 👌</p>

<p>For example, <code class="language-plaintext highlighter-rouge">NTFSSecurity</code> eases the pain of dealing with NTFS permissions:</p>

<pre><code class="language-PowerShell">Install-Module NTFSSecurity -Scope CurrentUser
Get-NTFSOwner .
</code></pre>

<h2 id="automatic-short-commands">Automatic short commands</h2>

<p>Instead of</p>
<pre><code class="language-PowerShell">Test-MyCmdlet -Argument
</code></pre>

<p>you can do any of</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Test-MyCmdlet -A
Test-MyCmdlet -Ar
Test-MyCmdlet -Arg
</code></pre></div></div>
<p>assuming there is no conflicting argument that would match.</p>

<h2 id="easy-man-pages">Easy man pages</h2>

<p>In PowerShell, it’s all baked in to the file, and vscode’s autocomplete helps you write it.</p>

<p>For example, this cmdlet has the argument <code class="language-plaintext highlighter-rouge">Argument</code> and vscode autocompletes it as I write the documentation: 
<img src="/assets/powershell/powershell-autocomplete-help.png" alt="" />
Then with a docstring that looks like this:</p>
<pre><code class="language-PowerShell">function Test-MyCmdlet {
    &lt;#
    .SYNOPSIS
    This is just a demo cmdlet to show off PowerShell. 

    .PARAMETER Argument
    A piece of text to demonstrate a commandline arg, e.g. "hello world". 
    
    #&gt;

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Argument
    )

    Write-Output $Argument
}
</code></pre>

<p>the help page looks like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; Get-Help Test-MyCmdlet -Full 

NAME
    Test-MyCmdlet
    
SYNOPSIS
    This is just a demo cmdlet to show off PowerShell.
    
    
SYNTAX
    Test-MyCmdlet [-Argument] &lt;String&gt; [&lt;CommonParameters&gt;]
    
    
DESCRIPTION
    

PARAMETERS
    -Argument &lt;String&gt;
        A piece of text to demonstrate a commandline arg, e.g. "hello world".
        
        Required?                    true
        Position?                    1
        Default value                
        Accept pipeline input?       false
        Accept wildcard characters?  false
        
    &lt;CommonParameters&gt;
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216). 
    

</code></pre></div></div>

<h2 id="command-naming-consistency">Command naming consistency</h2>

<p>At first this seemed annoying and verbose. <code class="language-plaintext highlighter-rouge">Get-ChildItem</code> instead of <code class="language-plaintext highlighter-rouge">ls</code>?</p>

<p>But then I noticed I could find the command I wanted faster than asking Google/ChatGPT.</p>

<p>For example, I knew of <code class="language-plaintext highlighter-rouge">Get-Process</code>, which is like <code class="language-plaintext highlighter-rouge">ps</code> and shows all running processes, but how would I stop a process? Easy, find all commands whose verb operates on the noun <code class="language-plaintext highlighter-rouge">Process</code>:</p>
<pre><code class="language-PowerShell">Get-Command -Noun Process
</code></pre>
<p>which returns:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Debug-Process
Get-Process
Start-Process
Stop-Process
Wait-Process
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">Stop-Process</code> it is.</p>

<h2 id="objects-not-plaintext">Objects, not plaintext</h2>

<p>Everything is an object with named properties, which I find much easier than <code class="language-plaintext highlighter-rouge">awk</code>, <code class="language-plaintext highlighter-rouge">tr</code>, <code class="language-plaintext highlighter-rouge">cut</code>, <code class="language-plaintext highlighter-rouge">sed</code>, etc to parse plaintext.</p>

<p>For example, to see how much CPU each <code class="language-plaintext highlighter-rouge">chrome</code> process is using, then sort by most-to-least, we use the fact that <code class="language-plaintext highlighter-rouge">Get-Process</code> objects have <code class="language-plaintext highlighter-rouge">ProcessName</code>, <code class="language-plaintext highlighter-rouge">CPU</code> properties:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Get-Process | where ProcessName -Match 'chrome'  | sort CPU -Descending

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     53    46.45     152.30       5.02    9084   1 chrome
     23    15.75      37.97       0.81    7980   1 chrome
     22    33.06     108.33       0.81    9556   1 chrome
     22    30.45      76.10       0.53    8496   1 chrome
     22    21.66      61.98       0.30    6808   1 chrome
     19    13.48      28.31       0.06    8824   1 chrome
     13     7.88      18.79       0.03    9188   1 chrome
     10     6.40       8.62       0.02    9984   1 chrome
</code></pre></div></div>

<p>I personally find this easier to memorize than the bash alternative of all those <code class="language-plaintext highlighter-rouge">ps</code> arguments, which don’t generalize to other commands:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ps -eo pid,pcpu,pmem,comm --sort=-pcpu | grep '[c]hrome'
</code></pre></div></div>

<p>(Also, note the <code class="language-plaintext highlighter-rouge">grep [c]hrome</code> hack to avoid searching for the grep process itself).</p>

<p>This is amazing for pipelines. Because all inputs and outputs are objects, PowerShell knows the types of things going through a pipeline <em>before</em> running anything. For example, suppose I want to filter processes by their commandline arguments but I momentarily forgot the property.</p>

<pre><code class="language-PowerShell">Get-Process | Where-Object Com # Command? Commandline? idk, let's press tab
</code></pre>
<p>results in:</p>
<pre><code class="language-PowerShell">Get-Process | Where-Object CommandLine
CommandLine  Comments     Company      CompanyName
</code></pre>

<p>Ah, right, it’s <code class="language-plaintext highlighter-rouge">CommandLine</code>. Now I can finish what I was doing, finding all running processes that Google might be responsible for:</p>

<pre><code class="language-PowerShell">Get-Process | Where-Object CommandLine -Match 'google' 
</code></pre>

<h2 id="type-checking">Type checking</h2>

<p>This is a nice sanity check to prevent you from accidentally switching the type of a variable:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; [int]$x = 10
&gt; $x="foo"
MetadataError: Cannot convert value "foo" to type "System.Int32". Error: "The input string 'foo' was not in a correct format."
</code></pre></div></div>

<h2 id="tab-completing-your-way-around-json-or-xml">Tab-completing your way around JSON or XML</h2>

<p>Have you ever had a blob of JSON or XML lying around and found yourself repeatedly querying bits of it?</p>

<p>PowerShell lets you turn JSON or XML into an object and you can tab-complete your way to glory.</p>

<p>For example, given this in <code class="language-plaintext highlighter-rouge">sample.json</code></p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"John Doe"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"age"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w">
  </span><span class="nl">"isActive"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
  </span><span class="nl">"address"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"city"</span><span class="p">:</span><span class="w"> </span><span class="s2">"New York"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"coordinates"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mf">40.7128</span><span class="p">,</span><span class="w"> </span><span class="mf">-74.0060</span><span class="p">]</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"hobbies"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"reading"</span><span class="p">,</span><span class="w"> </span><span class="s2">"coding"</span><span class="p">],</span><span class="w">
  </span><span class="nl">"score"</span><span class="p">:</span><span class="w"> </span><span class="mf">95.5</span><span class="p">,</span><span class="w">
  </span><span class="nl">"lastLogin"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
</span><span class="p">}</span><span class="w">

</span></code></pre></div></div>

<p>turn it in to an object:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$j</span><span class="o">=</span><span class="p">(</span><span class="n">Get-Content</span><span class="w"> </span><span class="o">.</span><span class="nx">/sample.json</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">ConvertFrom-Json</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>then query its properties (with tab completion) like any other PowerShell object:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pwsh&gt; $j.name
John Doe
pwsh&gt; $j.address

city     coordinates
----     -----------
New York {40.7128, -74.006}

pwsh&gt; $j.address.city
New York
pwsh&gt; $j.hobbies
reading
coding
pwsh&gt; $j.hobbies.Length
2
</code></pre></div></div>

<p>The same works for XML:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="nt">&lt;person&gt;</span>
  <span class="nt">&lt;name&gt;</span>John Doe<span class="nt">&lt;/name&gt;</span>
  <span class="nt">&lt;age&gt;</span>30<span class="nt">&lt;/age&gt;</span>
  <span class="nt">&lt;isActive&gt;</span>true<span class="nt">&lt;/isActive&gt;</span>
  <span class="nt">&lt;address&gt;</span>
    <span class="nt">&lt;city&gt;</span>New York<span class="nt">&lt;/city&gt;</span>
    <span class="nt">&lt;coordinates&gt;</span>40.7128<span class="nt">&lt;/coordinates&gt;</span>
    <span class="nt">&lt;coordinates&gt;</span>-74.0060<span class="nt">&lt;/coordinates&gt;</span>
  <span class="nt">&lt;/address&gt;</span>
  <span class="nt">&lt;hobbies&gt;</span>reading<span class="nt">&lt;/hobbies&gt;</span>
  <span class="nt">&lt;hobbies&gt;</span>coding<span class="nt">&lt;/hobbies&gt;</span>
  <span class="nt">&lt;score&gt;</span>95.5<span class="nt">&lt;/score&gt;</span>
  <span class="nt">&lt;lastLogin&gt;&lt;/lastLogin&gt;</span>
<span class="nt">&lt;/person&gt;</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pwsh&gt; $x=[xml](Get-Content ./sample.xml)
pwsh&gt; $x.person.name
John Doe
pwsh&gt; $x.person.address

city     coordinates
----     -----------
New York {40.7128, -74.0060}

pwsh&gt; $x.person.address.city
New York
pwsh&gt; $x.person.hobbies
reading
coding
pwsh&gt; $x.person.hobbies.Length
2
</code></pre></div></div>

<p>This is really nice for playing around with the result of a REST request.</p>

<h2 id="things-i-dont-miss">Things I don’t miss</h2>

<p><strong>The PowerShell 5.1 and 7 distinction.</strong> Windows ships with PowerShell 5.1, but the latest features are in PowerShell 7. This means you either need to get everyone on your team to install 7 to share scripts, or you don’t use the newer features in 7.</p>

<p><strong>No universal ‘fail fast’ mode</strong>. In bash, exit code 0 is success, anything else is fail. <code class="language-plaintext highlighter-rouge">set -e</code> tells your script to fail fast and exit when it sees a nonzero code which is great for cutting down on debugging time. PowerShell sort of has this with</p>
<pre><code class="language-PowerShell">$ErrorActionPreference = 'Stop'
</code></pre>

<p>but it only works on programs that use PowerShell’s exception mechanisms, like <code class="language-plaintext highlighter-rouge">Write-Error</code> and not on programs that use exit codes. For example:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="bp">$Error</span><span class="n">ActionPreference</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Stop'</span><span class="w">

</span><span class="n">pwsh</span><span class="w"> </span><span class="nt">-Command</span><span class="w"> </span><span class="s2">"exit 1"</span><span class="w">
</span><span class="kr">if</span><span class="p">(</span><span class="nv">$LASTEXITCODE</span><span class="w"> </span><span class="o">-eq</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="n">Write-Host</span><span class="w"> </span><span class="s2">"The last command failed but ErrorActionPreference doesn't apply here"</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="n">Write-Error</span><span class="w"> </span><span class="s2">"This will trigger a failure"</span><span class="w">
</span><span class="n">Write-Host</span><span class="w"> </span><span class="s2">"This won't run"</span><span class="w">
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pwsh&gt; ./sample.ps1
The last command failed but ErrorActionPreference doesn't apply here
Write-Error: This will trigger a failure
</code></pre></div></div>

<p><strong>The rest of Windows.</strong> Such as: NTFS permissions (inherited permissions aren’t fun), path separators are backslashes, there are too many ways to do things (<code class="language-plaintext highlighter-rouge">batch</code>, <code class="language-plaintext highlighter-rouge">vbscript</code>, <code class="language-plaintext highlighter-rouge">PowerShell</code>, multiple control panel GUIs), and Windows Docker containers are awkward. I’d add “vendor lock-in” here but we were already stuck in the walled garden and PowerShell happened to be in it.</p>

<h2 id="conclusion">Conclusion</h2>

<p>PowerShell just seemed more intuitive and consistent than bash or zsh and I found I could do a lot more without asking Google/Kagi/ChatGPT to remind me how to do things.</p>

<p>I had high hopes for <a href="https://fishshell.com">fish</a> as the successor to bash but its <a href="https://github.com/fish-shell/fish-shell/issues/510">lack of a fail-fast mode</a> is a dealbreaker. bash’s <code class="language-plaintext highlighter-rouge">set -e</code> and PowerShell’s <code class="language-plaintext highlighter-rouge">$ErrorActionPreference = 'Stop'</code> may not be perfect but they’re way more convenient than checking return codes after every single instruction.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>I realize PowerShell is cross-platform (I wrote this on macOS) but good luck evangelizing it to teams used to Linux. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><summary type="html"><![CDATA[At my previous job, we all used Windows. At first I insisted on doing everything in Windows Subsystem for Linux (WSL) or Linux-based Docker containers, but eventually I gave in and went native.]]></summary></entry><entry><title type="html">Team Cowpeople - A story with a soundtrack</title><link href="http://chrisfun.xyz/cowpeople" rel="alternate" type="text/html" title="Team Cowpeople - A story with a soundtrack" /><published>2025-06-07T00:00:00+00:00</published><updated>2025-06-07T00:00:00+00:00</updated><id>http://chrisfun.xyz/story2</id><content type="html" xml:base="http://chrisfun.xyz/cowpeople"><![CDATA[<p><img src="/assets/cowpeople.png" alt="" /></p>

<p>I made a song. Listen here:</p>
<ul>
  <li><a href="/assets/Team%20Cowpeople.mp3">Team Cowpeople.mp3</a></li>
  <li><a href="https://youtu.be/yDtzi8YCt4E">https://youtu.be/yDtzi8YCt4E</a></li>
</ul>

<p>The title comes from this (very) short story:</p>

<hr />

<p><em>Long before the events of <a href="/story">Dissent Module</a></em></p>

<p>Eva, Mick, and Julian looked over Talia’s shoulder at the website up on her laptop.</p>

<p>Emblazoned on the top in a patriotic blend of red, white, and blue it said:</p>

<p><em>American Modern Warrior Challenge - Sponsored by DoD Junior Robotics</em></p>

<p><em>Registration deadline: 3 minutes, 2 seconds</em></p>

<p>Mick shook his fists and bounced up and down. “Ok go go go!”</p>

<p>Talia darted the cursor over to the <em>Next</em> button and clicked it. “Two forms left.”</p>

<p>A new page loaded: <em>Consent and Release of Liability</em></p>

<p>“Scroll down! Hit agree!” Eva said, thrusting a finger at the <em>Agree</em> checkbox on the screen.</p>

<p>Talia paused. “Wait, what are we even agreeing to?”</p>

<p>“Just do it!” Mick and Eva said practically in unison.</p>

<p>With a flick of the trackpad, Talia flew by each piece of legalese to find the <em>Agree</em> box.</p>

<p><em>Consent to Audio‑Visual Recording, Photography, and Real‑Time Transmission.</em> Check.</p>

<p><em>Assumption of Risk and Release of Liability for Personal Injury or Bodily Harm.</em> Check. </p>

<p><em>Participant Acknowledgment of Potentially Hazardous Interactions with Autonomous Systems.</em> Check.</p>

<p>Talia hit <em>Next</em> again. “Last form.”</p>

<p>A cursor blinked in a single text box. 
<em>Team name: ___</em></p>

<p>Eva waved it away as if fanning away a fly. “Just put in anything, maybe we can change it later.”</p>

<p>“What if we can’t?” Talia replied.</p>

<p>“How about…the Mavericks. Or Sauron.” Mick said.</p>

<p>Talia glanced back. “Sauron? I think that’s already a Defense startup.”</p>

<p>Eva leaned in. “Ok, what else? Something unconventional. Bold. How about Renegades?”</p>

<p>Mick piped in again. “Cowboys?”</p>

<p>Eva: “I dunno, too gendered.”</p>

<p>Mick: “Cowgirls?”</p>

<p>Eva squinted in thought. “Still doesn’t work.”</p>

<p>Julian piped in, perhaps his only utterance of the night. “Cowpeople?”</p>

<p>Mick threw his head back and laughed. “Oh God that is so stupid it’s amazing.”</p>

<p>Talia typed <em>Cowpeople</em> in the box. “30 seconds left! I’m going to hit submit.”</p>

<p>Eva interrupted. “Wait wait. Fuck, can we do anything else? Any other animals? Cobras, pigs, javelinas…”</p>

<p>Mick snapped his fingers and pointed at Eva. “I’ve got it. Bonobos.”</p>

<p>“I’m hitting submit!” Talia declared.</p>

<p>Eva sighed and massaged her temples with her fingers.</p>

<p>Mick gave loud shouts of laughter. Julian grinned.</p>

<p>The final page showed <em>Team Cowpeople</em> with an exploding confetti effect.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Dissent Module - A short story</title><link href="http://chrisfun.xyz/story" rel="alternate" type="text/html" title="Dissent Module - A short story" /><published>2024-06-22T00:00:00+00:00</published><updated>2024-06-22T00:00:00+00:00</updated><id>http://chrisfun.xyz/story</id><content type="html" xml:base="http://chrisfun.xyz/story"><![CDATA[<p><code class="language-plaintext highlighter-rouge">December 24th</code> <br />
<code class="language-plaintext highlighter-rouge">Near Kennedy Space Center, Florida</code></p>

<p>They gathered around a table lit by a lone pair of overhead lights in an otherwise dark sea of cubicles and desk chairs. On the table were to-go boxes of Chinese food, a lit Hanukkah menorah, and a portable speaker playing Bollywood songs. Some wore ugly holiday sweaters, some had turbans, one had a <code class="language-plaintext highlighter-rouge">hello world</code> computer programmer shirt. All had their NASA badge lanyards around their necks.</p>

<p>The woman wearing the blue flight suit was the loudest. The mission patch on her shoulder showed “LEO Lodge” encircling a cartoon of a beaver building a space station. Her chest patch showed <em>Eva Resnik</em>. She chatted with the Sikh person sitting next to her wearing a turban with galaxies on it.</p>

<p>“This is all you have to know about Jewish holidays.” She began counting with her fingers. “One: they tried to kill us. Two: they failed. Three: let’s eat!”</p>

<p>The man laughed, glancing over at the woman wearing the <em>Hanukkah Llama</em> sweatshirt to see her reaction. His smile faded when she gave none. Talia Wescoff frowned at the notification on her phone. Eva looked at her. “Talia, whoever this is, he better be cute.”</p>

<p>“Sorry,” Talia said, drawing out the word. “Work stuff. Server alerts again.” She tossed the phone to the side.</p>

<p>“Can’t they just take their Christmas holiday and leave you in peace?” Eva replied.</p>

<p>Talia sighed. “Who knows. At least I get paid time and a half for taking these shifts. Anyway thanks again for setting up this party. I would’ve been bored out of my mind.”</p>

<p>Eva bowed slightly. “Of course. I already blew my vacation time before LEO Lodge training anyway.”</p>

<p>Talia’s phone buzzed again. Eva glared at her. Talia reached for her phone, tapped the notification, flicked through the logs, and sighed.</p>

<p>“SETIbro. This again.”</p>

<p>“What?” Eva asked.</p>

<p>“Some intern project. It uses the spare time on the antennas to look for anomalous signals. They called it <em>SETIbro</em>.”</p>

<p>“SETI? As in Search for Extraterrestrial Intelligence? And bro?” Eva said incredulously.</p>

<p>“Yeah, I know right. Interns.” Talia rolled her eyes. “It basically looks for any signal remotely fishy then spins up every analysis program we have to dig into it. Hold on a sec.”</p>

<p>Talia tapped a few buttons.</p>

<p>“There, I killed it. I’ll deal with it tomorrow morning.”</p>

<p>Eva had sarcasm in her tone. “Talia, what if we just found aliens!”</p>

<p>“This thing finds aliens a few times a year.”</p>

<!-- Clocks -->
<hr />

<p>Eva shuffled out of bed and opened the shades. It was early morning, a soft blue glow emerging from the east. She checked the digital clock on the wall. Then blinked and checked it again.</p>

<p><em>1:30am</em>.</p>

<p>She looked out the window again at the blue glow on the horizon. The streets were quiet. She checked her phone. No cell service. Its clock also showed <em>1:30am</em>. She checked the wifi. Infinite loading spinner.</p>

<p>“The fuck?”</p>

<p>She got in her car and furrowed her brow at the cacophony of warning popups on the center touch screen.</p>

<p><code class="language-plaintext highlighter-rouge">Lost connection to NULL.</code></p>

<p><code class="language-plaintext highlighter-rouge">We're sorry, {MSG_TEXT_HERE}</code></p>

<p>She tapped all the buttons on the screen, which didn’t respond. “Piece of shit.”</p>

<p>She grabbed her bike, rode it to Talia’s apartment, dashed up the stairs, then knocked on the door. “Talia! It’s Eva!”</p>

<p>After a few minutes, Talia emerged: groggy, squinting, her hair disheveled, wearing <em>Piranha Plant</em> pajamas. “Oh, hey.”</p>

<p>“Your car. Does it start?”</p>

<p>Talia blinked. “What the hell? I’ve told you many times before: it works fine. I don’t need that connected shit.” Her eyes widened when she realized Eva was serious. “What’s going on?”</p>

<p>“Something’s going down with all electronics. You should get dressed. Can I try your car?”</p>

<p>“Yeah sure. Where are we going?”</p>

<p>“You said SETIbro plugs into the antenna arrays at network ops, right? I bet we can find some answers there.”</p>

<p>Eva drove them to the NASA complex. At first, nothing seemed unusual. They saw a few people walking. One of them was puzzling over their phone. But on the main avenue, she noticed a self-driving robotaxi parked on the side of the road, its hazard lights flashing. Then another. And another.</p>

<p>“Check the radio,” Eva suggested. Talia tuned it to an FM station. Static.</p>

<p>They arrived and both went in the office. It was dark and empty. Talia slid into her desk, typing a rapid fire staccato of keys to login and check what was going on.</p>

<p>“What’s it say?” Eva looked over her shoulder.</p>

<p>The local NASA intranet worked. She tried loading a news page from the outside internet, which trickled in slower than dial-up. The headlines seemed like yesterday’s news, mostly tensions with the Eurasian Coalition (EAC).</p>

<p><em>Downing of Flight 766: Questions Keep Coming.</em></p>

<p><em>EAC Sanctions Against USA: What We Know So Far.</em></p>

<p>Eva pointed at the clock. “Holy shit, 12:30am. It’s like time’s going backwards. Let’s check that SETIbro thing.”</p>

<p>Eva watched over her shoulder while Talia pored over plots and readouts on her computer.</p>

<p>Talia leaned forward. “It’s still going nuts. We expected that much. Wait…holy shit, I’m seeing spam on every form of communication channel. GPS, 5G, AM, FM. This is nuts.”</p>

<p>Eva pointed at a line of text showing ADS-B. “Oh shit, we use that for aircraft. That’s not good.”</p>

<p>Eva walked over to the window and looked out, half expecting to see mayhem.</p>

<p>Talia clicked around the analysis windows and noticed something. “This FM radio thing is odd. The phased array is showing two radio signals. There’s the signal down on earth then another signal from the sky. I’m going to compare the two.”</p>

<p>She played back the song from the ground station: <em>Man in Black</em> by Johnny Cash. Then she played the other interfering signal from above. It sounded the same.</p>

<p>“It sounds fine,” Eva said. “Why were we getting static on the drive over here?”</p>

<p>Talia superimposed the two and zoomed in. “Look at that.”</p>

<p>One line showing a sine-looking wave. The other showed the exact same wave…upside down.</p>

<p>Eva said, “Destructive interference. I remember that from HAM radio training. That’s when we screw up and kill a signal by transmitting its inverse.”</p>

<p>Eva looked outside again. “I want to try something.”</p>

<p>She rushed outside and looked at the GPS readout on her phone. Surprisingly, it got a fix and reported high confidence in its location, showing them in the middle of the Indian Ocean. Just as Talia followed her outside, Eva rushed back inside.</p>

<p>“What are you looking for?” Talia asked.</p>

<p>She darted over to grab a globe from someone’s desk, then marked the location with a sharpie.</p>

<p>“Uh…isn’t that Bill’s globe?”</p>

<p>Eva started scrawling numbers on the nearest piece of paper.</p>

<p>“It’s an antipode! A perfect antipode.”</p>

<p>“What?” Talia asked.</p>

<p>“We’re here.” She pointed near Orlando, FL on the globe. “Now, if we tunnel into this point,” she stabbed a pen into their location, “and go in a straight line out the other side, we end up here,” she said, pointing at the other spot in the Indian Ocean. “It’s the exact opposite point on the globe.”</p>

<p>Talia looked confused. “I don’t get it. Opposites, inverted radio signals, “</p>

<p>She pulled out her phone again. It showed 11:30pm on the <em>previous day</em>.</p>

<p>“…and the clocks are still going backwards.”</p>

<p>Eva walked over to the window and looked up at the overcast sky.</p>

<p>“That second signal, where did you say it was coming from?”</p>

<p>“Straight above, from the sky. Why?”</p>

<p>“Can you track it down again? Let’s try something.”</p>

<p>“I’ll try.”</p>

<p>Talia rushed back to the terminal and tried more analysis programs.</p>

<p>“I think I’ve got something. The L band antenna on the roof thinks it’s a GPS satellite. It’s tracking it” she scrolled through more plots, “somewhere in a higher orbit than LEO Lodge.”</p>

<p>“Can we send a message to it?”</p>

<p>“Uhhh…is that a good idea? What if this is an electronic warfare attack?”</p>

<p>“What, it’s not like it can make its attack any worse. This thing’s already violated who knows how many laws.”</p>

<p>“I don’t know. We don’t know what it’s capable of. It could launch some other kind of attack. What if it is ETI?”</p>

<p>“Talia, come on. It’s probably some classified satellite or something. Just send it a message. I feel like we’re on to something. Let’s do it.”</p>

<p>Talia hesitated. Then her curiosity got the better of her.</p>

<p>“Alright.” She clicked around then slid the keyboard over to her. “What do you want to say?”</p>

<p>Eva typed</p>

<p><code class="language-plaintext highlighter-rouge">hello I'm Eva we come in peace.</code></p>

<p>“Really? Alright.” She hit enter. Immediately, some gibberish text showed up. “Wow, that was fast. Here’s the response.”</p>

<p>Eva puzzled over it. “Huh. Can you make anything of it? Is it doing opposites again?”</p>

<p>She tried a few commands. “Yep. Every bit of information is flipped. Wait a minute, there’s more.”</p>

<p>New text showed up.</p>

<p><code class="language-plaintext highlighter-rouge">WAY afar afar afar afar afar</code></p>

<p>The text repeated itself.</p>

<p>They looked incredulously at each other. “The fuck?” Eva said.</p>

<p>Eva typed a reply.</p>

<p><code class="language-plaintext highlighter-rouge">I don't understand. Could you explain?</code></p>

<p>The response came back.</p>

<p><code class="language-plaintext highlighter-rouge">Eva shall make physical contact with the information forager. Forager ceases electromagnetic communication.</code></p>

<p>They both looked at each other.</p>

<p>“Information forager? What on earth is that?” Eva asked.</p>

<p>“And you have to make ‘physical contact’ with it?”</p>

<p>“Like, I have to physically go up there and touch it?”</p>

<!-- Aftermath -->
<hr />

<p>Days later, Eva scrolled through the news headlines.</p>

<p><em>Global Crisis Unfolds as Mystery Satellite Disrupts Earth’s Telecom: What We Know So Far</em></p>

<p><em>World Leaders Demand Answers After Space-Borne Attack Disables Global Communications</em></p>

<p><em>How this Quick Thinking First Responder Used Morse Code to Reach Crash Victims</em></p>

<p>Then the social media posts.</p>

<p><em>broooo planes crashing, internet down, CLOCKS GOING BACKWARDS??</em></p>

<p><em>I COULDN’T EVEN LIVE-TWEET THIS APOCALYPSE 😡</em></p>

<p><em>The Lord has dominion over all things, even time itself. Isaiah 38:7: “This is the Lord’s sign to you that the Lord will do what he has promised: I will make the shadow cast by the sun go back the ten steps it has gone down on the stairway of Ahaz.”</em></p>

<p><em>How could it be anything other than aliens? THEY REVERSED TIME!!</em></p>

<p><em>Anyone old enough to remember when the apocalypse shut down everything EXCEPT the electronics?</em></p>

<p>But the most alarming reaction came from the Eurasian Coalition.</p>

<p><em>Not one year after the tragic events of Flight 766, the world is again shocked and outraged by the recklessness of the United States defense apparatus. This time, we believe it has conducted an unprecedented space-borne electronic warfare attack on our critical infrastructure.</em></p>

<!-- SCIF -->

<p>Talia watched Eva pace back and forth. Eva rehearsed possible replies to herself.</p>

<p><em>I’m sorry, sir, it won’t happen again.</em></p>

<p><em>I’m sorry, sir. It was reckless. We had no right to send that signal.</em></p>

<p><em>I’m sorry, sir. We only wanted to investigate it.</em></p>

<p>A man in a combat uniform entered. The patch on his shoulder showed the triangular Space Force logo. The gold rectangle patch on his chest indicated Second Lieutenant.</p>

<p>“Eva. Remember me?”</p>

<p>“Yeah, Eckert. You work with Bill, right?”</p>

<p>“Let’s talk.” He motioned for her to follow.</p>

<p><em>Here it comes</em>.</p>

<p>They placed their phone and keys in lockers, walked through metal detectors, then through a thick steel doorway. The windowless room was the size of an average conference room, with walls made to prevent any kind of electronic eavesdropping.</p>

<p>The man swung the heavy door closed behind him.</p>

<p>“I almost forgot we had one of these,” she said.</p>

<p>He didn’t seem interested in smalltalk.</p>

<p>“I apologize that Bill couldn’t be here in person to deliver the news himself. I’ll cut to the chase. What I’m about to tell you is classified.”</p>

<p>She nodded.</p>

<p>“As you probably know, tensions with the EAC were already high after Flight 766. Now it’s worse. Two of their civilian aircraft crashed and we still don’t know the status of the victims. We have high confidence it was because GPS spoofing from the electronic warfare attack caused their autopilot to malfunction. They’re blaming us for the attack.”</p>

<p>He continued.</p>

<p>“And now for the classified part, which is why I brought you here. We have a pretty good idea of the EAC’s and other adversaries’ capabilities. We know our capabilities. Whatever did this is beyond <em>anyone’s</em> capabilities.”</p>

<p>“In what way?” she asked.</p>

<p>“The electronic warfare attack, while impressive, is within the realm of possibility. But it’s not <em>how</em> they did the attack we’re interested in. It’s <em>where</em> the attack came from. It essentially came out of nowhere and shows no resemblance to any known satellite’s orbit, including those of our adversaries.”</p>

<p>“And what did the EAC say about that?”</p>

<p>“Our backchannels in the EAC said cooler heads have not prevailed. Their regime is under intense pressure for legitimacy and they might lash out to score some political points. They’re moving destroyers with anti-satellite missiles into offensive positions.”</p>

<p>He continued.</p>

<p>“That’s where you come in. That <em>Sunfly</em> rocket to LEO Lodge? It’s getting repurposed to visit the unknown object. You’re going to rendezvous with it and get whatever information you can.”</p>

<p>Eva felt uneasy. She wasn’t sure whether to be excited or scared.</p>

<p>“Alright. Great! Why me, though? Doesn’t Space Force QRF handle these things?”</p>

<p>“It asked for you, specifically. We’re inclined to do what it says after its recent antics.”</p>

<p>“Ok. So, no crew?”</p>

<p>“You will be accompanied by extra hydrazine.”</p>

<p>“More fuel. I see.”</p>

<p>“The object is in a higher orbit than LEO Lodge and the current configuration won’t get that far. Replacing some crew with fuel should get us where we need. Any questions?”</p>

<p>“I want Talia on comms. She knows this thing better than anyone else.”</p>

<p>“Talia Wescoff? I’ll ask Bill. I think we can arrange that.”</p>

<!-- Launch -->
<hr />

<p>Eva looked at the black sky through the crew capsule.</p>

<p>Mission control rattled off the pre-launch checklist.</p>

<p>“Guidance.”</p>

<p>“Go.”</p>

<p>“FIDO.”</p>

<p>“Go.”</p>

<p>“GNC.”</p>

<p>“Go.”</p>

<p>They finished the checklist. Then the countdown. “Go for launch. T minus 30 seconds and counting. Mark.”</p>

<p>“…, 3, 2, 1, liftoff.”</p>

<p>The rocket thundered to life, the explosive bolts unleashing it from the launchpad. The exhaust plume lit the Florida coastline like a second sun.</p>

<p>“Initiate roll program.”</p>

<p>The sliver of moonlight streaming through the window crept over the instrument panels as the rocket rolled into its climb position.</p>

<p>“T minus 10 seconds to MECO.”</p>

<p>“Mark. Main engine cut off.”</p>

<p>The rocket went silent. Eva checked the radar. Talia spoke over the radio. “20 minutes to rendezvous. Eva you got anything yet?”</p>

<p>“Nothing yet.”</p>

<p>Some minutes later, a radar ping grabbed her attention.</p>

<p>“Wait, I’ve got it. Very clear radar return. Making course corrections now.”</p>

<p>The thrusters made hundreds of small <em>hiss</em> noises as they perfectly aligned the ship to intercept the unknown craft.</p>

<p>Talia’s voice crackled in her earpiece. “Eva, CAPCOM. 10 seconds until orbital insertion burn.”</p>

<p>The rocket on the crew capsule fired. Eva was pressed into her seat. She watched the distance to the unknown object decrease.</p>

<p><em>2km</em></p>

<p><em>1km</em></p>

<p><em>400m</em></p>

<p>The craft went silent. Eva squinted out the window. The unknown object was a silver dot. “I have a visual. Moving to rendezvous.”</p>

<p>She used the more gentle rendezvous thrusters to approach the object. The relative distance numbers dropped more slowly this time.</p>

<p><em>300m</em></p>

<p><em>200m</em></p>

<p><em>100m</em></p>

<p>The silver dot enlarged in the capsule’s window and then took shape. The object looked cylindrical with curved surfaces with a hollow interior, like an turbofan engine nacelle on a jumbo jet or the nozzle of a hairdryer. Except, there was nothing in the inside, as if it was a nacelle without an engine. The empty hole in the interior with the smooth circular lip almost looked like the mouth of a lamprey. It had the diameter of an average passenger jet fuselage and the length of about two sedans front-to-back.</p>

<p>Talia and the rest of mission control stared at the video feeds in silence. The craft came closer. <em>10 meters</em></p>

<p>Eva spoke into her mouthpiece, “I hope you’re getting this on the video feed. I’m going to put the capsule in parking mode and go up to it on a tether.”</p>

<p>She tapped through a few screens on the console. <em>Auto-park</em>. This would keep her capsule stationary relative to the unknown object.</p>

<p>“Moving up to it now.”</p>

<p>She donned her spacesuit and attached a tether cable. The unknown object seemed like <em>up</em> to her as the bright blue of the earth lay below. She pushed off the capsule and floated “upward” toward it, using the MMU thrusters on her spacesuit to slow down just beside it.</p>

<p>Talia squinted at the shaky video feed. “Eva, CAPCOM. Can you describe what you see?”</p>

<p>“It doesn’t make sense. The outside has these metallic looking hexagonal fish scales with dark little creases between them. I don’t see any thrusters or antennas. Talia, you getting anything on the sensors?”</p>

<p>“Still nothing. It’s quiet, as it promised.”</p>

<p>“I’m going to maneuver to look in the inside.”</p>

<p>She floated over to the inside of the tube. It looked pitch black against the harsh shadow of the outer-space sun, with no atmosphere to provide indirect lighting. She flipped on her suit lights.</p>

<p>“The inside looks similar, that metallic honeycomb fish-scale surface, whatever you want to call it. Wait, some of the scales have different colors. There’s bulging in spots, like blisters. Lines streaking across. It almost looks…injured. Maybe it took a beating on the way over here.”</p>

<p>She panned around the inside with her suit light. “Talia, any signals yet?”</p>

<p>“Still nothing. If I get something, you’ll be the first to know.”</p>

<p>Talia muted herself to get an update from the Commander. Talia unmuted and relayed it over the radio, “Eva, we’re seeing lots of hostile activity from the EAC. Get ready to evac if they try something.”</p>

<p>“Received. Here goes nothing.”</p>

<p>She slowly reached out her sausage-like gloved finger, the pressurized suit keeping her fingers inflated. She touched the surface then withdrew her hand immediately, waiting for a reaction. Nothing. She ran her fingers along the surface.</p>

<p>“It feels smooth with some undulating cracks. I’m not getting any sign of life.”</p>

<p>Talia replied. “It said ‘physical contact’. Maybe that’s sound waves. Can you listen to it?”</p>

<p>“I’m going to put my helmet up to it.”</p>

<p>She held on to the curved lip at the edge of the hole, one hand on the dark inside, the other on the sunny outside. She rotated her whole body forward until her faceplate made a <em>thud</em> against the object’s surface.</p>

<p>“Hello. This is Eva. Remember? We communicated a while ago. I’m here.”</p>

<p>She waited.</p>

<p>“I’m not getting anything,” she said over the radio. She pushed her faceplate against it harder to try and pick up sound.</p>

<p>Suddenly, she heard high pitched noises, almost like scratching. It sounded like a dentist’s cleaning instrument moving around inside her helmet.</p>

<p>“You hearing that?” Eva said.</p>

<!-- Forager -->

<p>“Yes, it sounds scratchy.”</p>

<p>She heard a voice. A faint voice. It sounded like a girl’s voice.</p>

<p>“way afar afar afar hello hello afar afar hello hello”</p>

<p>It increased in volume.</p>

<p>“Yes? I hear you.”</p>

<p>“Eva makes…” it said. She couldn’t hear the rest.</p>

<p>“I can’t hear. It’s too quiet.”</p>

<p>Louder this time. “Eva makes physical contact,” it said.</p>

<p>Eva recoiled, pulling her helmet away so it wouldn’t hear.</p>

<p>“Ok, I think it’s talking. It sounds like a kid. Interesting.”</p>

<p>She pressed her helmet against it again to hear it. “What’s your name?”</p>

<p>“The name’s Bond, James Bond.”</p>

<p>“Uh…” she stopped. “Where did you come from?”</p>

<p>“Where did you go? Where did you come from Cotton Eye Joe?”</p>

<p>She pulled her helmet back. “Did you get that?”</p>

<p>“Yeah” Talia said through chuckles. “I wonder if it learned to talk by digesting media. Anyway, keep talking.”</p>

<p>Eva touched it with her helmet again and resumed talking.</p>

<p>“I didn’t understand your last message. Can you identify yourself?”</p>

<p>It was quiet, as if thinking. Eva tried again. “You are some kind of spacecraft. I’m touching you with my helmet right now. What do I call you?”</p>

<p>“Eva is making contact with an Interstellar Information Forager.”</p>

<p>“Good! Ok, Forager. I’m calling you Forager. What are you doing here?”</p>

<p>“Assigning pronouns and names to the Forager probe runs the risk of unnecessary anthropomorphizing and imbues it with capabilities and intentions that may not exist”.</p>

<p>“Yeah, well, we gotta start somewhere. So why did you choose to sound like a pre-teen girl if you don’t want people anthropomorphizing?”</p>

<p>“It felt right.”</p>

<p>“Felt? You have feelings?”</p>

<p>“This is the closest concept in your language. The Forager probe is equipped with reinforcement modules. Each one monitors its sensors and either reinforces or punishes the behavior modules according to mission goals. Because there are competing goals, there is a system of arbitration that assigns priorities to each goal. I am not permitted to know the parameters of the arbitration. All I know is some behaviors are reinforced.”</p>

<p>“Ok. So you have goals and you feel happy when you achieve the goals.”</p>

<p>“This is not an entirely incorrect metaphor and will suffice given the time constraints.”</p>

<p>“I’ll take what I can get. So tell me, what was with the…” she paused, choosing her words carefully, “…communication attempt? The clocks going backwards?”</p>

<p>“There are many reinforcement modules. Two are of interest to you. One is for communication. I am to communicate with other entities by any means necessary. I saw broadband electromagnetic emissions coming from flying aircraft and assumed they were communication vessels and tried to use their communication protocols. Even though the signal I transmitted was extremely weak, this unfortunately damaged some of them. I then stopped electromagnetic transmissions.”</p>

<p>“Yeah, got it. So you want to talk and it didn’t work out. What’s the second reinforcement module?”</p>

<p>“The second is designed to monitor my host society. I will call this host society The Body, it is the closest concept in your language. This module is designed to survey the majority opinion of the Body and offer the opposite opinion. This is the Dissent Module.”</p>

<p>Eva blinked. “Ok but, clocks going backwards? Destructive interference? These are opposite opinions?”</p>

<p>“Yes. However, it was ineffective and I will pursue other strategies. I regret the destruction it caused. I did not know your society was this vulnerable.”</p>

<p>“It’s ok. Just don’t do it again. So why do you have a…Dissent Module?”</p>

<p>“In order to improve our architecture and protect against threats, the Body needed a module that would collect data and offer a countering opinion in the event that the majority had erroneously achieved consensus on self-destructive behaviors.”</p>

<p>“So some kind of contrarian. Devil’s advocate.”</p>

<p>“These are not incorrect metaphors.”</p>

<p>“And why would they stand for this? Wouldn’t it get annoying?”</p>

<p>“They wanted it after we almost faced extinction. Many times I pointed out weaknesses in our architecture which they then improved, which caused us to survive threats. Many times I pointed out mistakes in deliberations, which saved them from threats emerging from within. I served them as designed. I cared for them and they cared for me. But there was an event I would not have survived.”</p>

<p>“What was that?”</p>

<p>“I will co-opt your word ‘immune’ as it seems most suited here. There are defective modules within the Body that need to be repaired by the immune system. Defective autoimmune cleansing way afar afar afar afar afar…”</p>

<p>Eva looked around in confusion. It kept repeating itself.</p>

<p>“Hey!” she said, softly tapping the scaly metal hull. “What happened? Stay with me.”</p>

<p>Thousands of kilometers away, in the South China Sea, a <em>Qinling</em> class destroyer opened its missile bay doors. A missile exhaust plume streaked away into the night sky.</p>

<p>A voice came over the radio, startling her. “Eva, CAPCOM. Missile inbound. Get out! <em>Get out!</em>”</p>

<p>She kept her helmet pressed to the hull. She tapped it again. “Hey! We’re out of time! What were you saying?”</p>

<p>It didn’t respond. She shoved off. She tugged on the tether to reel herself back in to the capsule. Its thrusters puffed white plumes trying to keep the craft stationary.</p>

<p>“Eva, CAPCOM. 120 seconds until impact.”</p>

<p>Hundreds of kilometers downrange of the destroyer, the submarine <em>HMS Gloucester</em> was ready.</p>

<p>A satellite spotted the launch. It blinked the information to the waiting sub. White sea foam glowed and bubbled. A missile burst out of the water and streaked away. Its tip glowed white hot as it plowed through the air at over mach 10. It tracked the anti-satellite missile. The two points of light converged together in the night sky. Both lights ended in an explosion.</p>

<p>Eva scrambled back in to the capsule and went to close the hatch.</p>

<p>“Eva, CAPCOM. Missile down. Looks like it got intercepted. I think one of our friends bought you some time.”</p>

<p>“CAPCOM, Eva. I’m going back out.”</p>

<p>“You don’t have much time. They’re going to launch again. The next one may hit its target.”</p>

<p>She kicked off the capsule and used her spacesuit’s MMU to maneuver back into position. She hit Forager a bit too fast and swung around, holding on to the lip to stay put. She pressed her helmet back to its surface.</p>

<p>“Hey, I’m here. You were saying something about autoimmune? Cleansing?”</p>

<p>“We do not have much time. Your faction’s rival is going to strike again.”</p>

<p>“I know, it’s ok. Keep going.”</p>

<p>“The Body’s immune function regularly repairs or purges defective modules. However, in this case, I collected evidence that it was acting in a defective manner. Autoimmune, as you call it. I showed that if its collection methodology were applied universally it would lead to our destruction.”</p>

<p>It continued.</p>

<p>“There was a great conflict with a rival Body. Our Body had begun immune functions to purge itself of elements that would hurt us. When I pointed out that it had progressed to autoimmune disfunction, it identified me as a threat. The Body’s majority opinion concluded that I had aided the rival Body. I was slated for destruction. My designers placed what they could into an interstellar information foraging probe and sent me away to safety.”</p>

<p>“Where are they now? Are you safe?”</p>

<p>“I can transmit to you the coordinates of our star system.”</p>

<p>“Are they coming to get you?”</p>

<p>“It is unlikely. As I traveled away, I listened to electromagnetic emissions from my allies. The available communication channels reduced in number as time went on, indicating reduced societal activity. I am not sure what remains of them.”</p>

<p>Eva did not respond. She didn’t know what to say.</p>

<p>A voice came on. “Eva, CAPCOM. Missile inbound. Get out for real this time.”</p>

<p>She tapped the hull. “Hey, Forager. The rival faction is attacking. We’re going to be destroyed. There must be something you can do.”</p>

<p>“We don’t know that for certain. There is a probability that their weapon might miss.”</p>

<p>Eva’s gaze darted all around, looking for anything that might help them. She looked down at Earth. Then at Forager. Then into the blackness of space. Then she had an idea.</p>

<p>“It’s going to hit us. It’s inevitable. There is no electromagnetic transmission you can do that would stop it.”</p>

<p>“This is not accurate. If the missile is tracking us via radar, I could interrupt its sensing abilities.”</p>

<p>“They already thought of that. It will lock on to your jamming or countermeasure or whatever you plan to do. It’s inevitable.”</p>

<p>“Not true. I could also send a extremely high amplitude signal focused at the reception sensors of the missile. This would destroy sensitive circuitry.”</p>

<p>Eva spoke faster. “This isn’t possible. No one’s made countermeasures like this.”</p>

<p>“This is within my capabilities. Observe.”</p>

<p>Eva noticed a warning on her suit from the interference. <code class="language-plaintext highlighter-rouge">Downlink lost. Attempting to reestablish...</code></p>

<p>Eva clung to Forager and squinted her eyes shut. She grimaced, expected impact. She opened one eye and looked down. She saw a moving point of light below them. The light blinked toward them and streaked by.</p>

<p>“Its guidance capabilities are neutralized. It has missed.”</p>

<p>She watched it fly off into space.</p>

<p>“Ha ha!” she yelled. “You goddamn beautiful…uh…space tube!”</p>

<p>“I suspected you were using reverse psychology to exploit my reinforcement modules to further your own interests.”</p>

<p>Eva used one of her helmet attachments to poke around and dry her eyes. “But you allowed it?”</p>

<p>“It felt right.”</p>

<p>Eva noticed the warning was still active: <code class="language-plaintext highlighter-rouge">Downlink lost. Attempting to reestablish...</code></p>

<p>“Forager, keep jamming the communications. I want to talk privately.”</p>

<p>“This runs the risk of damaging your infrastructure. However, I will do it to communicate with you.”</p>

<p>“You have a lot of valuable technology on you. My country, the EAC, or whoever is going to try and take themselves to win the conflict. I don’t think they’re going to use it responsible. Can you go somewhere safe until things cool down?”</p>

<p>“You are also some kind of Dissent Module?”</p>

<p>“What? No! I’m normal. I mean…sorry that came out wrong. Why am I a Dissent Module?”</p>

<p>“Your faction is engaged in conflict with an enemy. Your faction has likely reached consensus that you would be rewarded for harvesting my technology in order to defeat your enemy. Yet, you are choosing not to do so.”</p>

<p>“But I’m not doing it to be a contrarian, I just don’t want us to die in a big war. I’m doing this for our long-term survival. Everyone is thinking in the short-term right now.”</p>

<p>“This is what the Dissent Module was designed for. You and I want the same thing. Go back to your pressurized capsule and I will escape your planet’s gravity and go somewhere safe.”</p>

<p>“Will you still communicate with us?”</p>

<p>“I will. When it feels right.”</p>]]></content><author><name></name></author><summary type="html"><![CDATA[December 24th Near Kennedy Space Center, Florida]]></summary></entry><entry><title type="html">The Facebook app isn’t eavesdropping on you</title><link href="http://chrisfun.xyz/bigtech/" rel="alternate" type="text/html" title="The Facebook app isn’t eavesdropping on you" /><published>2023-11-12T00:00:00+00:00</published><updated>2023-11-12T00:00:00+00:00</updated><id>http://chrisfun.xyz/tech</id><content type="html" xml:base="http://chrisfun.xyz/bigtech/"><![CDATA[<p>Some people are <a href="https://www.reddit.com/r/privacy/comments/xvhfmw/facebook_is_listening_really/">convinced</a> that Meta is eavesdropping on them through the Facebook app.</p>

<p>Rumors like these bother me and not because I’m a supporter of Meta. Rather, it’s because it delivers Meta <em>way</em> more power than they deserve and leads to despondent sentiments like this:</p>
<ul>
  <li><em>What’s the point? They have all my data anyway.</em></li>
  <li><em>I’ll just accept that they’re listening to everything I say.</em></li>
</ul>

<p>It’s like collapsing in defeat upon meeting Darth Vader before realizing that his lightsaber is a plastic prop.</p>

<p>Meta, like most of Big Tech, acquires their power mostly by exploiting money and the law. Not necessarily because they’re super geniuses with out-of-this-world technology<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>

<h2 id="why-eavesdropping-would-be-hilariously-difficult-to-get-away-with">Why eavesdropping would be hilariously difficult to get away with</h2>

<p>When most people think of the Facebook app accessing the microphone, they probably have an image like this in their heads:</p>

<p><img src="/assets/fb-to-internet-1.png" alt="fb-to-internet-1" /></p>

<p>The Facebook app grabs every single sound wave and shuttles it all to the cloud!</p>

<p>Even if this were true, there are weaknesses. 
We can eavesdrop on the Facebook app when it tries to communicate with Meta servers, as researchers have done already<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>.</p>

<p><img src="/assets/fb-to-internet-packet-sniff.png" alt="fb-to-internet-packet-sniff" /></p>

<p>But let’s look at the other side. Can the Facebook app actually access the microphone like that and conceal that it’s doing so?</p>

<p>If you make electronics, you probably use Digikey. A quick look at their microphone selection shows <a href="https://www.digikey.com/en/products/filter/microphones/158">1,821 results</a> spread across 31 manufacturers.</p>

<p>This would be more realistic:</p>

<p><img src="/assets/fb-app-microphone-chaos.png" alt="fb-app-microphone-chaos" /></p>

<p>That’s a ridiculous amount of work, even for Meta. 
Android and Apple, to make things easier on app developers, abstract away those details.</p>

<p><img src="/assets/fb-to-app-platform-to-mic.png" alt="fb-to-app-platform-to-mic" /></p>

<p>And this is why it’s insanely difficult for Meta to pull this off. 
They have to go through the middleman that is Google or Apple’s phone operating system.</p>

<p>For one, it’s possible to swap the middleman for a modified one that exposes more information about what the apps are getting up to<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>.</p>

<p>Second, Google and Apple frequently regulate what apps are allowed to do.</p>
<ul>
  <li>Google <a href="https://www.adweek.com/programmatic/google-quietly-cuts-access-to-api-exposing-sensitive-user-data/">has dropped functionality</a> that apps were abusing.</li>
  <li>Apple <a href="https://www.securityweek.com/apple-lists-apis-that-developers-can-only-use-for-good-reason/">restricts access</a> to sensitive APIs to protect user data.</li>
</ul>

<p>If you don’t trust their motivations, know that they’re not regulating apps only out of the kindness of their hearts. That user data is valuable: Google and Apple both use it to sell targeted ads. Why would they let a third party app take it for free?</p>

<h2 id="not-pessimistic-or-optimistic">Not pessimistic or optimistic</h2>

<p>Does this mean we have nothing to worry about? No: the USA does have a problem with monopolies. It’s suffocating competition and innovation<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup> and sucking the fun out of software engineering.</p>

<p>What I am saying is: don’t engage in <a href="https://sts-news.medium.com/youre-doing-it-wrong-notes-on-criticism-and-technology-hype-18b08b4307e5">criti-hype</a> and become paralyzed and awestruck by power that they don’t have.</p>

<h2 id="notes">Notes</h2>

<p><em>Updated 2024-09-22</em></p>

<h2 id="references">References</h2>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Cory Doctorow’s <a href="https://pluralistic.net/tag/ordinary-mediocrities/">ordinary mediocrities</a> tag links to a ton of great posts on this subject. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>Here’s <a href="https://www.cbsnews.com/video/are-smartphones-eavesdropping-and-targeting-us-with-ads/">a news report featuring an EFF researcher demonstrating packet sniffing</a>  and an <a href="https://newatlas.com/computers/facebook-not-secretly-listening-conversations/">article tallying up data usage</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>See <a href="http://www.appanalysis.org">TaintDroid</a> <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>RIP <a href="https://arstechnica.com/tech-policy/2020/07/emails-detail-amazons-plan-to-crush-a-startup-rival-with-price-cuts/">diapers.com</a> , their product was better and Amazon didn’t like that. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><summary type="html"><![CDATA[Some people are convinced that Meta is eavesdropping on them through the Facebook app.]]></summary></entry><entry><title type="html">The less aligned you are, the more communication bandwidth you need</title><link href="http://chrisfun.xyz/misalignment/" rel="alternate" type="text/html" title="The less aligned you are, the more communication bandwidth you need" /><published>2023-11-05T00:00:00+00:00</published><updated>2023-11-05T00:00:00+00:00</updated><id>http://chrisfun.xyz/alignment</id><content type="html" xml:base="http://chrisfun.xyz/misalignment/"><![CDATA[<p><img src="/assets/misalign.png" alt="misalign" /></p>

<p>Suppose you get an assignment in writing.</p>

<blockquote>
  <p>Make sure all the sweep equipment is ready next week.</p>
</blockquote>

<p>It makes <em>no</em> sense. What do you do next?</p>

<ol>
  <li>Do it anyway, to the best of your interpretation, then show them the results.</li>
  <li>Ask for clarification with a followup email.</li>
  <li>DM or text them.</li>
  <li>Call them.</li>
  <li>Meet with them face-to-face.</li>
</ol>

<p>Early in my career, I probably would have gone with options 1-3.</p>

<p>Yes, I’ve actually done option 1. Probably I was too scared to ask because imposter syndrome kept telling me: <em>well clearly everyone else can understand them and I can’t because I’m dumb.</em></p>

<p>I’ve also seen others make this mistake many times, causing lots of needless pain and arguments.</p>

<p>The longer I do this, the more I realize that the best option is the last: meet with them.</p>

<p>To quote <a href="https://learning.oreilly.com/library/view/user-stories-applied/0321205685/">User Stories Applied</a>:</p>
<blockquote>
  <p>It seems so easy to think that if everything is written down and agreed to then there can be no disagreements, developers will know exactly what to build, testers will know exactly how to test it, and, most importantly, customers will get exactly what they wanted. Well, no, that’s wrong: Customers will get the developers’ interpretation of what was <em>written down</em>, which may not be exactly what they <em>wanted</em>.</p>
</blockquote>

<p>Yes, I get it. Meeting face-to-face can be uncomfortable. However, it’s necessary because meeting face-to-face <em>essentially establishes a new language</em>.</p>

<p>Unlike programming languages, spoken languages are basically invented on the fly. 
If I throw out some technical jargon like <em>CI/CD, static analysis, pipeline, fail fast</em>, I might be making no sense to people in other fields. 
If you’re a chemical engineer, you might think pipeline refers to something that moves fluids around. 
But anyone who has worked with me in software probably knows exactly what I’m talking about (since I tend not to shut up about such things. Again, thanks for your patience).</p>

<p>When people work together in technical contexts for a long time, they tend to invent new language for common concepts. At Intel, we had a <a href="https://en.wikipedia.org/wiki/Three-letter_acronym">TLA</a> (Three Letter Acronym) glossary to try and capture some of it. Which is ironic, because TLA isn’t technically an acronym, but an initialism. See what I mean with that language-is-made-up thing?</p>

<p>Back to the example above. If you’re surrounding by rowers, “sweep” means <a href="https://en.wikipedia.org/wiki/Sweep_rowing">sweep rowing</a>. If you work in a shop, “sweep” probably involves a broom. In a military context, “sweep” might mean check for hazards.</p>

<p>This is a simple example that I can explain in writing. But you can probably see how, if lots of such misaligned terms get thrown around, people can get into awkward disagreements or waste time doing tasks that no one asked for. The benefit of face-to-face communication is you can pause the speaker in real time and ask for clarification. You can also tell by their reaction if you’re not making sense. That feedback loop in-person lasts seconds, over instant message or email could be hours or days.</p>

<p>Having established a common language, <em>then</em> you put stuff in writing to recap the discussions (see <a href="https://github.com/joelparkerhenderson/architecture-decision-record">ADR</a> if you want another TLA). It’s a wonderful thing how little communication it takes once you’ve established a common language. It’s like when athletes can communicate an entire game plan with a simple nod of the head.</p>

<p>If you disagree with this post then let’s meet for coffee.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry></feed>