<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The 418]]></title><description><![CDATA[I'm a teapot.

Thoughts on software engineering, startups, and making things. 🫖]]></description><link>https://the418.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!4G9X!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa686ef2c-bd73-4e5b-a40e-4b5a98706864_400x400.png</url><title>The 418</title><link>https://the418.substack.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 05 Jun 2026 00:09:57 GMT</lastBuildDate><atom:link href="https://the418.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Shayne O’Sullivan]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[the418@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[the418@substack.com]]></itunes:email><itunes:name><![CDATA[Shayne O’Sullivan]]></itunes:name></itunes:owner><itunes:author><![CDATA[Shayne O’Sullivan]]></itunes:author><googleplay:owner><![CDATA[the418@substack.com]]></googleplay:owner><googleplay:email><![CDATA[the418@substack.com]]></googleplay:email><googleplay:author><![CDATA[Shayne O’Sullivan]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[A Bug in the Mail]]></title><description><![CDATA[Occasionally USPS sends me pictures of other people's mail.]]></description><link>https://the418.substack.com/p/a-bug-in-the-mail</link><guid isPermaLink="false">https://the418.substack.com/p/a-bug-in-the-mail</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Mon, 21 Jul 2025 14:53:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AfxC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been using <a href="https://www.usps.com/manage/informed-delivery.htm">Informed Delivery</a> from USPS for over 5 years now, and am generally a big fan. However, I&#8217;ve noticed that every once in a while I&#8217;ll catch a scan of a piece of mail that is not addressed to me. Here is an example of the most recent. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AfxC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AfxC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 424w, https://substackcdn.com/image/fetch/$s_!AfxC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 848w, https://substackcdn.com/image/fetch/$s_!AfxC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!AfxC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AfxC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png" width="1456" height="879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:879,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:730562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://the418.substack.com/i/168862864?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AfxC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 424w, https://substackcdn.com/image/fetch/$s_!AfxC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 848w, https://substackcdn.com/image/fetch/$s_!AfxC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 1272w, https://substackcdn.com/image/fetch/$s_!AfxC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34e3b7e-1572-4aa1-beec-2ae0a2cb6c11_1710x1032.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Notice, the image contains 2 pieces of mail. The one in back is addressed to me, and I assume I&#8217;ll receive it later today. The one in front is addressed to some unknown neighbor in my zip code.</p><p>As a security conscious software developer, this kind of &#8220;leak&#8221; sticks out. And while it&#8217;s probably not the biggest deal, I find it interesting that USPS sends me pictures of other people&#8217;s mail, and almost certainly sends pictures of my mail to my neighbors every now and again.</p>]]></content:encoded></item><item><title><![CDATA[It's time to listen]]></title><description><![CDATA[Developers and developer adjacent professionals have been pushing around their non-techie colleagues for far too long.]]></description><link>https://the418.substack.com/p/its-time-to-listen</link><guid isPermaLink="false">https://the418.substack.com/p/its-time-to-listen</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Tue, 01 Jul 2025 15:06:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4G9X!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa686ef2c-bd73-4e5b-a40e-4b5a98706864_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Developers and developer adjacent professionals have been pushing around their non-techie colleagues for far too long. We brazenly spout off technical jargon to make work seem harder than it is, and then look down on those who cared enough to even ask for an improvement.</p><p>This attitude is catching up with us, as our colleagues cheer on vibe-coding AI tools&#8230; security, scalability, and architecture be damned!</p><p>As for me, I&#8217;m happy that the reckoning has come.</p><p>It&#8217;s time to stop doubling estimates, and derailing timelines over minor changes. It&#8217;s time to stop belittling the folks trying to use your software to get something done. It&#8217;s time for software to be good, and for software projects to be done well.</p><p>The best part of being a developer is that it lets you sink your teeth into problem spaces that have nothing to do with writing code. We build software for everything, so we have to learn about everything. That&#8217;s hard, but it&#8217;s our job. The best way to to that is to listen. Learn from the sages who know nothing about DB schemas, but everything about dental x-rays, or payment reconciliation, or compliance reporting, or whatever.</p><p>It&#8217;s time to listen.</p>]]></content:encoded></item><item><title><![CDATA[Chase the Repro!]]></title><description><![CDATA[Strategies for debugging via reproductions.]]></description><link>https://the418.substack.com/p/chase-the-repro</link><guid isPermaLink="false">https://the418.substack.com/p/chase-the-repro</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Fri, 28 Mar 2025 14:50:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa686ef2c-bd73-4e5b-a40e-4b5a98706864_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you work in a code base for long enough, you&#8217;re bound to encounter some real head-scratcher bugs. The best technique I&#8217;ve found for diagnosing, and ultimately fixing tricky bugs is to create a reproduction.</p><h2>Reproductions can be hard</h2><p>Let&#8217;s talk about why.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The 418! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>There are a lot of variables in play when trying to repro an issue. Obviously you can&#8217;t simulate the entire universe exactly the way it was when the user encountered the problem, so it takes a bit of artistry to home in on the variables you want to emulate for your repro. In general you can start with a <em>vaguely similar</em> environment, and then match the real environment more tightly until:</p><p>A) You achieve the reproduction.</p><p>B) Simulating environment conditions in your repro stops giving you useful information about the nature of the bug.</p><h2>Reproduction strategies</h2><p>Again, this is more of an art that a science. Your system, your tech stack, and the nature of the bug will all influence how you create a repro. Here are a few flavors that I find useful.</p><h3>YOLO - Repro on prod (maybe)</h3><p>As long as the bug isn&#8217;t doing harm (compromising data, bringing down the system, creating more cleanup for the team) it may be fine to just try doing what the user did right on production&#8230; assuming you have a production account where it&#8217;s okay for whatever the repro action is to either succeed or fail. If you are an HRIS software, you probably don&#8217;t want to repro a salary change on prod&#8230; but if you are a screenshot saas, it&#8217;s probably fine?</p><h3>Mimic the user</h3><p>Repeat the steps they took to expose the bug. But also, mimic their system variables&#8230;</p><ul><li><p>use the same browser as them</p></li><li><p>make your account preferences match theirs</p></li><li><p>give yourself the same permissions as them</p></li></ul><h3>Non-prod environments</h3><p>Not all repros should be done on prod. While QA and ops teams all long for pre-prod environments that replicate production, it&#8217;s often the case that pre-prod envs are leaner or, at the very least, less trafficked.</p><p>In high-throughput systems, this can have a big impact, especially when dealing with recursion, concurrency, batching, or latency sensitive areas of your system.</p><h4>Mimic prod load.</h4><p>When mimicking the user&#8217;s actions and account state don&#8217;t produce a repro, a good next step is to look at load conditions of the system. Load can be tied directly to the user (the have 10x the volume of records than normal users), or it can be ephemeral (the bug happens at peak traffic time in a multi-tenant environment). In these cases, scripting and unit testing can really help. Write a script that inserts a bunch of records or hammers your service with traffic, then run your reproduction and see what happens.</p><h2>Write a test</h2><p>I&#8217;m not dogmatic when it comes to writing tests, but I find that they really shine for reproductions. Writing a test has the great side effect of expressly documenting the desired behavior. Ideally you can write the test, and see it fail while the bug still exists. <strong>This is reproduction!</strong> Once you patch the code and the test passes, you (probably) have a real fix.</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The 418! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Diary of Boring Things]]></title><description><![CDATA[Inspiration to start a mundane journaling habit.]]></description><link>https://the418.substack.com/p/diary-of-boring-things</link><guid isPermaLink="false">https://the418.substack.com/p/diary-of-boring-things</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Wed, 26 Mar 2025 03:40:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eJpS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Getting inspired</h3><p>I love reading history, biographies in particular. When reading a biograpgy I often find myself taken aback at how much self-documenting these historical figures had time to do. Now, I understand that before the internet, and well&#8230; much of modernity, there simply wasn&#8217;t as much stuff to occupy ones time. And perhaps it&#8217;s reasonable to expect that the diary entries of yesteryear will be replaced by the email correspondence, tweets, blog posts, and innumerable  digital artifacts that spew from the lives of today&#8217;s important figures.</p><p>My favorite thing about these historical diaries is that they are remarkably <strong>boring</strong>. For every momentous entry there seem to be 10 or even 100 &#8220;Good weather for plowing today&#8221;. Truly mundane stuff, and yet it reveals just how critical a part the <em>rhythm</em> of journaling plays when it comes to drawing any substance out of the habit.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The 418 is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>There is a 3rd category of entries that give me hope on my quest to be a habitual journaler. These are the ones that seem like mere humdrum at the time, but end up providing crucial context for important events/timelines/decisions after the fact.</p><h3>Getting started</h3><p>For a while I had been feeling like I should start journaling. Then I was gifted a <a href="https://a.co/d/h17gSuu">Fisher Space Pen</a> (this is not an affiliate link, I just like the pen!) and a perfect size leather-bound journal at Christmas. And so my journaling career began.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eJpS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eJpS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eJpS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eJpS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eJpS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eJpS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg" width="1456" height="1640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1640,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1739135,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://the418.substack.com/i/150529912?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eJpS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eJpS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eJpS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eJpS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e07098c-8534-4725-8121-5d464aac8980_2779x3130.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>3 months in</h3><p>Journaling has been a net positive. It helps me clarify thoughts, and convert memories/emotions/thoughts to a sort of &#8220;cold storage&#8221;, when they might otherwise get evicted from a LRU &#8220;hot path&#8221; cache.</p><p>However &#8212; I don&#8217;t think I&#8217;ve quite reached &#8220;peak boring&#8221; in my entries. I find myself more likely to journal to make &#8220;reactionary&#8221; entries&#8230; where I write because I&#8217;m inspired to by something that happened. Progress for sure, but as I&#8217;ve observed in the great diaries of history, a wider net can yield some delightful yet unexpected treasures.</p><h3>More boring</h3><p>My goal is to get better at journaling even when nothing spurs me to do so. In fact, I think the mundane days are the ones most likely to benefit from a bit of reflection. It&#8217;s easy to think that I know when the important stuff is happening, but I think that strengthening my boring-journal muscle can help recalibrate my relevancy meter to a broader arc of importance&#8230; and that seems like wisdom.</p><h3></h3><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The 418 is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Daobeam]]></title><description><![CDATA[A love letter to my favorite editor theme]]></description><link>https://the418.substack.com/p/daobeam</link><guid isPermaLink="false">https://the418.substack.com/p/daobeam</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Wed, 10 Jul 2024 03:57:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The sweet taste of a unit test moving from angry &#10060; to glorious &#9989; in a smooth field of  green asserts like a row of fruit trees blooming neatly in your terminal.</p><p>The temporary vanquishing of imposter syndrome when you read the bug report, then the source code, and commit a fix with the confidence of the most seasoned sage.</p><p>The warmth of logs flickering while traffic spikes on some service you authored, and nothing is burning down or falling over. So you just watch the patterns in the wall of text, as they rise like exhaust from purring engine.</p><div><hr></div><p>These moments bind us to our craft. They transform us from laborers to artisans. They spur us towards the endless programmer tasks&#8230; mastering tools, memorizing shortcuts, and meticulously tweaking setups.</p><p>It&#8217;s in pursuit of these that I boldly claim that:</p><h3><strong><a href="https://marketplace.visualstudio.com/items?itemName=mike-flanigan.Daobeam">Daobeam</a> is the GOAT editor theme.</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_aju!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_aju!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 424w, https://substackcdn.com/image/fetch/$s_!_aju!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 848w, https://substackcdn.com/image/fetch/$s_!_aju!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 1272w, https://substackcdn.com/image/fetch/$s_!_aju!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_aju!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png" width="506" height="283.1304347826087" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:592,&quot;width&quot;:1058,&quot;resizeWidth&quot;:506,&quot;bytes&quot;:97091,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_aju!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 424w, https://substackcdn.com/image/fetch/$s_!_aju!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 848w, https://substackcdn.com/image/fetch/$s_!_aju!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 1272w, https://substackcdn.com/image/fetch/$s_!_aju!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0170d55b-8f90-4688-96a9-24f5fd6395b9_1058x592.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Here&#8217;s a little taste of Daobeam in action.</figcaption></figure></div><p>It&#8217;s easy on the eyes, unwavering in its philosophy, and ruthless in its pragmatism.</p><p>If you care more about quality software than you do about looking cool, you should give it a shot.</p><p>And if you want to really spice things up,  try Daobeam&#8217;ing your editor even further with this extended vscode config:</p><pre><code>{
&#9;"workbench.colorCustomizations": {
&#9;&#9;"[Daobeam]": {
&#9;&#9;&#9;"statusBar.background": "#E0DBC7",
&#9;&#9;&#9;"statusBar.border": "#171717",
&#9;&#9;&#9;"statusBar.foreground": "#171717",
&#9;&#9;&#9;"button.background": "#666666"
&#9;&#9;}
&#9;}
}</code></pre><div><hr></div><h3>Daobeam Everything</h3><p>Once your eyes have feasted on the sepia goodness of a Daobeam themed editor, you&#8217;ll want to inject Daobeam into many more of your applications. Here are some configs you can use to do just that:</p><h4>Warp Terminal</h4><pre><code>accent:
  left: "#2aa198"
  right: "#268bd2"
