<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>engineering discussion · momsbasement</title><link>https://callumdempseyleach.tech/</link><description>Recent content on engineering discussion · momsbasement</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Fri, 13 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://callumdempseyleach.tech/index.xml" rel="self" type="application/rss+xml"/><item><title>on what is 'software engineering'</title><link>https://callumdempseyleach.tech/writing/on-engineering-software/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/on-engineering-software/</guid><description>&lt;p>today is my birthday. and on my birthday, there&amp;rsquo;s a take that circulates every few months i really want to address. it goes like this:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;leetcode interviews are broken. nobody inverts binary trees on the job. whiteboard coding selects for people who grind competitive programming, not people who build real systems.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>i want to counter argue leetcode is our saving grace.&lt;/p>
&lt;p>let me preface by saying i love my job. i love the process of software engineering. i love providing a service, formulating algorithms, meeting problems in a conceptual reality with techniques that aren&amp;rsquo;t available when you&amp;rsquo;re sanding wood. compression. recursion. referential transparency. these are not object-oriented metaphors. they are materials. i want to explain why leetcode is the practice of working those materials well, because i think it is the DNA that separates engineers who write enterprise code from engineers who write the world&amp;rsquo;s most popular open source software.&lt;/p></description></item><item><title>squeezing an ml service into fourteen gigabytes</title><link>https://callumdempseyleach.tech/writing/squeezing-an-ml-service-into-ci/</link><pubDate>Thu, 12 Mar 2026 12:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/squeezing-an-ml-service-into-ci/</guid><description>&lt;p>the ml team said the preprocessing service couldn&amp;rsquo;t run in CI. too big. too many dependencies. private repos. cuda base images. the works.&lt;/p>
&lt;p>so naturally i spent a night proving them wrong. here&amp;rsquo;s how that went.&lt;/p>
&lt;hr>
&lt;h2 id="the-premise">the premise&lt;/h2>
&lt;p>we have a platform. four services. a go API, a data generation service, a preprocessing service, and an e2e test suite. they all need to be built, loaded into a local kubernetes cluster, and tested together. the e2e tests deploy the whole stack into &lt;a href="https://kind.sigs.k8s.io/">kind&lt;/a> (kubernetes-in-docker) and run a jest suite against it.&lt;/p></description></item><item><title>how to write a dag</title><link>https://callumdempseyleach.tech/writing/how-to-write-a-dag/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/how-to-write-a-dag/</guid><description>&lt;p>a directed acyclic graph is a dict.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>dag &lt;span style="color:#ff79c6">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;ingest&amp;#34;&lt;/span>: [(&lt;span style="color:#f1fa8c">&amp;#34;validate&amp;#34;&lt;/span>, transform)],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;validate&amp;#34;&lt;/span>: [(&lt;span style="color:#f1fa8c">&amp;#34;enrich&amp;#34;&lt;/span>, enrich), (&lt;span style="color:#f1fa8c">&amp;#34;notify&amp;#34;&lt;/span>, notify)],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;enrich&amp;#34;&lt;/span>: [(&lt;span style="color:#f1fa8c">&amp;#34;publish&amp;#34;&lt;/span>, publish)],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;notify&amp;#34;&lt;/span>: [(&lt;span style="color:#ff79c6">None&lt;/span>, alert)],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f1fa8c">&amp;#34;publish&amp;#34;&lt;/span>: [(&lt;span style="color:#ff79c6">None&lt;/span>, &lt;span style="color:#ff79c6">None&lt;/span>)],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>command maps to a list of &lt;code>(next_command, handler)&lt;/code>. if &lt;code>next_command&lt;/code> is &lt;code>None&lt;/code>, it&amp;rsquo;s terminal. walk it recursively. you&amp;rsquo;re done.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">def&lt;/span> &lt;span style="color:#50fa7b">walk&lt;/span>(dag, cmd):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">for&lt;/span> next_cmd, fn &lt;span style="color:#ff79c6">in&lt;/span> dag&lt;span style="color:#ff79c6">.&lt;/span>get(cmd, []):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> fn:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> fn()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff79c6">if&lt;/span> next_cmd:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> walk(dag, next_cmd)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>that&amp;rsquo;s it. that&amp;rsquo;s the post.&lt;/p>
&lt;hr>
&lt;h2 id="no-it-isnt">no it isn&amp;rsquo;t&lt;/h2>
&lt;p>oh yeah? let&amp;rsquo;s do some leetcode.&lt;/p></description></item><item><title>the medallion architecture is not an architecture</title><link>https://callumdempseyleach.tech/writing/medallion-architecture/</link><pubDate>Tue, 03 Mar 2026 12:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/medallion-architecture/</guid><description>&lt;p>if you&amp;rsquo;ve worked in the databricks ecosystem for more than five minutes, someone has told you about the medallion architecture. bronze, silver, gold. raw, cleaned, aggregated. it&amp;rsquo;s in the docs, the sales decks, the onboarding material, and every medium article written by someone who just finished a databricks certification.&lt;/p>
&lt;p>&lt;a href="https://docs.databricks.com/aws/en/lakehouse/medallion">databricks defines it&lt;/a> as:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;a data design pattern used to logically organize data in a lakehouse, with the goal of incrementally and progressively improving the structure and quality of data as it flows through each layer.&amp;rdquo;&lt;/p></description></item><item><title>trust scales</title><link>https://callumdempseyleach.tech/writing/trust-scales/</link><pubDate>Wed, 25 Feb 2026 00:45:09 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/trust-scales/</guid><description>&lt;p>a VP of engineering posted on linkedin recently. he said:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;we need five senior engineers in the same room to debug most issues.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>and then:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;if someone tells you they can&amp;rsquo;t investigate without multiple people, they&amp;rsquo;re probably not senior. Real senior engineers own a domain independently.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>i called it:&lt;/p>
&lt;blockquote>
&lt;p>completely delusional.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="where-the-disagreement-starts">where the disagreement starts&lt;/h2>
&lt;p>here&amp;rsquo;s what i think:&lt;/p>
&lt;blockquote>
&lt;p>where senior — staff, really — engineering fits in this model is uncomfortable for most orgs to hear. the engineer&amp;rsquo;s job isn&amp;rsquo;t to own the hardest problem. it&amp;rsquo;s to be the person who helps make the unit cohere.&lt;/p></description></item><item><title>on starting something</title><link>https://callumdempseyleach.tech/writing/on-starting-something/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/on-starting-something/</guid><description>&lt;p>Every site needs a first post so here it is. I wanted a place to put things — words and photographs — that didn&amp;rsquo;t belong to anyone else&amp;rsquo;s platform. No algorithmic feed, no engagement metrics, no dark patterns. Just a page on the internet.&lt;/p>
&lt;p>The stack is simple: Hugo builds it, Fly.io serves it, Tigris stores the photos. The entire site is static HTML. There is no JavaScript on this page. The CSS is inlined. It loads in milliseconds.&lt;/p></description></item><item><title>tools that get out of the way</title><link>https://callumdempseyleach.tech/writing/tools-that-get-out-of-the-way/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/writing/tools-that-get-out-of-the-way/</guid><description>&lt;p>The best tools are the ones you stop thinking about. They become invisible infrastructure — reliable enough that your attention stays on the work, not the tooling.&lt;/p>
&lt;p>I keep coming back to Go for the same reason I keep coming back to plain text files: they are predictable. A Go binary does what it says. A markdown file is readable in any editor on any machine. There is no dependency hell. There are no thundering herds. There are no breaking changes in a &lt;code>.md&lt;/code> file.&lt;/p></description></item><item><title>winter light</title><link>https://callumdempseyleach.tech/photos/winter-light/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/photos/winter-light/</guid><description>&lt;p>A few frames from a walk in January. The light this time of year only lasts a few hours but when it comes through it&amp;rsquo;s worth the cold.&lt;/p></description></item><item><title>concrete and glass</title><link>https://callumdempseyleach.tech/photos/concrete-and-glass/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><guid>https://callumdempseyleach.tech/photos/concrete-and-glass/</guid><description>&lt;p>Urban textures around the quayside. Brutalism and modern glass next to each other.&lt;/p></description></item></channel></rss>