<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>lyall.co</title>
    <subtitle>Occasional writing about software, tools, and living in Japan.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://lyall.co/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://lyall.co"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-08-02T00:00:00+00:00</updated>
    <id>https://lyall.co/atom.xml</id>
    <entry xml:lang="en">
        <title>Prove You Care (Write the Docs)</title>
        <published>2026-08-02T00:00:00+00:00</published>
        <updated>2026-08-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lyall.co/write-the-docs/"/>
        <id>https://lyall.co/write-the-docs/</id>
        
        <content type="html" xml:base="https://lyall.co/write-the-docs/">&lt;p&gt;For better or worse, &lt;em&gt;other-than-human&lt;&#x2F;em&gt;-authored code looks here to stay.
Personally, I&#x27;m okay using and even &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;justif.lyall.co&quot;&gt;creating&lt;&#x2F;a&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;magritte.lyall.co&quot;&gt;software&lt;&#x2F;a&gt; whose code was written by LLMs.
Programming languages, by their very nature, are intended for computer
consumption.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; So there&#x27;s a certain level of appositeness in code written for
and by computers.&lt;&#x2F;p&gt;
&lt;p&gt;Moreover, code can be measured and tested objectively. You can define an
arbitrary target—functionality, performance, correctness—and generally determine
whether a program meets it or not.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; Code does have characteristics that are
harder to measure—beauty, elegance, style—but those are generally secondary to
whether the program performs correctly.&lt;&#x2F;p&gt;
&lt;p&gt;Documentation inverts this. It has some attributes that can be measured
more easily, such as coverage or being up to date. But the most important part
of documentation is &lt;em&gt;communicating ideas effectively&lt;&#x2F;em&gt;, and that&#x27;s a lot harder to
measure.&lt;&#x2F;p&gt;
&lt;p&gt;Documentation is also still intended for human consumption. Maybe a function
docstring can get by purely stating the facts, but a project README needs to
provide context, build trust, and educate. All while guessing the reader&#x27;s
background and state of mind. Today&#x27;s frontier models can produce passable
writing, but still will veer into dense, jargon-filled tangents at a moment&#x27;s
notice, and they do a poor job of understanding a potential reader&#x27;s mindset and
providing appropriate context.&lt;&#x2F;p&gt;
&lt;p&gt;When an LLM writes your documentation wholesale, you&#x27;re signaling that you don&#x27;t
care about the humans on the other end. You don&#x27;t care about communicating ideas
to them effectively. You don&#x27;t value their time and effort.&lt;&#x2F;p&gt;
&lt;p&gt;If you want some human engagement, put in some human effort.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Programming languages are, of course, also intended for human consumption.
But that&#x27;s more a byproduct of necessity during program creation rather than
its inherent purpose. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;It&#x27;s not always easy though! &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Careful Communication</title>
        <published>2025-08-17T00:00:00+00:00</published>
        <updated>2025-08-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lyall.co/careful-communication/"/>
        <id>https://lyall.co/careful-communication/</id>
        
        <content type="html" xml:base="https://lyall.co/careful-communication/">&lt;p&gt;I got a massage recently. And as I was lying there and relaxing, my attention came to the music softly playing in the background. It was R&amp;amp;B-flavored, chill, slightly lo-fi and distinctly generic.&lt;&#x2F;p&gt;