background: "#E0DBC7"
details: lighter
foreground: "#171717"
terminal_colors:
  bright:
    black: "#002b36"
    blue: "#839496"
    cyan: "#93a1a1"
    green: "#009100"
    magenta: "#6c71c4"
    red: "#cb4b16"
    white: "#fdf6e3"
    yellow: "#B95C00"
  normal:
    black: "#171717"
    blue: "#268bd2"
    cyan: "#2aa198"
    green: "#005800"
    magenta: "#d33682"
    red: "#dc322f"
    white: "#eee8d5"
    yellow: "#b58900"</code></pre><h4>Slack</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LawJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LawJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 424w, https://substackcdn.com/image/fetch/$s_!LawJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 848w, https://substackcdn.com/image/fetch/$s_!LawJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!LawJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LawJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png" width="1110" height="1058" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1058,&quot;width&quot;:1110,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146835,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LawJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 424w, https://substackcdn.com/image/fetch/$s_!LawJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 848w, https://substackcdn.com/image/fetch/$s_!LawJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 1272w, https://substackcdn.com/image/fetch/$s_!LawJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F130d8baf-a847-4d0f-9f57-4c5ed23f5b9a_1110x1058.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Firefox</h4><p>Daobeam in the browser? Heck yes! Get the color theme here: <a href="https://color.firefox.com/?theme=XQAAAAIpAQAAAAAAAABBKYhm849SCia3ftKEGccwS-xMDPsqudKqWr5JD8t00DQReaMsiUS6T7__C4fz0sl75Xwm7Z6f7Vwedz531fvl5f6dbWiFWBZANDI4KgtrmHK266Yb60Q-CdwG5LpW9piKH5W_9xkvXVhZ-0Ru-REtIDhwKGXwKJ2CorDQsoA1eak0ZWiZSXXVbZaX1hf5pbif18suCoHpmD-XVURWEBBhAzrn_95TJwA">link</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cxXr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cxXr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 424w, https://substackcdn.com/image/fetch/$s_!cxXr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 848w, https://substackcdn.com/image/fetch/$s_!cxXr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 1272w, https://substackcdn.com/image/fetch/$s_!cxXr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cxXr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png" width="1456" height="1181" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1181,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:242791,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cxXr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 424w, https://substackcdn.com/image/fetch/$s_!cxXr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 848w, https://substackcdn.com/image/fetch/$s_!cxXr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 1272w, https://substackcdn.com/image/fetch/$s_!cxXr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde377715-3a11-4c1f-8acb-0e07906e63bd_2254x1828.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Cutting Paths]]></title><description><![CDATA[What high leverage work for senior engineers should look like.]]></description><link>https://the418.substack.com/p/cutting-paths</link><guid isPermaLink="false">https://the418.substack.com/p/cutting-paths</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Wed, 12 Jun 2024 03:06:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2f3737b5-2d27-4a03-81d3-396f08c5009d_3645x1765.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tqsl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tqsl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Tqsl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Tqsl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Tqsl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tqsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg" width="1456" height="705" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:705,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2668817,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Tqsl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Tqsl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Tqsl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Tqsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6728f164-f118-473e-bfbe-20b62d27a7fb_3645x1765.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For a few summers in my teens, I worked on a landscape construction crew run by a family friend. The work was honest, hard, and paid better than most summer jobs that one could find in the <a href="https://www.discovernewport.org/">tourist town</a> I grew up in. As the youngest crew member (usually by a decade or 2), I knew hardly any of the &#8220;tricks of the trade&#8221; that the professional crew regularly employed to get work done quicker and with less labor.</p><p>This knowledge gap impacted how productive I could be at work. If left to my own to complete a new (to me) task, it might take me 3 hours finish what a seasoned vet would have knocked out in 30 minutes. A 6x &#8220;rookie tax&#8221; might sound extreme, but really I think this is pretty conservative, especially when we superimpose this idea onto software engineering.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to The 418 for more software inspired musings.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I found myself most productive when some &#8220;heavy hitter&#8221; from the crew would take a few minutes to do &#8220;setup work&#8221;, to get me up and running. If tasked with planting a row of 4 shrubs for example, perhaps the landscape architect could mark where each shrub should go, then maybe the excavator operator swings by and digs crude starter holes with his machine.</p><p>These are small, but high leverage tasks for the experienced folk. They unblock me on multiple fronts that are beyond my current skillset. Instead of fretting over placement, or digging holes by hand, I&#8217;m now focused on the things that I&#8217;m proficient at while pushing the task forward. </p><p>Hand finishing the holes to proper depth, cutting the burlap off the root balls, fertilizing, planting, cleaning up the top soil, laying down a bit of mulch. All right up my alley, and critical to getting the job done.</p><p>We should think of building software like this. Throwing a junior engineer at a new problem with no context is doomed to, in the best case, take longer and be more painful than it needed to. The job of a senior engineer is to find the setup work that frames the tasks of others properly. Stubbing out 3 pseudo functions in the right parts of the code, writing a script to run something locally, coming up with a mock json response for a new API endpoint.</p><p>This stuff is easy and doesn&#8217;t require much time investment, but it serves as a critical guide wire for someone less familiar with the task. And best of all, it&#8217;s not infantilizing. You&#8217;re offering a fuzzy glimpse at what the solution looks like, and most importantly, you&#8217;re letting them know the kind of things they need to learn to level up themselves. And if they are any good, they will.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to The 418 for more software inspired musings.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Cost of Clean]]></title><description><![CDATA[A lesson from when I over-simplified a design.]]></description><link>https://the418.substack.com/p/the-cost-of-clean</link><guid isPermaLink="false">https://the418.substack.com/p/the-cost-of-clean</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Wed, 08 May 2024 15:30:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa686ef2c-bd73-4e5b-a40e-4b5a98706864_400x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As builders, we often strive to create products that look and feel &#8220;clean&#8221;. We try to reduce clutter, remove noise, and surface only the most important information to our users. This is a noble idea, but as as one of my favorite Proverbs puts it&#8230;</p><div class="pullquote"><blockquote><p>&#8220;Where no oxen <em>are,</em> the trough <em>is</em> clean; But much increase <em>comes</em> by the strength of an ox.&#8221; </p><p>Proverbs 14:4 NKJV</p></blockquote></div><p>Sometimes cleanliness comes at a cost, and that cost is the very strength of the thing we are trying to build!</p><h2>A Lesson Learned</h2><p>I recently launched a feature that I thought was super clean. Users would navigate to a page, the page would fire up a websocket connection in the background, and display incoming data the moment our system received it! Awesome.</p><p>Then I sat down with some actual users&#8230;</p><p>They liked the basic idea of the feature, but their foremost suggestion caught me a little off guard.</p><p>&#8220;Can you add a refresh button?&#8221;, they asked.</p><p>&#8220;Huh? What do you mean, the data is always live, there is no need to refresh.&#8221;, I explained.</p><p>They walked me through their workflow. How they would navigate to the page, wait for new data to come in, and get anxious when nothing showed up for a few moments. </p><p>Then it hit me&#8230; there was nothing &#8220;wrong&#8221;, the page accurately and reliably reflected the latest data, BUT it didn&#8217;t tell the user what it was doing, or why nothing had changed, or what it was &#8220;looking&#8221; for new data in the background.</p><p>I made it too simple, and because of that users were left confused, hitting the refresh button in their browser, eagerly awaiting for the data on their screen to update.</p><h2>The Fix</h2><p>Thankfully the fix for this one was pretty straight forward. What was needed was presenting some additional state indicators to the user. A pulsing &#8220;live connection&#8221; indicator&#8230; a timestamp from the last &#8220;keep alive&#8221; message we transmitted over the websocket.</p><p>Really, just a few subtle hints that the page was working, that the tool was looking for new data for them, and that they didn&#8217;t have to finagle with it to get the latest result.</p><h2>Conclusion</h2><p>Clean isn&#8217;t everything. Step back and make sure that your design gives the user something to hook onto so that they understand what&#8217;s happening, even in passive states.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Naming Things]]></title><description><![CDATA[Observations, opinions, and suggestions for better naming in code.]]></description><link>https://the418.substack.com/p/naming-things</link><guid isPermaLink="false">https://the418.substack.com/p/naming-things</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Mon, 06 May 2024 03:38:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xaCr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Few professions rival programming when it comes to the frequency at which we are tasked with naming things. We name things so often that it is common for the prevailing sentiment within a team to devolve into something like &#8220;naming things is hard, so just pick something and move on&#8221;. I reject this.</p><p>Naming things is hard because it is important. Our packages / classes / functions / methods / variables / etc become the API of our shared tool belt. Good names keep our work shop orderly, and help us catalog which resources we have at our disposal.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The 418! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>My favorite engineers to work with are the ones that strike a mythical balance of context, conventions, style, and humor in their naming of things. They understand that authoring code gives them the very special power of controlling what flows from their colleagues fingertips (sort of like the <a href="https://www.barnesandnoble.com/w/we-are-in-a-book-mo-willems/1111550196">kids book</a> my son enjoys, where the  characters figure out that they can get the &#8220;reader&#8221; to say whatever they want).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xaCr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xaCr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xaCr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xaCr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xaCr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xaCr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70994,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xaCr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xaCr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xaCr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xaCr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33d00cbb-4b47-4429-9d54-e1bf61e648c2_1280x720.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">From &#8220;We Are in a Book!&#8221; by Mo Williams </figcaption></figure></div><p>This is an intimate power. The &#8220;language&#8221; of our codebase changes how we reason about the code we write. The same way that the language we use in society shapes our collective thinking about issues.</p><p>That said, here is a list of attributes that I think are common to well named things.</p><ul><li><p>They are &#8220;SEO&#8221; friendly</p></li><li><p>They lean into convention</p></li><li><p>They prefer terseness without sacrificing meaning</p></li><li><p>They are considerate of collisions</p></li><li><p>They are guessable</p></li><li><p>They make you smile from time to time</p></li></ul><p>I&#8217;ll expound on these below.</p><div><hr></div><h2>&#8220;SEO&#8221; Friendly</h2><p>Big code bases, with lots of contributors get searched. Most engineers, especially in established projects, will default to using what&#8217;s there already. Common tasks like authentication, authorization, error handling, logging, etc should have very obvious and highly searchable names. For example, &#8220;auth.DecodeJWT(&#8230;)&#8221; would be a solid name for a function in the &#8220;auth&#8221; package that handles the decoding of JWTs. Whereas &#8220;helpers.Validate(jwt)&#8221; misses the mark.</p><div><hr></div><h2>Leaning Into Convention</h2><p>Good convention is really powerful and might be the highest leverage tactic for naming things. I&#8217;ve worked in a big mono-repo that adopted a fun convention of adding an &#8220;-y&#8221; suffix to core utility libraries. Think &#8220;stringy&#8221; for string helper functions, &#8220;timey&#8221; for date/time stuff, or &#8220;randy&#8221; for&#8230; you guessed it, randomness utils.</p><p>This had a few benefits:</p><ul><li><p>It made naming new packages a non-thought</p></li><li><p>It increased readability, as util funcs were name-spaced with the obvious convention</p></li><li><p>Utility code discovery was easy, just look for the appropriate &#8220;-y&#8221; lib</p></li><li><p>Gaps in utilities were obvious (no &#8220;-y&#8221; for the category you wanted? time to add one!)</p></li></ul><div><hr></div><h2>Terse, but Meaningful</h2><p>Long names are well intentioned, but often un-helpful. For example, if you are making a SaaS app for veterinary clinics, you probably don&#8217;t want a bunch of functions like:</p><ul><li><p>&#8220;CreateNewVeterinarian&#8221;</p></li><li><p>&#8220;DeleteVeterinarian&#8221;</p></li><li><p>&#8220;UpdateVeterinarianContactDetails&#8221;</p></li></ul><p>These convey plenty of meaning, but there is a lot of extra over-head when it comes to typing and line length that we can 86. The better way would be:</p><ul><li><p>&#8220;CreateVet&#8221;</p></li><li><p>&#8220;DeleteVet&#8221;</p></li><li><p>&#8220;UpdateVetContact&#8221;</p></li></ul><p>That&#8217;s easier on the eyes, the fingers, and the line wrap :)</p><div><hr></div><h2>Considerate of Collisions</h2><p>Names should lend themselves to being considerate of their caller&#8217;s context. For example, maybe you have a database library that exposes a &#8220;reset&#8221; function. If the reset function is always chained to the package name, or a method on some other class/structure, than I&#8217;ve got no beef. But, if it&#8217;s a stand alone function call, like in this pseudo javascript code&#8230;</p><h4>Inconsiderate Version &#128575;</h4><pre><code>import { reset } from '../lib/db'

