<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Logic Fault</title><link>/</link><description>Recent content on Logic Fault</description><generator>Hugo</generator><language>en-gb</language><copyright>Zac Bentley 2026</copyright><lastBuildDate>Wed, 01 Apr 2026 10:53:59 -0400</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>On Reversibility</title><link>/post/on-reversibility/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>/post/on-reversibility/</guid><description>&lt;p&gt;Reversibility is the most important quality of good software decisionmaking.&lt;/p&gt;
&lt;p&gt;This is not a new idea.&lt;/p&gt;
&lt;p&gt;Reversibility is more important than knowing &amp;ldquo;will this work at all?&amp;rdquo;. If you make a wrong decision but can reverse it, you&amp;rsquo;re fine. If you make decisions you can&amp;rsquo;t reverse and your strategy is &amp;ldquo;hope it&amp;rsquo;s the right call&amp;rdquo;, you&amp;rsquo;re building systems on the power of prayer.&lt;/p&gt;
&lt;h2 id="what-we-talk-about-when-we-talk-about-reversibility"&gt;
What we talk about when we talk about reversibility
&lt;a href="#what-we-talk-about-when-we-talk-about-reversibility" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Reversibility is not the same as the ability to iterate/improve on incomplete solutions. Iteration is well and good, but if you equate the ability to improve a system with the ability to &lt;em&gt;go back to the way things were before you had that system&lt;/em&gt;, your outcomes will land somewhere between &amp;ldquo;endless struggles while continually wondering if this could have been done a different way&amp;rdquo; and &amp;ldquo;existentially annihilating hamster-wheel of layering forward-(not-quite-)fixes onto a cautionary monument to the sunk cost fallacy.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Cute python trick: an @lru_cache containing bound methods</title><link>/post/lru-cache-of-methods/</link><pubDate>Thu, 24 Oct 2024 00:00:00 +0000</pubDate><guid>/post/lru-cache-of-methods/</guid><description>&lt;p&gt;Here&amp;rsquo;s a cute Python trick I just discovered. I&amp;rsquo;m probably not the first one to find it.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say I want an &lt;a href="https://docs.python.org/3/library/functools.html#functools.lru_cache"&gt;&lt;code&gt;@lru_cache&lt;/code&gt;&lt;/a&gt; that can contain bound methods.&lt;/p&gt;
&lt;p&gt;I am not talking about a cache that &lt;em&gt;decorates&lt;/em&gt; bound methods, like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Leaky&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@lru_cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mymethod&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; whatever
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s (hopefully) well-known that this pattern can &lt;a href="https://discuss.python.org/t/memoizing-methods-considered-harmful/24691"&gt;leak references to &lt;code&gt;self&lt;/code&gt;&lt;/a&gt;. When people try to do this, what they usually want is a cache whose
lifetime is bound to the lifetime of the instance in &lt;code&gt;self&lt;/code&gt;. Such a cache exists: &lt;a href="https://docs.python.org/3/library/functools.html#functools.cached_property"&gt;&lt;code&gt;@cached_property&lt;/code&gt;&lt;/a&gt; or any one of its numerous backports or equivalents on PyPI.&lt;/p&gt;</description></item><item><title>On Data Lakes and Swamp Shacks</title><link>/post/on-swamp-houses/</link><pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate><guid>/post/on-swamp-houses/</guid><description>&lt;p&gt;Your data lake probably looks like &lt;a href="https://en.wikipedia.org/wiki/Swamp#/media/File:Florida_freshwater_swamp_usgov_image.jpg"&gt;this&lt;/a&gt; and your data lakehouse will probably look like &lt;a href="https://www.flickr.com/photos/8851384@N07/2298634112"&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="realism"&gt;
Realism
&lt;a href="#realism" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;When building out data lake infrastructure, know the rate at which you &lt;em&gt;currently need&lt;/em&gt; to access that data, as a ratio of &amp;ldquo;people who ask important questions that require icky and difficult queries/multi-data-source wrangling in order to answer&amp;rdquo; per unit time. Do not confuse that with the rate at which &lt;em&gt;it would be super cool if&lt;/em&gt; you could access that data if you had a better data-{base,warehouse,lake,lakehouse,swamp,space-station}.&lt;/p&gt;</description></item><item><title>The Architecture of Annoyance: Diagnosing issues involving Cargo and DTrace on MacOS</title><link>/post/dtrace-macos/</link><pubDate>Sun, 04 Feb 2024 00:00:00 +0000</pubDate><guid>/post/dtrace-macos/</guid><description>&lt;p&gt;This post is a lengthy narration of some debugging/resolution I did involving MacOS, &lt;code&gt;dtrace&lt;/code&gt;, Rust, and cross-architecture binary execution. It has deliberately not been edited for brevity by removing red herrings (threads I pulled on that turned out to be unrelated), both because those other threads might be useful to some readers, and because I think it is important to explain your mistakes as well as your successes.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re having a similar issue to the one discussed here and just want it fixed, jump to the &lt;a href="#tldr-and-morals-of-the-story"&gt;tl;dr&lt;/a&gt; at the end.&lt;/p&gt;</description></item><item><title>Enterprise Software Terms: Syntactic Analysis</title><link>/post/industry-phrases/</link><pubDate>Fri, 23 Jun 2023 00:00:00 +0000</pubDate><guid>/post/industry-phrases/</guid><description>&lt;h3 id="ownership"&gt;
Ownership
&lt;a href="#ownership" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;If it has multiple owners, it has no owner&amp;rdquo; indicates a failure of accountability, not a failure in the ownership model.&lt;/p&gt;
&lt;p&gt;Fortunately, failures of accountability are so common in software engineering that nobody needs to care about that distinction.&lt;/p&gt;
&lt;h3 id="monolith"&gt;
Monolith
&lt;a href="#monolith" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Nobody can agree on what a monolith is other than &amp;ldquo;a system where things break when we don&amp;rsquo;t want them to&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Fortunately, fragile software is so common that anyone can accuse anything of being a monolith and be right, at least by that definition.&lt;/p&gt;</description></item><item><title>On Tools and Popularity</title><link>/post/on-tools-and-popularity/</link><pubDate>Thu, 23 Mar 2023 20:54:18 -0500</pubDate><guid>/post/on-tools-and-popularity/</guid><description>&lt;p&gt;An overengineer &lt;a href="https://www.goodreads.com/quotes/226225-there-are-only-two-kinds-of-languages-the-ones-people"&gt;once said&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;There are only two kinds of languages: the ones people complain about and the ones nobody uses.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is not quite right, or is at least incomplete. More accurately:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;There are only two kinds of software tools: unpopular ones and misused ones.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A software tool will either be unpopular, or mis-used in 99% of cases.&lt;/p&gt;
&lt;p&gt;Unpopularity is not so bad. Unpopularity does not mean &amp;ldquo;unused&amp;rdquo;. It means that nobody &lt;em&gt;outside of the circle of people for which the tool was built&lt;/em&gt; uses it. That is okay. Not every tool needs to choose between &amp;ldquo;gets so popular that Dan Abramov obsoletes it with something overcomplicated and inferior&amp;rdquo;, and &amp;ldquo;checked into the &lt;del&gt;nice hospice by the park&lt;/del&gt; Apache Software Foundation&amp;rdquo;. There is a third option: tools that serve a bounded community well and are content with that.&lt;/p&gt;</description></item><item><title>On Foresight</title><link>/post/on-timelines/</link><pubDate>Tue, 07 Feb 2023 20:54:18 -0500</pubDate><guid>/post/on-timelines/</guid><description>&lt;p&gt;Things to do proactively in advance of anticipated need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pee&lt;/li&gt;
&lt;li&gt;Save money&lt;/li&gt;
&lt;li&gt;Be kind&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things &lt;strong&gt;not&lt;/strong&gt; to do proactively in advance of anticipated need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stockpile nuclear weapons&lt;/li&gt;
&lt;li&gt;Purchase cryptocurrency&lt;/li&gt;
&lt;li&gt;Extract code into a microservice&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>On Cloud Runtimes</title><link>/post/on-cloud-runtimes/</link><pubDate>Thu, 02 Feb 2023 13:28:21 -0500</pubDate><guid>/post/on-cloud-runtimes/</guid><description>&lt;p&gt;So. You are in a hurry and want to &lt;del&gt;compromise your users&amp;rsquo; data&lt;/del&gt; publish an app in a hurry.&lt;/p&gt;
&lt;p&gt;Your head&amp;rsquo;s on straight: you don&amp;rsquo;t want to worry about the hard parts; you &lt;em&gt;definitely&lt;/em&gt; don&amp;rsquo;t want to worry about scale/best-practices until you feel a pulse. You&amp;rsquo;re a beginner&amp;ndash;either to software engineering in general or to standing something up _from scratch_&lt;label for="sidenote-1" class="margin-toggle sidenote-number"&gt;(1)&lt;/label&gt;
&lt;input type="checkbox" id="sidenote-1" class="margin-toggle"/&gt;
&lt;span class="sidenote"&gt;
&lt;span class="sidenote-number"&gt;(1)&lt;/span&gt;That second demographic is huge (personal projects + first-time startup founders + &lt;code&gt;disposition:kleenex&lt;/code&gt; line-of-business apps for simple things): given the number and size of huge software orgs, most people doing development have passed through one at some point in their lives. Like waste through a bowel. Anyway.
&lt;/span&gt;
. You don&amp;rsquo;t want to &lt;a href="https://circleci.com/blog/its-the-future"&gt;go back to heroku&lt;/a&gt;, you don&amp;rsquo;t want to &lt;a href="https://fly.io"&gt;go deep&lt;/a&gt;, and you don&amp;rsquo;t want to &lt;a href="https://aws.amazon.com/architecture/"&gt;go wide&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>On Interns</title><link>/post/on-interns/</link><pubDate>Wed, 25 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-interns/</guid><description>&lt;p&gt;A hypothetical intern or very junior/first-time programmer comes up a lot in discussion of design patterns. &amp;ldquo;Sure,&amp;rdquo; pattern advocates say. &amp;ldquo;Deciding what to do on a case-by-case basis informed by pragmatism and experience is swell, but what about someone who is too early in their career to have either of those things? We need to &lt;del&gt;give the masses opiates&lt;/del&gt; come up with a set of hard-and-fast rules people can follow without understanding them &lt;em&gt;first&lt;/em&gt;, to get them productive quickly. They can grow into the subjective/squishy decisionmaking &lt;em&gt;later&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;</description></item><item><title>On Maintainers</title><link>/post/on-maintainers/</link><pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-maintainers/</guid><description>&lt;p&gt;Code is read more than it is written.&lt;/p&gt;
&lt;p&gt;Code is read by &lt;em&gt;low context&lt;/em&gt; people in &lt;em&gt;high urgency&lt;/em&gt; situations more than it is read by anyone else.&lt;/p&gt;
&lt;p&gt;If your design patterns impose multiple &amp;ldquo;hops&amp;rdquo; in the call stack chain to a given business operation A invoked from another place B, a user who wants to modify/add to the set of side effects of A is more likely to make the change in the wrong place (e.g. in B, or in an intermediate/abstract-lookup-point location, rather than in or near A itself).&lt;/p&gt;</description></item><item><title>Abject Rancor</title><link>/post/abject-rancor/</link><pubDate>Fri, 20 Jan 2023 00:00:00 +0000</pubDate><guid>/post/abject-rancor/</guid><description>&lt;p&gt;Writing the most valuable code for your team and customers is a lot less fun than most people think it is. So we find ways to make it more fun. The human brain really likes doing &lt;a href="https://www.reddit.com/r/Perfectfit/"&gt;this&lt;/a&gt; and hates doing &lt;a href="https://i.imgur.com/F1wZOUs.gif"&gt;this&lt;/a&gt;, so one of the ways we make coding more fun is devising ways to give ourselves an &amp;ldquo;I&amp;rsquo;m objectively correct&amp;rdquo; dopamine hit, or a &amp;ldquo;I made everything uniform and uniformity pleases lizard brainstem that doesn&amp;rsquo;t like rough scales that need to be shed&amp;rdquo; when we check in a change.&lt;/p&gt;</description></item><item><title>On YAGNI</title><link>/post/on-yagni/</link><pubDate>Fri, 20 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-yagni/</guid><description>&lt;p&gt;Let&amp;rsquo;s talk about modularity/swappability, sometimes called &amp;ldquo;abstraction&amp;rdquo; (&lt;em&gt;v.&lt;/em&gt;). This is the practice of writing the ability to &amp;ldquo;change one part without touching other parts&amp;rdquo; into your codebase. This is sometimes equated this with the &amp;ldquo;L&amp;rdquo; or &amp;ldquo;D&amp;rdquo; in SOLID, but the practice extends farther than that.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s make all of our data access SQL-engine agnostic so we can switch from MySQL to Postgres if we want&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip;and:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s introduce two abstract interfaces, a DTO, and two repository classes so we can transfer a single string from one table on one database to another, just in case we someday develop a need for a &lt;code&gt;GeneralPurposeDatabaseOneToDatabaseTwoStringTransferenceEngine&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>On Feelings</title><link>/post/on-feelings/</link><pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-feelings/</guid><description>&lt;p&gt;Many teams who &amp;ldquo;successfully&amp;rdquo; apply design patterns to a codebase feel that they were successful because changes are now much easier for them to make. Consider that this may be because of the patterns used, or it may simply be because the introduction of patterns caused the engineers to touch, rework, develop muscle memory of, and otherwise get familiar with the whole codebase. The latter is far more likely.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Teams&amp;rdquo; means &amp;ldquo;you&amp;rdquo; here. Individually, you feel good about the state of code if you understand how it&amp;rsquo;s structured when you debug it or make changes. Ask yourself where the emphasis lies: is the main benefit that you understand &lt;em&gt;how&lt;/em&gt; it&amp;rsquo;s structured (as in: it&amp;rsquo;s structured in a way that objectively makes it easier to work with)? Or is the main benefit that &lt;em&gt;you understand&lt;/em&gt; how it&amp;rsquo;s structured (that is: you are familiar with it and have a good mental map)?&lt;/p&gt;</description></item><item><title>On Subclassing</title><link>/post/on-subclassing/</link><pubDate>Mon, 16 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-subclassing/</guid><description>&lt;p&gt;Class hierarchy is inferior to if/else as a way of modelling conditional behaviour. This statement probably doesn&amp;rsquo;t mean what you want it to mean, though.&lt;/p&gt;
&lt;p&gt;Prefer shorter hierarchies with functionality-containing abstract classes over interfaces.&lt;/p&gt;
&lt;p&gt;It is better to add a small amount of functionality to the &amp;ldquo;wrong&amp;rdquo; class in a hierarchy (i.e. adding specific functionality to an abstract base class, or adding functionality that conditionally detects situations that only arise in sibling classes to a leaf class) than it is to add an entire new layer to the hierarchy. This is only occasionally a mutually exclusive choice.&lt;/p&gt;</description></item><item><title>On Tests</title><link>/post/on-tests-1/</link><pubDate>Sun, 15 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-tests-1/</guid><description>&lt;p&gt;If you have to choose between tortured, hard-to-read production code and tortured, hard-to-read tests for that code, it is better to have bad tests than bad prod code. This is rarely a mutually exclusive choice.&lt;/p&gt;
&lt;p&gt;That is not a contentious claim, but the corollary is: if you have to choose between &lt;strong&gt;no tests at all&lt;/strong&gt; and tortured, hard-to-read production code, &lt;strong&gt;it is often better to have no tests.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Perfer mocking as a means of changing behaviour in tests. If your language doesn&amp;rsquo;t have good support for mocking and a strong community/set of norms around that process, I&amp;rsquo;m sorry for you.&lt;/p&gt;</description></item><item><title>On Code Organization</title><link>/post/on-code-organization-1/</link><pubDate>Fri, 13 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-code-organization-1/</guid><description>&lt;p&gt;It is easier to &lt;em&gt;feel good about reading&lt;/em&gt; &lt;a href="https://en.wikipedia.org/wiki/SOLID"&gt;SOLID&lt;/a&gt;-factored code, but it is &lt;em&gt;easier to read and understand&lt;/em&gt; under-abstracted code quickly.&lt;/p&gt;
&lt;p&gt;Default to putting related code as close together as possible. The more lines of indirection you add to &lt;code&gt;service2.insert(service1.select(...))&lt;/code&gt; the harder it is for people to maintain the code.&lt;/p&gt;
&lt;p&gt;If primitive data (say a string of &amp;ldquo;customer ID&amp;rdquo;) is what&amp;rsquo;s present at the &lt;strong&gt;top&lt;/strong&gt; of the call stack and that primitive data is the only thing needed to perform business side effects at the &lt;strong&gt;bottom&lt;/strong&gt; of the call stack, do not convert that data into a more complex business object. E.g. if a &amp;ldquo;customer ID&amp;rdquo; string is available at the top, and it can be used to build a multifield &amp;ldquo;customer&amp;rdquo; object, but only the &amp;ldquo;ID&amp;rdquo; field of said object is used in a &amp;ldquo;select-from-where-customer-ID-equals&amp;rdquo; at the bottom of the stack, don&amp;rsquo;t hydrate the ID into a full Customer object. Hydration often involves I/O and extra computation, and obscures the actual behaviour of downstream code: in this regard, the presence of the ID in the top-level call signatures indicates to readers that only locator keys are needed by the code below. That&amp;rsquo;s a strong hint about the IO interactions and behaviour of the function in question, if you&amp;rsquo;re reading in a hurry.&lt;label for="sidenote-1" class="margin-toggle sidenote-number"&gt;(1)&lt;/label&gt;
&lt;input type="checkbox" id="sidenote-1" class="margin-toggle"/&gt;
&lt;span class="sidenote"&gt;
&lt;span class="sidenote-number"&gt;(1)&lt;/span&gt;&lt;a href="/post/on-maintainers/"&gt;Most people are.&lt;/a&gt;
&lt;/span&gt;
&lt;/p&gt;</description></item><item><title>On Mutual Exclusivity</title><link>/post/on-mutual-exclusivity/</link><pubDate>Thu, 12 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-mutual-exclusivity/</guid><description>&lt;p&gt;Lots of the things on this blog talk in terms of &amp;ldquo;it is better to do good-thing-&lt;code&gt;X&lt;/code&gt; than good-thing-&lt;code&gt;Y&lt;/code&gt;&amp;rdquo;. Just like &lt;a href="https://help.nextdoor.com/s/article/Support-for-racial-equality-Posting-examples?language=en_US"&gt;there&amp;rsquo;s an implicit &amp;ldquo;too&amp;rdquo; after &amp;ldquo;Black Lives Matter&amp;rdquo;&lt;/a&gt;, there&amp;rsquo;s an implicit &amp;ldquo;&lt;em&gt;if &lt;code&gt;X&lt;/code&gt; and &lt;code&gt;Y&lt;/code&gt; are in conflict&lt;/em&gt;&amp;rdquo; after these statements. Often, they aren&amp;rsquo;t in conflict. In many cases, in fact, good prior engineering practices should have brought about an environment in which &lt;code&gt;X&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; &lt;code&gt;Y&lt;/code&gt; is easier to achieve than either &lt;code&gt;X&lt;/code&gt; or &lt;code&gt;Y&lt;/code&gt; alone. However, sometimes that ain&amp;rsquo;t what we got, and that&amp;rsquo;s where the advice in these posts applies.&lt;/p&gt;</description></item><item><title>On Reactivity and Need</title><link>/post/on-reactivity-and-need/</link><pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate><guid>/post/on-reactivity-and-need/</guid><description>&lt;h2 id="refactoringabstracting-code-reactively"&gt;
Refactoring/Abstracting Code Reactively
&lt;a href="#refactoringabstracting-code-reactively" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A lot of the content under &lt;a href="/tags/design-patterns"&gt;&amp;ldquo;design patterns&amp;rdquo;&lt;/a&gt; here has a punchline of &amp;ldquo;do so-and-so-practice reactively&amp;rdquo;. That&amp;rsquo;s a surprisingly nuanced statement to unpack, even without knowing what the practice is. It turns into something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I know it&amp;rsquo;s painful to suddenly context switch into unpredictable-duration refactoring in the middle of cranking out features, and I know it sucks when deadlines slip, but if you don&amp;rsquo;t build yourself a culture where you can do that, you can&amp;rsquo;t get the benefits of that refactoring in any other way, and you &lt;em&gt;certainly&lt;/em&gt; can&amp;rsquo;t achieve them by doing the refactoring up front&amp;rdquo;.&lt;/p&gt;</description></item><item><title>About</title><link>/about/</link><pubDate>Sat, 01 Jan 2000 00:00:00 +0000</pubDate><guid>/about/</guid><description>&lt;h2 id="what-is-this-place"&gt;
What is this place?
&lt;a href="#what-is-this-place" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This is one of Zac Bentley&amp;rsquo;s websites. Zac (he/him) thinks programming is pretty neat. &lt;em&gt;Programmers&lt;/em&gt; are another story.&lt;/p&gt;
&lt;h2 id="contact"&gt;
Contact
&lt;a href="#contact" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I can also be found elsewhere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/zac-bentley-80b5901b/"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zbentley"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/user?id=zbentley"&gt;Hacker News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For direct outreach, message me on LinkedIn. If you ignore that recommendation and try to reach me some other way, the bar for &amp;ldquo;why shouldn&amp;rsquo;t I block/mark-as-junk you&amp;rdquo; will be high.&lt;/p&gt;
&lt;h2 id="legal"&gt;
Legal
&lt;a href="#legal" class="heading-anchor"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;All content is Copyright © Zac Bentley 2026.&lt;/p&gt;</description></item></channel></rss>