&lt;p&gt;With each song coming and going, and with nothing else to focus on, I start noticing some strange patterns. The songs are similar enough to be from a single album, but the vocalists sound like a different person on each track. Some songs suddenly go from featuring zero guitar to guitar solo. Then as quickly as the guitar solo came it goes and the whole song starts fades to a close. The lyrics are very same-y, with small portions even repeated verbatim across different tracks.&lt;&#x2F;p&gt;
&lt;p&gt;But overall the music was not unpleasant. Frankly I was glad that the place wasn&#x27;t playing the same ten C-tier pop song covers that they usually play on an endless loop.&lt;&#x2F;p&gt;
&lt;p&gt;Not unpleasant as it was, I couldn&#x27;t shake the feeling of a distinct lack of care in the creation of the music. Whoever made it didn&#x27;t care that the lyrics were repeated from one track to the next. They didn&#x27;t care if a guitar solo didn&#x27;t fit with the rest of the song. They did care about the general vibe and quantity, however.&lt;&#x2F;p&gt;
&lt;p&gt;On my way out I Shazam’d the currently playing track, only to find that the artist was &quot;AI MUSIC MATRIX&quot;. Who, from a brief search, appears to be a Japanese guy making this stuff with a combination of ChatGPT, Claude and Suno, and apparently quite successfully based on his engagement stats.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; Maybe you saw it coming, but I was somewhat surprised to actually encounter AI music in the wild.&lt;&#x2F;p&gt;
&lt;p&gt;The experience made me reflect on care—specifically on what we choose to care about. Choosing to care about music&#x27;s vibe and quantity over artistic expression or craftsmanship isn&#x27;t an inherently invalid or wrong choice. But it is a selfish one, I think.&lt;&#x2F;p&gt;
&lt;p&gt;Creation is the most powerful tool for communication that we have. Music, writing, art, software… it all communicates something to those that experience it. If you devote your time and energy and self into something—a song, a piece of writing, an app—that artifact forever communicates that you care. You cared enough about the people who experience and interact with it in the future to put in the dedication to create it.&lt;&#x2F;p&gt;
&lt;p&gt;So what do you communicate when you have AI write your email, write your app, write your song? That you don’t care. You don’t care about the person on the other end to put the time in yourself. You do care about yourself, about saving your own time and energy. But not about them.&lt;&#x2F;p&gt;
&lt;p&gt;AI is undoubtedly a powerful tool, but to what end? Do we use it as a tool of convenience to enable our laziest and most selfish impulses? Or do we use it to achieve new heights of craftsmanship, of expression, of care for our fellow human beings?&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Please don&#x27;t take this as an indictment of this artist in particular. Maybe AI has unlocked a new level of self-expression that wasn&#x27;t accessible to them before. I simply share the anecdote as the catalyst for making me think about the topic. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Japan Payments Musings</title>
        <published>2022-07-22T00:00:00+00:00</published>
        <updated>2022-07-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lyall.co/japan-payment-musings/"/>
        <id>https://lyall.co/japan-payment-musings/</id>
        
        <summary type="html">&lt;p&gt;I&#x27;ve been living in Tokyo for almost three months now. Combine that with my elementary schooler level Japanese literacy and I&#x27;ve basically become an expert on the Japanese payments landscape. Lack of expertise notwithstanding, here are a few things I&#x27;ve noticed so far that have surprised, delighted and confused me, sometimes all at the same time.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Super Fast &lt;code&gt;git status&lt;&#x2F;code&gt;</title>
        <published>2022-06-28T00:00:00+00:00</published>
        <updated>2022-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lyall.co/even-faster-git-status/"/>
        <id>https://lyall.co/even-faster-git-status/</id>
        
        <content type="html" xml:base="https://lyall.co/even-faster-git-status/">&lt;div class=&quot;callout&quot;&gt;
  &lt;p&gt;This is a follow up to &lt;a href=&quot;https:&#x2F;&#x2F;lyall.co&#x2F;faster-git-status&#x2F;&quot;&gt;part one&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;p&gt;For a while, git has supported an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;githooks#_fsmonitor_watchman&quot;&gt;fsmonitor hook&lt;&#x2F;a&gt; to allow running a process like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;facebook.github.io&#x2F;watchman&#x2F;&quot;&gt;watchman&lt;&#x2F;a&gt; in the background to, well, watch for changes to files in the repo and report them back to git when they happen instead of git waiting to look for changes all at once after you call the &lt;code&gt;status&lt;&#x2F;code&gt; command (like a sucker).&lt;&#x2F;p&gt;