const cool = () =&gt; {
  reset()
}</code></pre><p>This is inconsiderate. The &#8220;reset&#8221; call on it&#8217;s own gives no hint that it&#8217;s related to the db, and once our &#8220;cool&#8221; function does some more work, this code will be harder to read and eventually might even run into a collision scenario where there is some more locally scoped &#8220;reset&#8221; logic that we want to run. Yikes!</p><h4>Considerate Version &#128526;</h4><pre><code>import { resetStore } from '../lib/db'

const cool = () =&gt; {
  resetStore()
}</code></pre><p>This is a considerate function name. No matter how verbose the &#8220;cool&#8221; function gets, we know that &#8220;resetStore&#8221; is resetting a data store, not something else.</p><div><hr></div><h2>Guessable</h2><p>The best names are guessable. Convention helps a lot here, but also, so does logical code division and function implementation.</p><p>Let&#8217;s consider a &#8220;User&#8221; class with a handful of methods that send various emails to the user. You want your code to look something like:</p><pre><code>// this is cool &#9989;
user.SendPasswordResetEmail()
user.SendVerificationEmail()
user.SendNewDeviceEmail()</code></pre><p>vs</p><pre><code>// not so much &#10060;
user.SendPasswordResetEmail()
user.Verify()
user.NotifyForNewDevice()</code></pre><p>The problem here is not the method names themselves, but the fact that they are wildly inconsistent.</p><div><hr></div><h2>Smile!</h2><p>Remember, our code gets compiled and interpreted by computers, but it gets <strong>read</strong> by other programmers. With that in mind, you should inject some sunshine into your naming when appropriate.</p><p>I once wrote a method for presenting a &#8220;Toast&#8221; in a web UI called &#8220;xplode&#8221;.  Calling</p><pre><code>const toast = new Toast()
toast.xplode()</code></pre><p>Would render the toast in it&#8217;s &#8220;something went very wrong and we have no better options&#8221; state.</p><p>This name doesn&#8217;t exactly follow the guard rails I&#8217;ve laid out&#8230; it&#8217;s not very SEO friendly, doesn&#8217;t follow any hard conventions, and yet&#8230; it somehow fits the bill, and stuck in the minds of the team. It had some soul, and described what it did poignantly.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://the418.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The 418! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Lovable work emails]]></title><description><![CDATA[The email you give your employee is an omnipresent signal.]]></description><link>https://the418.substack.com/p/on-work-emails</link><guid isPermaLink="false">https://the418.substack.com/p/on-work-emails</guid><dc:creator><![CDATA[Shayne O’Sullivan]]></dc:creator><pubDate>Wed, 01 May 2024 17:08:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fae6792f-749f-49b9-865c-ca03423ae54d_420x300.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many companies opt for some kind of stale convention for provisioning work emails. Something like: <code>{firstName}.{lastName}@{companyDomain}</code></p><p>There are a lot of conveniences for conventions like this. Normalization for managing access to systems, &#8220;guessability&#8221; for new comms, avoiding collisions, and fewer squabbles over who gets &#8220;john@{companyDomain}&#8221;.</p><p><strong>But, IMO, this is a missed opportunity for most companies.</strong></p><p>Why? Because a work email is one of the very first, most long-lasting, and most frequently observed signals that an employer gives to an employee. </p><p>Think about it. Work email is square one of employee onboarding. It then gets embedded into their daily workflow&#8230; as the use it to log into systems, or share it with others to communicate.</p><p>The difference between a &#8220;cool&#8221; email and a conventional email can be a big deal. One tells the employee that they are a record in an identity database, a cog in the machine. The other tells the employee that they are an individual with unique attributes to bring to the company.</p><p>While I&#8217;m not an advocate of the &#8220;bring your whole self to work&#8221; idea, I do think that embracing someone for their unique skillset and perspective (when it comes to work things) is much better than the templatization signal in the conventional email schema.</p><p>This is a no brainer for early companies, when there are fewer collisions to worry about. But even after you hire a few &#8220;Bill&#8221;s or &#8220;Janet&#8221;s, you can still offer your team a better email than first.last. Here are some ideas:</p><h3>Some Better Convetions</h3><h5>First Name Only</h5><p><code>{firstName}@{companyDomain}</code></p><p>Example: shayne@example.com</p><h5>Last Name Only</h5><p><code>{lastName}@{companyDomain}</code></p><p>Example: osullivan@example.com</p><h5>First Name + Last Initial</h5><p><code>{firstName}{lastInitial}@{companyDomain}</code></p><p>Example: shayneo@example.com</p><h5>Initials</h5><p><code>{firstInitial}{middleInitial}{lastInitial}@{companyDomain}</code></p><p>Example: sko@example.com</p><h5>Professional Handle</h5><p>You probably don&#8217;t want emails like &#8220;sc00terDude15@example.com&#8221;, but most adults have a deep bag of &#8220;handles&#8221; that they are used to creating on various sites. Be open to one of those when there is a collision.</p><p>For me, that may be something like:</p><ul><li><p>shayneosull@example.com</p></li><li><p>osully@example.com</p></li><li><p>sos@example.com</p></li><li><p>shayneos@example.com</p></li></ul><h2>Be Flexible</h2><p>Maybe the most important thing is just to recognize that the work email you give someone is indeed a signal. If you are an early company and can&#8217;t give them &#8220;firstName@&#8221;, let them propose a reasonable alternative, or let them pick from a few ideas.</p><p>It&#8217;s a small thing, but it sends the right message. </p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item></channel></rss>