&lt;p&gt;This was great in theory, but I had two problems with it when I tried it. First of all, setting it up was annoying! You had to decide which watchman-like tool to install, write (ok, copy and paste) a git hook to call it correctly and hope that you didn&#x27;t break anything else along the way.&lt;&#x2F;p&gt;
&lt;p&gt;Second of all, and more importantly, it didn&#x27;t make things any faster! I timed running &lt;code&gt;git status&lt;&#x2F;code&gt; with and without the hook enabled, and never found much of an improvement. This was disappointing as I&#x27;d read everywhere how it was supposed to speed things up greatly.&lt;&#x2F;p&gt;
&lt;p&gt;However today I stumbled back upon git&#x27;s fsmonitor settings and found out that a new version of git was released &lt;em&gt;today&lt;&#x2F;em&gt; &lt;small&gt;(2022-06-27)&lt;&#x2F;small&gt;—version 2.37.0—that includes &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.blog&#x2F;2022-06-27-highlights-from-git-2-37&#x2F;#a-builtin-filesystem-monitor-for-windows-and-macos&quot;&gt;a built in fsmonitor daemon&lt;&#x2F;a&gt;, meaning that watchman and an fsmonitor hook are no longer needed to get the same behavior. I decided to give it a go by updating my git config:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;git&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; config&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt;-global&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; core.fsmonitor&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I then ran &lt;code&gt;git status&lt;&#x2F;code&gt; in my very large repo of choice once to get the daemon started, then again and &lt;em&gt;wtf... it returned almost instantly?&lt;&#x2F;em&gt; Doing the usual benchmarking confirmed it, &lt;code&gt;git status&lt;&#x2F;code&gt; now returned just 84ms.&lt;&#x2F;p&gt;
&lt;p&gt;Remembering my previous failure to squeeze much performance out of using an fsmonitor, I wondering if this huge improvement was because of it being built in to git or because of something else, so I decided to test the three untracked file modes of &lt;code&gt;git status&lt;&#x2F;code&gt; with and without the fsmonitor enabled.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: right&quot;&gt;untracked files&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;em&gt;without&lt;&#x2F;em&gt; fsmonitor&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: center&quot;&gt;&lt;em&gt;with&lt;&#x2F;em&gt; fsmonitor&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;no&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;179ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;45ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;normal&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;279ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;84ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;code&gt;all&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;966ms&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: center&quot;&gt;827ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want a great visual comparison of what this kind of difference in latency looks like, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;Piwai&#x2F;status&#x2F;1483091025228746755&quot;&gt;check this out from @Piwai&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;So it turns out that whatever the &lt;code&gt;all&lt;&#x2F;code&gt; mode is doing under the hood must be cancelling out most of the speed gains from having the fsmonitor enabled, which explains why I never had great results with it in the past, since &lt;code&gt;all&lt;&#x2F;code&gt; was enabled as the default!&lt;&#x2F;p&gt;
&lt;p&gt;Try it out and see if it helps in your local mongo repo.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Make &lt;code&gt;git status&lt;&#x2F;code&gt; Faster with this One Weird Trick!</title>
        <published>2022-06-27T00:00:00+00:00</published>
        <updated>2022-06-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://lyall.co/faster-git-status/"/>
        <id>https://lyall.co/faster-git-status/</id>
        
        <content type="html" xml:base="https://lyall.co/faster-git-status/">&lt;p&gt;Many of us toil away in large git repos, spending countless seconds every day waiting for &lt;code&gt;git status&lt;&#x2F;code&gt; to return to us its precious information deep from within the bowels of git tree itself.&lt;&#x2F;p&gt;
&lt;p&gt;Much work has gone into git over the years to improve its performance in large repos. By my own measurements, on a fancy new M1 MacBook &lt;code&gt;git status&lt;&#x2F;code&gt; runs in a tolerable but sluggish 960ms at its fastest, but sometimes takes twice as long.&lt;&#x2F;p&gt;
&lt;p&gt;For a while I&#x27;d known about a way to make &lt;code&gt;git status&lt;&#x2F;code&gt; run quickly for times when you&#x27;re feeling especially impatient—by telling it to ignore untracked (new to the repo) files with the with the &lt;code&gt;--untracked-files=no&lt;&#x2F;code&gt; flag, or &lt;code&gt;--uno&lt;&#x2F;code&gt; for short. With this flag we only have to wait 190ms for that sweet, sweet output. However, setting this as the default didn&#x27;t work for me, as I was prone to forgetting that I&#x27;d created a new file and forget to add it into a commit, so I was stuck waiting a whole second still.&lt;&#x2F;p&gt;
&lt;p&gt;Git supports two other modes for the untracked files flag: &lt;code&gt;normal&lt;&#x2F;code&gt; and &lt;code&gt;all&lt;&#x2F;code&gt;, with normal being the default (surprise!).&lt;&#x2F;p&gt;
&lt;p&gt;Curious, I decided to compare the performance of all three modes in a large work repo, and got the following results:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git status -uno     190ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git status -unormal 290ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git status -uall    960ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;div class=&quot;smallout&quot;&gt;
  &lt;p&gt;&lt;em&gt;NB: benchmarks performed with &lt;code&gt;hyperfine&lt;&#x2F;code&gt; and don&#x27;t represent worst case performance due to warmups, etc.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
&lt;p&gt;I was surprised by two things here. First that &lt;code&gt;normal&lt;&#x2F;code&gt; was only 100ms slower than the speedy &lt;code&gt;no&lt;&#x2F;code&gt; option, and second that the speed of &lt;code&gt;git status -uall&lt;&#x2F;code&gt; was the same as un-flagged &lt;code&gt;git status&lt;&#x2F;code&gt;... &lt;em&gt;hold on&lt;&#x2F;em&gt;, I thought, &lt;em&gt;we&#x27;re using the slow option as the default?! &lt;small&gt;In this economy??&lt;&#x2F;small&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Yes, it turns out, by default everyone at my company&#x27;s &lt;code&gt;.gitconfig&lt;&#x2F;code&gt; file contains the following:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[status]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  showUntrackedFiles = all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So by deleting the offending line (or changing it to &lt;code&gt;normal&lt;&#x2F;code&gt;), we can reap a 3.3x speed boost to &lt;code&gt;git status&lt;&#x2F;code&gt; without sacrificing knowing if we&#x27;ve got untracked changes to worry about.&lt;&#x2F;p&gt;
&lt;p&gt;What exactly is the difference in the output between &lt;code&gt;normal&lt;&#x2F;code&gt; and &lt;code&gt;all&lt;&#x2F;code&gt; though? Like its name implies, &lt;code&gt;all&lt;&#x2F;code&gt; shows all untracked files, with their full paths, while normal will just show the directories containing any changed files but not the files themselves. Sounds like an acceptable tradeoff to me.&lt;&#x2F;p&gt;
&lt;p&gt;Tell your friends—together we can take back entire minutes of lost productivity.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bonus-tip&quot;&gt;Bonus tip!&lt;&#x2F;h3&gt;
&lt;p&gt;You can claw back another couple milliseconds but really just get pithier &lt;code&gt;status&lt;&#x2F;code&gt; output with the &lt;code&gt;--short&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;status.short&lt;&#x2F;code&gt; flag&#x2F;config value.&lt;&#x2F;p&gt;
&lt;div class=&quot;callout&quot;&gt;
  &lt;p&gt;The saga continues in &lt;a href=&quot;https:&#x2F;&#x2F;lyall.co&#x2F;even-faster-git-status&#x2F;&quot;&gt;part two&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;&#x2F;div&gt;
</content>
        
    </entry>
</feed>
