<?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[42futures]]></title><description><![CDATA[Evidence-based analysis of technical decisions. Insights from running structured R&D pilots and building complex systems at scale.]]></description><link>https://blog.42futures.com</link><image><url>https://substackcdn.com/image/fetch/$s_!bbvu!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924caafe-4155-4c24-a7a0-0d327c9414ec_1024x1024.png</url><title>42futures</title><link>https://blog.42futures.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 11 Apr 2026 03:06:00 GMT</lastBuildDate><atom:link href="https://blog.42futures.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[42futures]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[42futures@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[42futures@substack.com]]></itunes:email><itunes:name><![CDATA[Daniel Rothmann]]></itunes:name></itunes:owner><itunes:author><![CDATA[Daniel Rothmann]]></itunes:author><googleplay:owner><![CDATA[42futures@substack.com]]></googleplay:owner><googleplay:email><![CDATA[42futures@substack.com]]></googleplay:email><googleplay:author><![CDATA[Daniel Rothmann]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[My Business as Code]]></title><description><![CDATA[4 months running a business with plain text]]></description><link>https://blog.42futures.com/p/my-business-as-code</link><guid isPermaLink="false">https://blog.42futures.com/p/my-business-as-code</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Fri, 13 Feb 2026 11:03:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!V4n0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A year ago, I wrote about an idea: <a href="https://blog.42futures.com/p/company-as-code">&#8220;Company as Code&#8221;</a>. Not an idea I was the first to have, but nonetheless an itch I couldn&#8217;t find a scratch for.</p><p>It started with the frustration of going through an information security compliance audit. I had no issue with the standards - they build trust between organisations. But the process was laborious and irritating.</p><p>I just couldn&#8217;t understand why it would be so hard to prove that you do as you say, in a software company where every single interaction happens on a SaaS platform.</p><p>Why can&#8217;t more of this process be automated? The data is right there.</p><h2><strong>The idea</strong></h2><p>Working with cloud infra, I was already a fan of <a href="https://developer.hashicorp.com/terraform">Terraform</a> and <a href="https://hcl.readthedocs.io/en/latest/intro.html">HCL</a>.</p><p>Basically, Terraform lets you declare the infrastructure you want with a domain-specific language (DSL), and then makes it so by building a dependency graph and calling cloud APIs in the right order to create the resources you need.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hi59!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hi59!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!Hi59!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!Hi59!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!Hi59!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hi59!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png" width="1418" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101874,&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://blog.42futures.com/i/187838891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.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_!Hi59!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!Hi59!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!Hi59!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!Hi59!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ce52cda-481f-480f-969a-c48e341703cc_1418x870.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>Could we do a similar thing for work data?</p><p>I mean, a <strong>structured, declarative representation of a business</strong> that&#8217;s accessible to both humans and machines.</p><p>If you could do that, you&#8217;d close the loop that audits close manually today. And probably a lot more.</p><h2><strong>The experiment</strong></h2><p>In autumn of 2025, I decided to go my own way with <a href="https://42futures.com/">42futures</a> - a so-called &#8220;lifestyle business&#8221; focused on building <a href="https://blog.42futures.com/p/stop-separating-learning-from-building">production-ready software pilots</a>.</p><p>The context is entirely different as a small business owner. But it was a good time to put my idea into practice. See if there&#8217;s anything to it.</p><p>I didn&#8217;t need it to succeed, but <strong>I did need</strong> to satisfy my curiosity.</p><p>So I built <a href="https://github.com/42futures/firm">Firm</a> which I describe as a plain-text work management tool. I published it on GitHub and was positively surprised by the amount of interest from technologists out there thinking similar thoughts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IcAl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IcAl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!IcAl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!IcAl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!IcAl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IcAl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:473255,&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;:&quot;https://blog.42futures.com/i/187838891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.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_!IcAl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!IcAl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!IcAl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!IcAl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4a13aa-7cef-48c3-b154-cb49e1203800_1628x1028.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><h2><strong>What is Firm?</strong></h2><p>Firm is a set of tools and libraries to organise a &#8220;Business-as-Code&#8221;.</p><p>Technically, Firm is:</p><ul><li><p><a href="https://firm.42futures.com/reference/dsl-reference.html">A DSL</a> to define and organise business entities in plain text</p></li><li><p><a href="https://firm.42futures.com/library/getting-started.html">A library</a> to build and use graphs of business entities</p></li><li><p><a href="https://firm.42futures.com/reference/cli-reference.html">A CLI</a> for humans and machines to interact with business graphs</p></li><li><p><a href="https://firm.42futures.com/guide/automations-and-ai.html">An MCP server</a> for chatbots to do the same</p></li></ul><p>The <a href="https://firm.42futures.com/reference/dsl-reference.html">Firm DSL</a> is what makes it code. I like code, because it&#8217;s structured, lightweight, automatable, easily stored and easily versioned. As it turns out, AI agents like code, too.</p><p>There&#8217;s more to say about how Firm works, but I&#8217;d rather show how I use it. Here are my experiences from the last 4 months.</p><h2><strong>How I use Firm</strong></h2><p>I like to start small and focus on immediate needs. This is a story of how I&#8217;ve progressively introduced the &#8220;business-as-code&#8221; concept in 42futures.</p><h3><strong>Stage 1: Rolodex</strong></h3><p>The first thing I needed was a structured way of doing outreach. I wanted to be able to keep track of contacts, early convos and potential leads. Something like a lightweight CRM or a Rolodex.</p><p>So I created a git repo and started adding my immediate network into <code>.firm</code> files. I would note a few things about each contact:</p><pre><code><code>contact john_doe {
    name = "John Doe"
    role = "Senior software engineer"
    status = enum"network"
    notes = "We used to build cool stuff together"
}

interaction coffee_chat_with_john {
    interaction_date = 2025-10-02 at 11:00 UTC+1
    initiator_ref = person.daniel_rothmann
    primary_contact_ref = contact.john_doe
    type = enum"in-person meeting"
    
    subject = "Coffee chat"
    outcome = """
        Always nice to connect! 
        John showed me how to set up Rust workspaces.
    """
}</code></code></pre><p>At this point, I&#8217;m not much better off than free-form notes. But with references, I build up relationships between entities. And with the Firm CLI, I can quickly recall related data before a meeting:</p><pre><code><code>firm related contact john_doe
&gt; Found 1 relationship for 'contact' entity with ID 'john_doe'

interaction.coffee_chat_with_john

Interaction Date = 2025-10-02 at 11:00 UTC+1
Subject: Coffee chat
&lt;etc...&gt;</code></code></pre><h3><strong>Stage 2: Project management</strong></h3><p>Some of the early conversations presented opportunities, and some project work trickled in. Nice!</p><p>Still using the DSL, I evolved my Firm workspace to track opportunities, projects and tasks.</p><pre><code><code>opportunity app_pilot {
    name = "Potential app pilot"
    source_ref = interaction.coffee_chat_with_john
    status = enum"closed won"
    value = 4200 EUR

    notes = """
        Discussed at the coffee meeting. 
        This will be an exciting first project. 
        Thanks John!
    """
}

project app_pilot {
    name = "App pilot"
    status = enum"in progress"
    description = "Build an app to do a thing"
    
    due_date = 2026-01-01 at 12:00 UTC+1
    owner_ref = person.daniel_rothmann
}

task app_pilot_platform {
    name = "Figure out cross-platform or native"
    description = "John wants to know which is better"
    source_ref = project.app_pilot
    assignee_ref = person.daniel_rothmann
    
    is_completed = false
}</code></code></pre><p>My pipeline from contact -&gt; interaction -&gt; opportunity -&gt; project -&gt; work started taking shape. It&#8217;s all linked together in the business entity graph.</p><p>Here&#8217;s what that graph looks like for my workspace:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V4n0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V4n0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!V4n0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!V4n0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!V4n0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V4n0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:823756,&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;:&quot;https://blog.42futures.com/i/187838891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.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_!V4n0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!V4n0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!V4n0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!V4n0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f1823f7-00f6-481c-ac25-be38f2c41f52_1628x1028.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>Every entity is a node. Every reference is an edge. As the workspace grows, so does the graph.</p><h3><strong>Stage 3: Query engine</strong></h3><p>At this point I started using the Firm CLI more to read and write entities instead of editing DSL directly.</p><p>With a bigger workspace, wrangling individual entities got annoying. So I added query capabilities.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5rHC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5rHC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 424w, https://substackcdn.com/image/fetch/$s_!5rHC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 848w, https://substackcdn.com/image/fetch/$s_!5rHC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 1272w, https://substackcdn.com/image/fetch/$s_!5rHC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5rHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif" width="1200" height="700" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:700,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283776,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.42futures.com/i/187838891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5rHC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 424w, https://substackcdn.com/image/fetch/$s_!5rHC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 848w, https://substackcdn.com/image/fetch/$s_!5rHC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 1272w, https://substackcdn.com/image/fetch/$s_!5rHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf6e442a-e68a-4bd5-81f2-89cb1b2bb22d_1200x700.gif 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>This query gets my unfinished tasks:</p><pre><code><code>firm query 'from tasks | where assignee_ref == person.me and is_completed == false'</code></code></pre><p>And this query gets new leads indirectly related to tech companies:</p><pre><code><code>firm query 'from organization | where industry == "tech" | related(2) lead | where status == "qualified" | order created_at | limit 10'</code></code></pre><p>With the workspace growing, the query engine enabled me to do more complex searches without trolling through too much data.</p><h3><strong>Stage 4: Coding agents</strong></h3><p>AI agents have gotten pretty good at writing code and using tools. The Firm DSL is code. The CLI is a tool. Maybe there&#8217;s something there?</p><p>So I hooked up <a href="https://code.claude.com/docs/en/overview">Claude Code </a>to my Firm workspace and was positively surprised.</p><p>The coding agent was great at taking high-level, ambiguous questions and turning them into concrete queries for the Firm CLI and direct interactions with the Firm DSL.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mj3Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mj3Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 424w, https://substackcdn.com/image/fetch/$s_!mj3Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 848w, https://substackcdn.com/image/fetch/$s_!mj3Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 1272w, https://substackcdn.com/image/fetch/$s_!mj3Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mj3Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif" width="800" height="439" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99564953-efed-4072-abac-0348c0656521_800x439.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:439,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:594697,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.42futures.com/i/187838891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mj3Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 424w, https://substackcdn.com/image/fetch/$s_!mj3Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 848w, https://substackcdn.com/image/fetch/$s_!mj3Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 1272w, https://substackcdn.com/image/fetch/$s_!mj3Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99564953-efed-4072-abac-0348c0656521_800x439.gif 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>That felt like a <strong>huge unlock</strong>! I hooked up <a href="https://goodsnooze.gumroad.com/l/macwhisper">MacWhisper</a> on my machine to dictate inputs, and suddenly I found myself more often &#8220;talking&#8221; to my workspace.</p><p>I started to absorb functionality I would previously use other tools for. Just because it was easier this way.</p><p>For example, I replaced my time tracker with a custom <code>time_entry</code> entity type. After a billable session, I would tell the agent what I did and for how long. The entries pool on an <code>invoice</code> entity for billing.</p><h3><strong>Stage 5: MCP on the move</strong></h3><p>I spend some (yes, some!) time away from my computer. When I get an idea or think of something I need to do, I want to access the Firm workspace. </p><p>So I added an MCP server. You run it locally with:</p><pre><code><code>firm mcp</code></code></pre><p>The MCP server provides validation, ensuring changes are valid and safe.</p><p>I put it in the cloud and added it as a custom connector in the Claude app. It connects to a remote git repository and makes changes on a dedicated branch. Now I can tell my bot secretary what I need, and it takes care of it.</p><p>I can also delegate: &#8220;Research potential clients in my area and log them as leads for my review&#8221;. Bot secretary does a decent job.</p><p>When I&#8217;m back at the PC, I review and merge to main. Every change is tracked and versioned.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ce8ed0a1-e423-438a-a0ce-aad7c057b2f6&quot;,&quot;duration&quot;:null}"></div><h2><strong>So&#8230; does the idea work?</strong></h2><p>To be honest, it&#8217;s hard to say for a bigger org. I&#8217;m trying not to get overly attached. I wanted to try it, iterate on it, and abandon if it turned out a waste of time.</p><p>But for me, the tool has progressively provided more value - as the data model expanded, as I customised workflows, and as I layered automations on top.</p><p>With scripting and bots, Firm is becoming a backbone of my business.</p><p>What I like about it is that <strong>this is enough</strong>. I don&#8217;t need as many tools. Firm enables this sort of &#8220;second brain&#8221; - from low-level note-taking to a holistic picture of my priorities, readily available to me and my bot.</p><p><strong>I should also say: where it is now, Firm is for technologists.</strong> It works for me because I like the command line.</p><p>But I&#8217;ve noticed that as I use MCP more, I&#8217;m less often in the terminal and more often just blabbering away. Chat as the interface.</p><p>That feels like a sci-fi dream coming true - not because of Firm specifically, but because of where AI is going. Voice transcription is good, language models are good. Tool calling is getting there. Firm fits right into that.</p><h2><strong>Why it works</strong></h2><p>Most structured data is machine-friendly but human-opaque. SQL tables, JSON blobs, protocol buffers. You need dashboards to make sense of it.</p><p>Most human-friendly formats are the opposite. Notes, documents, scribbles on a napkin. An LLM can parse them, but there&#8217;s no structure to verify against. Hard to know if the machine understood it correctly.</p><p><strong>Firm sits in a sweet spot.</strong> The DSL is structured enough to be verifiable - things can be right or wrong, and agents can self-correct. It&#8217;s the same reason that language models are good at coding. Firm brings that property to work management.</p><p>But the underlying data is just text. The bot can read it, but so can I. To catch mistakes and provide feedback. Version control gives me safety around automation.</p><p>Essentially:</p><blockquote><p><em>Firm creates a shared surface between bots and humans. Structure and verifiability for machines. Readable plain text and version control for me.</em></p></blockquote><p>I think it&#8217;s the thing that makes this approach work.</p><h2><strong>What&#8217;s next?</strong></h2><p>I increasingly see Firm as a data layer. I don&#8217;t want to add AI features to it. <strong>It&#8217;s a tool, not a platform.</strong> The value is in how it&#8217;s used together with other things.</p><p>I already log invoices in Firm. Could I integrate that with <a href="https://plaintextaccounting.org/">plain text accounting</a>? I write reports with <a href="https://typst.app/">Typst</a> and track them as file assets in Firm. What else can you connect?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!reSk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!reSk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!reSk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!reSk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!reSk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!reSk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png" width="1418" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67060,&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;:&quot;https://blog.42futures.com/i/187838891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.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_!reSk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!reSk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!reSk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!reSk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1883689-bfd7-4a51-adcf-f0f2db85ccf5_1418x870.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>When your business data is right there, structured and queryable, many workflows that usually require monolithic SaaS tools become <strong>a script or a prompt away</strong>.</p><p>I think that&#8217;s where this gets exciting: Firm as one tool in the &#8220;agentic toolbox&#8221;, where the prompt is your interface and structured data keeps the agents honest. Not adding intelligence to the data layer, but letting the intelligence sit on top, and giving it something good to work with.</p><p>As for the compliance question that started all of this - I&#8217;m working in a different context now, but the itch remains.</p><p>A year ago, this was an abstract idea. Now it&#8217;s a central component in how I run my business.</p><p>It works for me.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through production-ready software pilots.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Stop separating learning from building]]></title><description><![CDATA[Waterfall failed because it separated planning from execution. But we keep making that same distinction in different ways.]]></description><link>https://blog.42futures.com/p/stop-separating-learning-from-building</link><guid isPermaLink="false">https://blog.42futures.com/p/stop-separating-learning-from-building</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Tue, 20 Jan 2026 12:40:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lQ9v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In software projects, we sometimes think that we can draw a line between learning and building.</p><p>Figure it out first, then execute.</p><p>Explore, then exploit!</p><p>But when you&#8217;re creating new products, that line doesn&#8217;t exist. You learn by building. You build on learning. The learn/build ratio shifts over time, sure, but they never really separate.</p><p>Many would agree that Waterfall failed because it separated planning from execution. But we keep making that same distinction, only in different ways.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lQ9v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lQ9v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!lQ9v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!lQ9v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!lQ9v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lQ9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2700663,&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://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.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_!lQ9v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!lQ9v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!lQ9v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!lQ9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7a47f4f-3886-476a-ba50-503af9c9e316_1628x1028.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><h2><strong>3 ways to draw a line</strong></h2><p>Most software initiatives share a common goal:</p><ol><li><p>Figure out a great thing to build</p></li><li><p>Build said great thing</p></li><li><p>Release the thing</p></li><li><p>Profit!</p></li></ol><p>After you try it a few times, you realise that the process isn&#8217;t quite that linear. There&#8217;s uncertainty to grapple with.</p><p>We try to groom uncertainty by drawing boundaries. Through the stack, through phases, through scope. But these lines, though well-intentioned, tend to separate learning from doing.</p><p>That&#8217;s a problem, because learning and doing aren&#8217;t separable activities.</p><h3><strong>Stack boundaries</strong></h3><p>You can draw lines through the stack.</p><p><strong>Horizontal:</strong> layer by layer, bottom-up. Get the data layer right, then business logic, then UI. <em>&#8220;Software is like building a house&#8221;</em>, so you build the foundations first.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nkqc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nkqc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!Nkqc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!Nkqc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!Nkqc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nkqc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png" width="1418" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59018,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.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_!Nkqc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!Nkqc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!Nkqc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!Nkqc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f0785cc-4a29-44b8-b16f-37aa8cbf3011_1418x870.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>But unless you can anticipate what the final thing looks like, you end up with great foundations for a house you&#8217;re not building.</p><p><strong>Vertical:</strong> feature by feature, left to right. A thin slice through the whole stack: One complete thing you can test and ship.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vPDG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vPDG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!vPDG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!vPDG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!vPDG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vPDG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png" width="1418" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49593,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.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_!vPDG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!vPDG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!vPDG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!vPDG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74e246b4-4182-47fb-9730-bbbc8d855271_1418x870.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>Vertical is better than horizontal when facing uncertainty. But it doesn&#8217;t tell you what to build first. You could slice any feature - which one? And why? Without some ordering principle you end up wasting time on slices that miss the point entirely.</p><h3><strong>Phase boundaries</strong></h3><p>You can draw lines through time.</p><p>First we learn, then we build, then we test. That&#8217;s POCs for you: build a prototype, see if it works, then build the real thing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ojAZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ojAZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 424w, https://substackcdn.com/image/fetch/$s_!ojAZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 848w, https://substackcdn.com/image/fetch/$s_!ojAZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 1272w, https://substackcdn.com/image/fetch/$s_!ojAZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ojAZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png" width="1418" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32949,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.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_!ojAZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 424w, https://substackcdn.com/image/fetch/$s_!ojAZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 848w, https://substackcdn.com/image/fetch/$s_!ojAZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.png 1272w, https://substackcdn.com/image/fetch/$s_!ojAZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bac4c4-6229-4d75-b99e-1db396401ece_1418x430.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>POCs often fail in two ways:</p><ol><li><p>It&#8217;s too far from real product. The POC environment doesn&#8217;t match reality, so the lessons don&#8217;t transfer. You throw it away and learn new lessons.</p></li><li><p>It&#8217;s too close to real product. The POC ships, and now you&#8217;re maintaining cowboy code in production. That&#8217;s no fun either.</p></li></ol><p>You can&#8217;t really front-load learning like that. Building real product is how you find out what works.</p><h3><strong>Scope boundaries</strong></h3><p>You can draw lines through scope.</p><p>What&#8217;s in scope, what&#8217;s out of scope. An MVP: define the &#8220;minimum viable&#8221; thing, build that, ship it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AALN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AALN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!AALN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!AALN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!AALN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AALN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png" width="1418" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75058,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.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_!AALN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!AALN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!AALN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!AALN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F931d984c-4a52-4c81-baae-1398976a20d8_1418x870.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>But &#8220;minimum&#8221; according to whom? &#8220;Viable&#8221; how? Technically, commercially? Viable enough to&#8230; uh, learn from?</p><p>Too often, the &#8220;minimum viable&#8221; scope becomes whatever&#8217;s in budget. So we reverse engineer the &#8220;MVP&#8221; from constraints: we have X time and Y &#8364;, so the MVP is just whatever fits in that box.</p><p>This is deciding <strong>how much</strong> to build before clarifying <strong>what</strong> it is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ez_Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2172504,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.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_!Ez_Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!Ez_Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F908fbf92-f242-4cd3-9af9-e22bac4d849a_1628x828.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><h2><strong>There is only product</strong></h2><p>Product is the only tangible thing. You can have more of it, or less of it. Its content can be more or less central to the product idea.</p><p>And building real product teaches real lessons.</p><p>All three boundaries (stack, phase, scope) try to draw lines through a continuum. But the lines don&#8217;t map onto something real. There&#8217;s no such a thing as complete knowledge - typically, <strong>we&#8217;re partially ignorant throughout the entire process</strong>. That&#8217;s just the reality of creating something new.</p><p>So instead of pretending that we can separate learning from building, why not embrace it? Set up the process to maximise learning. Order the work by what teaches the best lessons.</p><p>If that sounds like a rehash of what agile practitioners were already saying, well, yeah, it is. Learning fosters adaptation.</p><p>The goal is to gain insight for sound software investment decisions. Are we building the right thing? Should we do it differently? Should we stop?</p><p>Here&#8217;s how I put these concepts into practice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lbGs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lbGs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!lbGs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!lbGs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!lbGs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lbGs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1660947,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.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_!lbGs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!lbGs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!lbGs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!lbGs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5245f2cf-4316-44b8-a7cb-b5d29bb4aee7_1628x828.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><h2><strong>How I run pilots</strong></h2><p>Critically, I&#8217;ve stopped asking &#8220;what&#8217;s the scope?&#8221; and started asking &#8220;what should we do first?&#8221;</p><h3><strong>Start with the big question</strong></h3><p>The first thing to figure out is what we want to learn. That&#8217;s just a question. A good question is answerable just like a scientific hypothesis is falsifiable.</p><p>Then we can list out high-level components that <em>might</em>help answer that question.</p><h3><strong>Order matters</strong></h3><p>Next, we order the work by:</p><ol><li><p><strong>Centrality</strong>: What is most likely to answer the question?</p></li><li><p><strong>Dependency</strong>: What depends on what?</p></li></ol><p>By centrality, I mean: how likely is this work to answer the big question? The most central work is what the whole premise stands on. If it doesn&#8217;t work, nothing else matters. If it does, we&#8217;ve validated something essential.</p><p>By dependency, I mean: some features don&#8217;t work without others. We can&#8217;t build recommendations without something to base recommendations on.</p><p>The first thing we build is the most central component that doesn&#8217;t depend on anything else. Then we work outward. What&#8217;s the next-most central thing we can do now that we have that? And the next?</p><p>We start with the highest learning potential, then expand.</p><h3><strong>There is no minimum</strong></h3><p>If we spend all our time on the core premise because that&#8217;s where the danger is, that&#8217;s time well spent. Either it works out, or we find fundamental flaws. That&#8217;s more helpful than building peripheral features.</p><p>In this line of thinking, minimum doesn&#8217;t exist. Only centrality matters.</p><h3><strong>Fix effort, not scope</strong></h3><p>But planning matters. Budgets matter. You can&#8217;t just say &#8220;give me infinite time and I&#8217;ll build whatever you need.&#8221;</p><p>A straightforward way to manage that risk is to fix the effort [1].</p><p>Fix the time and price. Order by centrality and dependency, then let the scope expand as you go. Build production software from day one [2], and you&#8217;ll be happy at any stopping point.</p><h3><strong>What we learn</strong></h3><p>Sometimes the solution is hard to find - a signal to stop.</p><p>Sometimes it proves viable quickly - a signal to continue.</p><p>If we maximise learning about the big question [3], we can make that decision quickly and confidently. Abandon, pivot, or expand.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9M7V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9M7V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!9M7V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!9M7V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!9M7V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9M7V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2820764,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.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_!9M7V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!9M7V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!9M7V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!9M7V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d0d9ff-5831-4b47-bd9e-c9e9bff6f348_1628x828.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><h2><strong>The planets model</strong></h2><p>To illustrate this thinking, I use a metaphor: planets.</p><p>Think of the Earth&#8217;s core. The molten center that sustains life on the crust. That&#8217;s a central component.</p><p>I work in concentric circles from the middle out. Each ring extends outwards from the last. We keep expanding until we&#8217;ve covered enough to answer the question.</p><p>Coverage is the ground we&#8217;ve covered so far. Not a fixed target, but a way to see progress. It grows organically as you move outward.</p><p>Adjacent features become &#8220;moons&#8221;: Smaller ideas orbiting the work. Unrelated questions become other &#8220;planets&#8221;: work you might tackle later.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oTsu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oTsu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 424w, https://substackcdn.com/image/fetch/$s_!oTsu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 848w, https://substackcdn.com/image/fetch/$s_!oTsu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!oTsu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oTsu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png" width="1418" height="1086" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1086,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:206195,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.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_!oTsu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 424w, https://substackcdn.com/image/fetch/$s_!oTsu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 848w, https://substackcdn.com/image/fetch/$s_!oTsu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.png 1272w, https://substackcdn.com/image/fetch/$s_!oTsu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c48843-54b9-46cb-9bac-a7f31ad3c55d_1418x1086.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>This is a way to communicate:</p><ul><li><p>What I&#8217;m focusing on</p></li><li><p>How I order the work</p></li><li><p>How components relate</p></li><li><p>How we&#8217;re doing on progress</p></li></ul><p><strong>Planets are not a fancy new methodology.</strong> They&#8217;re just a communication tool; A way I can discuss priorities without pretending to have a fixed plan.</p><h2><strong>Planets in practice</strong></h2><p>Let me share a real example to make things concrete.</p><p><strong>The project</strong>: EnergyMate, an app for post-cancer cognitive rehabilitation.</p><p><strong>The question</strong>: Can mobile technology help with cognitive rehab by making energy accounting more accessible?</p><p><strong>Mapping components</strong>: The client had already done a lot of thinking into what the app might do: energy logging, assessments, statistics, community, AI coaching, psychoeducation. Lots of ideas!</p><p><strong>Ordering by centrality</strong>: Where do we start? With energy logging. That&#8217;s the central component. Without energy logging, we can&#8217;t test if energy accounting helps and if mobile technology makes it easier.</p><p>From there, we expanded outward:</p><ul><li><p>Assessments (to measure progress)</p></li><li><p>Statistics (to see patterns)</p></li><li><p>Recommendations (to increase accessibility)</p></li><li><p>Educational resources (to explain the method)</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VSfC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VSfC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 424w, https://substackcdn.com/image/fetch/$s_!VSfC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 848w, https://substackcdn.com/image/fetch/$s_!VSfC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!VSfC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VSfC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png" width="1456" height="1111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1111,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:244402,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.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_!VSfC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 424w, https://substackcdn.com/image/fetch/$s_!VSfC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 848w, https://substackcdn.com/image/fetch/$s_!VSfC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.png 1272w, https://substackcdn.com/image/fetch/$s_!VSfC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fafc505-cb06-4109-8ff7-606b1d9de326_1578x1204.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>We focused on iOS, local-first, and left AI features for later. This increased optionality [4] while allowing us to maximise learning about the big question: does energy accounting with a mobile app actually help?</p><p><strong>The result</strong>: In 6 weeks, we had a working app ready for closed group testing. Real users, data and insights into whether the idea works.</p><p>It covers about half of the original vision, but it&#8217;s the <em>important half</em>. Complete enough to test with real people. Ready to release and extend: not just a demo.</p><p>We managed it in a short timeframe by changing the shape of the problem - ordering the work by centrality.</p><h2><strong>When it works</strong></h2><p>I find this way of working effective under uncertainty [5].</p><p>You&#8217;re working under uncertainty when:</p><ul><li><p>You have incomplete knowledge (don&#8217;t know the best solution)</p></li><li><p>The solution space is unknown (new technology or unproven markets)</p></li><li><p>System complexity makes outcomes hard to predict</p></li></ul><p>This describes many new software projects.</p><p>Working from centrality, you create the conditions to fail fast or succeed quickly. You maximise learning per unit of effort. The work you do is high-impact and unlikely to be thrown away.</p><p>More specifically, you create <em>real options</em> to:</p><ul><li><p><strong>Abandon</strong>: Filter out bad ideas early</p></li><li><p><strong>Pivot</strong>: Adjust based on evidence</p></li><li><p><strong>Expand:</strong> Invest in working software</p></li></ul><p>If you&#8217;re interested in the financial mechanics of real options, I&#8217;ve written way more here: <a href="https://blog.42futures.com/p/code-economics">https://blog.42futures.com/p/code-economics</a></p><h2><strong>When it doesn&#8217;t work</strong></h2><p>If you have complete knowledge, fixed requirements, or you&#8217;re working with commodity solutions (all situations with <em>low uncertainty</em>) then just <strong>make a plan and stick to it</strong>. No need to complicate things.</p><p>But lots of software projects aren&#8217;t like that.</p><p>That&#8217;s why I think this mindset matters.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HvCI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HvCI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!HvCI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!HvCI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!HvCI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HvCI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1741591,&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;:&quot;https://blog.42futures.com/i/185174329?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.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_!HvCI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!HvCI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!HvCI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!HvCI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115776d7-c730-4db0-9e58-7ec2f2a4fe08_1628x828.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><h2><strong>Conclusion</strong></h2><p>All these words to pitch for a shift.</p><p>A shift from asking:</p><ul><li><p>What&#8217;s minimum viable?</p></li><li><p>Should we explore or build?</p></li><li><p>What foundations do we need?</p></li></ul><p>, to asking:</p><ul><li><p>What&#8217;s the big question?</p></li><li><p>What&#8217;s more central to the question?</p></li><li><p>What depends on what?</p></li></ul><p>I&#8217;ve stopped drawing lines through scope, phases, or the stack. Instead, I work in circles: centrality, dependency and coverage.</p><p>The planet model helps me do that, and I think it&#8217;s a neat way to pritise work in software pilots that maximises learning to minimise risk.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div><h2><strong>Notes</strong></h2><p>[1] Fixing effort while varying scope isn&#8217;t a new idea - that&#8217;s common sense agile. But it works well when you order by centrality. You front-loaded the essential work, so any stopping point gives you something worthwhile. Compare that to pre-scoping an MVP: if you got the scope right, you&#8217;ve done the same thing with more planning overhead. If you got it wrong, you overspend or ship the wrong stuff. Fixing effort keeps all those options open: stop early, continue, or reassess.</p><p>[2] By &#8220;production software&#8221; I mean reliable, maintainable, robust code. You could deploy it and it works. I&#8217;m not saying you check off every non-functional requirement from day one. If you have specific needs (compliance, integrations, etc.), you may work them in as you go. The point is to avoid the POC trap of code that&#8217;s intended to be throwaway but either ships because &#8220;it kind of works&#8221; or fails to transfer because it only worked in isolation.</p><p>[3] This is like validated learning from Eric Ries&#8217;s Lean Startup, but applied to technical product. Lean Startup focused on commercial validation. Do people want this? You might test that with a landing page. For technical product validation we need to go further. Does this actually work? Does the concept hold up? To answer those questions, we need to build working software.</p><p>[4] Deferring decisions creates options. By not committing to things that aren&#8217;t central to the main question, you keep future paths open. The ability to change direction based on what you learn is valuable, especially early on when you know the least.</p><p>[5] Complex systems create uncertainty. Cause and effect is hard to link, so long-term planning doesn&#8217;t work that well. Optimization is a better approach: instead of trying to predict the best outcome, you step deliberately in a direction that looks good, assess, and step again. Think of it like navigating terrain: you can&#8217;t see the other side of the mountain, so you look at what&#8217;s around you and move based on that. Ordering by centrality is a way of picking those first steps.</p>]]></content:encoded></item><item><title><![CDATA[Everything you should know about confidential computing]]></title><description><![CDATA[What it is, how it works and if it&#8217;s worth your time]]></description><link>https://blog.42futures.com/p/confidential-computing</link><guid isPermaLink="false">https://blog.42futures.com/p/confidential-computing</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Tue, 25 Nov 2025 12:27:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mW94!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We encrypt data in storage and over the network, but what happens when we actually process it? Mostly, it&#8217;s sitting in memory, quite exposed.</p><p>A new frontier in data security is becoming production-ready. It&#8217;s called <strong>confidential computing</strong>, and it&#8217;s jumped straight up my list of <em>&#8220;exciting boring technologies&#8221;</em>.</p><p>In this post, we&#8217;ll explore confidential computing - what it is, how it works and if it&#8217;s worth your time.</p><h2><strong>TL;DR</strong></h2><p>Confidential computing closes a major security gap by protecting data while it&#8217;s <strong>in-use</strong>. With hardware-based &#8220;trusted execution environments&#8221;, it seals applications in a &#8220;black box&#8221; that is inaccessible to the host system or cloud provider. This enables verifiably private processing of sensitive data.</p><p>The technology is now practical: historical barriers of performance, cost and availability have largely been overcome with modern approaches. <strong>This makes it a strategic imperative for anyone handling regulated or highly sensitive data.</strong> For everyone else, it positions confidential computing as a future secure-by-default foundation of the cloud, making it a technology worth understanding today.</p><blockquote><p><em>In the near future, &#8220;confidential computing&#8221; will just be &#8220;computing.&#8221;<br></em><strong>Mark Russinovich, CTO at Azure</strong></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mW94!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mW94!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 424w, https://substackcdn.com/image/fetch/$s_!mW94!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 848w, https://substackcdn.com/image/fetch/$s_!mW94!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!mW94!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mW94!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png" width="728" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1098,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:2943216,&quot;alt&quot;:&quot;&quot;,&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://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mW94!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 424w, https://substackcdn.com/image/fetch/$s_!mW94!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 848w, https://substackcdn.com/image/fetch/$s_!mW94!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!mW94!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c8bc083-0c9e-49b2-aeb7-546ddd7b4972_1628x1228.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><h2><strong>The case for confidential computing</strong></h2><p>All modern businesses process sensitive data. Personal, financial, trade secrets. Keeping that stuff safe is pretty important, and one of the ways we do that is by using encryption.</p><p>Traditionally, we protect data:</p><ul><li><p><strong>In-transit:</strong> where we encrypt it as it travels from one system to another.</p></li><li><p><strong>At-rest:</strong> where we encrypt it before we store it.</p></li></ul><p>These measures help prevent unauthorized access through man-in-the-middle attacks, data breaches and physical theft. But when that data is decrypted to be processed, it&#8217;s exposed to anyone with insider access. The security of your application alone isn&#8217;t enough: vulnerabilities in the underlying operating system or hypervisor is part of the attack surface, too.</p><p>Confidential computing is a hardware-based technology that protects data and code <strong>in-use</strong>. It achieves this by having the processor create and enforce a dedicated processing environment, isolating your app from the host [1].</p><p>This solves big problems of trust. If an app is truly isolated, you don&#8217;t need to trust the operating system, the administrator, or your cloud provider. Just the hardware vendor. I&#8217;ve written previously on the <strong><a href="https://blog.42futures.com/p/your-data-their-rules">risks of hosting EU data with US public cloud providers</a></strong> and this kind of technology can mitigate some of those risks. As it happens, the US tech industry is pushing pretty hard for confidential computing these days [2].</p><p>There&#8217;s more to it, but let&#8217;s get some context first.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Guj0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Guj0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!Guj0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!Guj0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!Guj0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Guj0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65c707ea-243f-439f-8955-81d5486175a3_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1227465,&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;:&quot;https://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.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_!Guj0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!Guj0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!Guj0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!Guj0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c707ea-243f-439f-8955-81d5486175a3_1628x828.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><h2><strong>Privacy-preserving computation</strong></h2><p>The core idea isn&#8217;t new. It stretches all the way back to the late 70&#8217;s with Rivest, Adleman, and Dertouzos work on &#8220;private homomorphism&#8221; [3].</p><p>In the 90&#8217;s, the idea of &#8220;Trusted Computing&#8221; started to take hold. This popularised the concept of the &#8220;Trusted Platform Module&#8221;, which made its way into consumer technology in the 00&#8217;s, enabling use cases like disk encryption [4]. As of Windows 11, Microsoft requires it [5].</p><p>The next big thing is the invention of &#8220;Fully Homomorphic Encryption&#8221; in 2009, which enables computation on encrypted data [6]. That&#8217;s a huge leap forward (!), but also extremely slow [7].</p><p>At this point, practical hardware-based security solutions pick up in popularity. Apple introduces its &#8220;Secure Enclave&#8221; in 2013 [8] and in 2015, Intel launches &#8220;Software Guard Extensions&#8221; (SGX), designed for secure remote computation and DRM [9]. This causes a growth spurt in practical use cases for confidential computing, leading to the formation of the Confidential Computing Consortium (CCC) under the Linux Foundation in 2019 [10].</p><p><em>Fast-forward to now.</em></p><p>In hardware, the big dogs are in: <strong><a href="https://www.amd.com/en/developer/sev.html">AMD SEV-SNP</a></strong>, <strong><a href="https://www.arm.com/architecture/security-features/arm-confidential-compute-architecture">Arm CCA</a></strong>, Intel <strong><a href="https://www.intel.com/content/www/us/en/products/docs/accelerator-engines/software-guard-extensions.html">SGX</a></strong> + <strong><a href="https://www.intel.com/content/www/us/en/developer/tools/trust-domain-extensions/overview.html">TDX</a></strong>, and <strong><a href="https://www.nvidia.com/en-us/data-center/solutions/confidential-computing/">NVIDIA Confidential Computing</a></strong>.</p><p>In open source, we have projects like <strong><a href="https://github.com/edgelesssys/contrast">Contrast</a></strong> for Kubernetes, <strong><a href="https://github.com/microsoft/openvmm">OpenHCL</a></strong> for VMs, and <strong><a href="https://github.com/manatee-project/manatee">ManaTEE</a></strong>for data analysis.</p><p>The service providers are in, too. <strong><a href="https://azure.microsoft.com/en-us/solutions/confidential-compute">Azure</a></strong> has built a decent offering in confidential computing, like VMs, containers and managed services. European <strong><a href="https://www.stackit.de/en/product/stackit-confidential-kubernetes/">STACKIT</a></strong> provides confidential Kubernetes and VMs. We also have smaller vendors like <strong><a href="https://www.edgeless.systems/">Edgeless Systems</a></strong> with focused products like <strong><a href="https://www.privatemode.ai/">Privatemode AI</a></strong>.</p><h2><strong>How it works</strong></h2><p>There&#8217;s no doubt that the momentum is building for confidential computing. The real appeal is that it pushes trust down the stack: from trusting the software environment to trusting the computing hardware. That opens for new possibilities, like &#8220;data clean rooms&#8221;, privacy-preserving AI and bringing more sensitive workloads in the cloud.</p><p>But how does confidential computing establish that trust?</p><h3><strong>Trusted execution environments</strong></h3><p>It all begins with secure hardware. This is our &#8220;root of trust&#8221;. This, along with code designed to run within it, constitutes a &#8220;Trusted Execution Environment&#8221; (TEE).</p><p>Let&#8217;s take Intel SGX as an example:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mcwK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mcwK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!mcwK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!mcwK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!mcwK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mcwK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png" width="1418" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79684,&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;:&quot;https://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.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_!mcwK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 424w, https://substackcdn.com/image/fetch/$s_!mcwK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 848w, https://substackcdn.com/image/fetch/$s_!mcwK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.png 1272w, https://substackcdn.com/image/fetch/$s_!mcwK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02c4bd4c-0b9a-4257-abbe-95dd859324e3_1418x870.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><figcaption class="image-caption">A trusted execution environment in context of Intel SGX.</figcaption></figure></div><ol><li><p>An SGX-enabled processor (like Intel Xeon 6 [12]) reserves a region of main memory. This is where the processor will host &#8220;enclaves&#8221; which we can think of as &#8220;secure containers&#8221; for code and data.</p></li><li><p>When we create an enclave, our initial program is loaded from unprotected memory into enclave memory, passing through an encryption module using a key known only to the hardware itself.</p></li><li><p>When processor loads that data into its cache, it passes it through the same module to decrypt it.</p></li><li><p>When it writes data back, that is also encrypted. So on, and so forth.</p></li><li><p>The programmer of the enclaved process decides what is ultimately committed to unprotected memory: some aggregate plaintext result, something encrypted or nothing at all [13].</p></li></ol><p>The data is only ever plaintext <strong>inside the physical chip</strong>. Everything outside that boundary, including main memory, is encrypted. This creates a hardware-enforced black box that isolates the enclave from the host system.</p><p>While SGX pioneered this approach, newer technologies like Intel TDX and AMD SEV-SNP apply the same ideas of hardware-enforced memory encryption to entire virtual machines and containers, making it easier to adopt for existing apps.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v8b2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v8b2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!v8b2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!v8b2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!v8b2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v8b2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1923156,&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;:&quot;https://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.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_!v8b2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!v8b2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!v8b2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!v8b2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24761f0-8a78-481c-8c37-7bd3597de658_1628x828.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><h3><strong>Remote attestation</strong></h3><p>If you have the required hardware, you can compute confidentially. Provided you trust the manufacturer to have designed it properly. But how can you know the hardware is legit? That the vendor didn&#8217;t swap it? Or the host isn&#8217;t lying to you?</p><p>If we&#8217;re thinking in principles of &#8220;zero-trust&#8221;, a cloud operator can&#8217;t be implicitly trusted. &#8220;Trust me bro, I&#8217;ve got TEEs&#8221; isn&#8217;t enough. We need <strong>assurances</strong> that our code and data is secure [14].</p><p>That&#8217;s where attestation comes in. Attestation is the process that lets the hardware prove that it&#8217;s a geniuine TEE running your software. Think of it like certification. Here&#8217;s how it works:</p><ol><li><p>When an enclave is created, the processor fingerprints its initial code and data. This is called a <strong>measurement</strong>. Any change to the code will result in a different measurement.</p></li><li><p>The processor creates a document called a <strong>quote</strong> (or <strong>report</strong>) that contains the measurement and maybe other data you will want to verify.</p></li><li><p>The report is signed with a private key that was embedded in the processor at the factory. It&#8217;s like the processor&#8217;s identity.</p></li><li><p>Your remote system receives the signed report. It verifies the signature using public certificates from the hardware vendor. Then, it checks that the measurement inside the report matches the fingerprint of the software it expected to run [15].</p></li></ol><p>If these checks succeed, you have strong evidence that you&#8217;re interacting with your own, unmodified software inside a genuine trusted execution environment.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.42futures.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.42futures.com/subscribe?"><span>Subscribe now</span></a></p><h3><strong>Levels of isolation</strong></h3><p>Confidential computing isn&#8217;t one single thing - it&#8217;s a variety of technologies and solutions with different approaches and tradeoffs.</p><p>One of the central factors is how different technologies approach memory isolation. We have 3 primary models [16].</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G0U6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G0U6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 424w, https://substackcdn.com/image/fetch/$s_!G0U6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 848w, https://substackcdn.com/image/fetch/$s_!G0U6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 1272w, https://substackcdn.com/image/fetch/$s_!G0U6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G0U6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png" width="1456" height="707" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:707,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75319,&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;:&quot;https://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.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_!G0U6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 424w, https://substackcdn.com/image/fetch/$s_!G0U6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 848w, https://substackcdn.com/image/fetch/$s_!G0U6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.png 1272w, https://substackcdn.com/image/fetch/$s_!G0U6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F210c4258-242c-4f57-85d0-cb8db567ec6e_1628x790.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><strong>Code</strong></h4><p>This is the isolation model introduced by Intel SGX. It wraps individual applications or even specific functions in a secure enclave. This offers great protection, as the &#8220;trusted computing base&#8221; is only your application code. But it&#8217;s not plug-and-play.</p><h4><strong>Virtual Machine</strong></h4><p>Intel TDX and AMD SEV-SNP focus on isolating an entire VM, protecting its memory from the host hypervisor. This model works for &#8220;lift-and-shift&#8221; migrations of existing workloads to a confidential environment, no code changes needed. The trade-off is a larger &#8220;trusted computing base&#8221; because you must trust the guest OS inside the VM.</p><h4><strong>Container</strong></h4><p>Container-level isolation builds on the hardware features of VM isolation (like TDX and SEV-SNP) to create a solution that works for cloud-native setups. Instead of running a full OS, it uses a minimal, specialized runtime to launch the container within the hardware-protected memory boundary.</p><p>This approach is easier to adopt than code-level enclaves (no code changes needed) but offers a smaller attack surface than a full confidential VM, since you don&#8217;t need to trust an entire guest OS.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VaBX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VaBX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!VaBX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!VaBX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!VaBX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VaBX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4535352-66cd-4248-af37-05f22e9455fd_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2813941,&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;:&quot;https://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.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_!VaBX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!VaBX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!VaBX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!VaBX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4535352-66cd-4248-af37-05f22e9455fd_1628x828.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><h2><strong>Downsides</strong></h2><p>Okay, if confidential computing is so great, why isn&#8217;t it everywhere yet? Where&#8217;s that hype train?</p><h3><strong>Security</strong></h3><p>While confidential computing raises the bar for security, <strong>it&#8217;s not invincible</strong>.</p><p>Researchers have demonstrated physical side-channel attacks. A recent example is TEE.Fail, where a custom hardware device physically intercepts memory traffic to extract secrets [17]. Other attacks have successfully inferred data by looking at CPU power consumption patterns [18].</p><p>This shows that even with memory encryption, the physical hardware is still an attack vector.</p><h3><strong>Availability</strong></h3><p>The big players are in on confidential computing, but the hardware isn&#8217;t exactly everywhere.</p><p>Not all cloud providers offer confidential computing, and those that do, offer it for a subset of machines and services.</p><p>At this time, <strong><a href="https://azure.microsoft.com/en-us/solutions/confidential-compute">Microsoft Azure</a></strong> probably has the most expansive catalog.</p><h3><strong>Performance</strong></h3><p>Memory encryption isn&#8217;t free.</p><p>For code-level isolation with Intel SGX, the overhead can be significant. For some operations, enclaved code can be &gt;5x slower than native [19].</p><p>But when we look at VM/container-level isolation, the performance is much better. Just a few percentage points of overhead compared to equivalent unprotected cloud setups [20].</p><p>A 5x slowdown is a dealbreaker for most, but the minimal overhead of newer approaches is a far more acceptable compromise for the security it provides.</p><h3><strong>Costs</strong></h3><p>With the performance overhead described above, we can expect a slightly higher baseline cost per unit of work. Additionally, cloud providers tend to price confidential instances at a premium. This varies between vendors.</p><p>We also need to factor in, that development for confidential computing can be more complex. If we make use of code-level isolation, we&#8217;ll require special SDKs and a different way of thinking about app architecture.</p><p>At this time, I would expect to spend <strong>10-20% more</strong> on confidential workloads, depending on how you host.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UJM2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UJM2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!UJM2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!UJM2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!UJM2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UJM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1412351,&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;:&quot;https://blog.42futures.com/i/179911991?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.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_!UJM2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!UJM2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!UJM2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!UJM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0097e2-4d16-4a42-98fa-c6f6720c6233_1628x828.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><h2><strong>Is it worth your time?</strong></h2><p>It depends on what you&#8217;re building. You should actively explore it today if you:</p><h3><strong>Handle highly sensitive data:</strong></h3><p>If you&#8217;re working with medical records, financial data, proprietary AI models, the extra layer of hardware-enforced protection could be a big win.</p><h3><strong>Need to collaborate on private data:</strong></h3><p>If you need to involve multiple parties to analyse a shared dataset without revealing raw data between parties, confidential computing enables this with &#8220;data clean rooms&#8221; and collaborative AI training.</p><h3><strong>Are subject to strict data regulation:</strong></h3><p>If you&#8217;re navigating complex regulation like GDPR/CCPA/HIPAA/PCI DSS, confidential computing lets you do more while staying compliant. It helps you prove that not even a cloud provider can access your data.</p><h3><strong>Want to build true zero-trust architecture:</strong></h3><p>If your goal is to minimize trust in your infrastructure and provider, confidential computing is the next frontier. It allows you to &#8220;assume breach&#8221; of the host environment and still protect your workload.</p><h3><strong>For everyone else...</strong></h3><p>The benefit will probably arrive silently. As the technology becomes more widespread and costs decrease, it is on a solid trajectory to become the default, secure foundation for the cloud.</p><p>And while &#8220;encrypting data in-use&#8221; is a good shorthand, the real innovation is the practical approach - a hardware-sealed black box, where data is only ever plaintext for the briefest of moments inside the box itself.</p><p>This is the idea that finally allows us to protect data through its entire lifecycle: <strong>at-rest</strong>, <strong>in-transit</strong>, and now, <strong>in-use</strong>. It might not be long before, as Russinovich said, <strong>&#8220;confidential computing&#8221; will just be &#8220;computing&#8221;</strong>.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div><h2><strong>Sources</strong></h2><p>[1] <a href="https://www.linuxfoundation.org/hubfs/Research%20Reports/TheCaseforConfidentialComputing_071124.pdf">https://www.linuxfoundation.org/hubfs/Research%20Reports/TheCaseforConfidentialComputing_071124.pdf</a></p><p>[2] <a href="https://www.abiresearch.com/press/the-advent-of-gpu-based-confidential-compute-is-set-to-revolutionize-the-confidential-computing-market">https://www.abiresearch.com/press/the-advent-of-gpu-based-confidential-compute-is-set-to-revolutionize-the-confidential-computing-market</a></p><p>[3] <a href="https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/RAD78.pdf">https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/RAD78.pdf</a></p><p>[4] Trusted Computing by Denggue Feng, Yu Qin, Xiaobo Chu, Shijun Zhao, 2017</p><p>[5] <a href="https://support.microsoft.com/en-us/windows/enable-tpm-2-0-on-your-pc-1fd5a332-360d-4f46-a1e7-ae6b0c90645c">https://support.microsoft.com/en-us/windows/enable-tpm-2-0-on-your-pc-1fd5a332-360d-4f46-a1e7-ae6b0c90645c</a></p><p>[6] <a href="https://en.wikipedia.org/wiki/Homomorphic_encryption">https://en.wikipedia.org/wiki/Homomorphic_encryption</a></p><p>[7] <a href="https://arxiv.org/pdf/2501.18371">https://arxiv.org/pdf/2501.18371</a></p><p>[8] <a href="https://eclecticlight.co/2025/08/30/a-brief-history-of-the-secure-enclave/">https://eclecticlight.co/2025/08/30/a-brief-history-of-the-secure-enclave/</a></p><p>[9] <a href="https://en.wikipedia.org/wiki/Software_Guard_Extensions">https://en.wikipedia.org/wiki/Software_Guard_Extensions</a></p><p>[10] <a href="https://www.linuxfoundation.org/press/press-release/confidential-computing-consortium-establishes-formation-with-founding-members-and-open-governance-structure-2">https://www.linuxfoundation.org/press/press-release/confidential-computing-consortium-establishes-formation-with-founding-members-and-open-governance-structure-2</a></p><p>[11] <a href="https://dualitytech.com/blog/data-clean-room/">https://dualitytech.com/blog/data-clean-room/</a></p><p>[12] <a href="https://www.intel.com/content/www/us/en/architecture-and-technology/software-guard-extensions-processors.html">https://www.intel.com/content/www/us/en/architecture-and-technology/software-guard-extensions-processors.html</a></p><p>[13] <a href="https://eprint.iacr.org/2016/086.pdf">https://eprint.iacr.org/2016/086.pdf</a></p><p>[14] Zero Trust Networks by Razi Rais, Christina Morillo, Evan Gilman, Doug Barth, 2024</p><p>[15] <a href="https://edera.dev/stories/remote-attestation-in-confidential-computing-explained">https://edera.dev/stories/remote-attestation-in-confidential-computing-explained</a></p><p>[16] Azure Confidential Computing and Zero Trust by Razi Rais, Jeff Birnbaum, Graham Bury, Vikas Bhatia, 2023</p><p>[17] <a href="https://thehackernews.com/2025/10/new-teefail-side-channel-attack.html">https://thehackernews.com/2025/10/new-teefail-side-channel-attack.html</a></p><p>[18] <a href="https://arxiv.org/pdf/2405.06242v1">https://arxiv.org/pdf/2405.06242v1</a></p><p>[19] <a href="https://www.ibr.cs.tu-bs.de/users/weichbr/papers/middleware2018.pdf">https://www.ibr.cs.tu-bs.de/users/weichbr/papers/middleware2018.pdf</a></p><p>[20] <a href="https://dl.acm.org/doi/10.1145/3696843.3696848">https://dl.acm.org/doi/10.1145/3696843.3696848</a></p>]]></content:encoded></item><item><title><![CDATA[Your data, their rules]]></title><description><![CDATA[The growing risks of hosting EU data in the US cloud]]></description><link>https://blog.42futures.com/p/your-data-their-rules</link><guid isPermaLink="false">https://blog.42futures.com/p/your-data-their-rules</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Sun, 26 Oct 2025 19:58:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Bt94!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So, AWS was down recently. It took down a chunk of the internet with it, too. The outage was caused by an operational issue in US-EAST-1, one of AWS&#8217; primary regions. A problem with DynamoDB snowballed to impact many critical services.</p><p>It&#8217;s a big deal and it&#8217;s not. Sometimes, cloud providers have outages. Doesn&#8217;t matter where you host. But when something bad happens in a US public cloud, it&#8217;s jarring to see the degree of trouble that causes in the EU as well.</p><p>That&#8217;s what I want to focus on here: How European digital infrastructure relies on a handful of US companies, the risks it poses, and what we can do about it.</p><p>To clarify, we need to answer three questions:</p><ul><li><p>Is hosting EU services in US clouds still a good idea?</p></li><li><p>What are the options for EU-sovereign hosting?</p></li><li><p>How should an EU business choose its hosting strategy?</p></li></ul><p>Let&#8217;s get into it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bt94!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bt94!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!Bt94!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!Bt94!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!Bt94!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bt94!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png" width="728" height="370.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:2935013,&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://blog.42futures.com/i/177196431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Bt94!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!Bt94!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!Bt94!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!Bt94!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8b46fd-1908-438d-917b-6679ec15bd92_1628x828.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><h2><strong>The cloud race is over: US hyperscalers won</strong></h2><p>This probably won&#8217;t surprise you. Today, most businesses have adopted the cloud. As many 90% of them, according to a 2021 O&#8217;Reilly survey [1]. The vast majority of that cloud capacity is provided by the &#8220;Big Three&#8221;: AWS, Azure and Google Cloud, in that order [2].</p><p>The advent of cloud offered many benefits: faster iteration, scalability and cost savings through consumption-based billing plus economies of scale. Although businesses migrating to the cloud had varied cost savings success (&#8211;144% to +500%) [3], I think for a long time the Big Three delivered on their core promise.</p><p>So they won hard, and they won globally. To a point where they now hold massive leverage over today&#8217;s internet businesses. That&#8217;s when the dynamic starts shifting.</p><h2><strong>Squeezing the lemon</strong></h2><p>That&#8217;s a Danish saying, by the way. You use it when someone exploits a situation fully, to their own benefit. But if you squeeze a lemon too hard, it runs out of juice.</p><p>Global cloud spend is going up. Of course it is, because more businesses are using more cloud. At the same time, ~80% of businesses report that their cloud spend is higher than expected, according to a 2024 CloudZero survey [4]. That number has been going up too.</p><p><strong>Wasn&#8217;t cloud supposed to be cheaper?</strong> Well. We have seen the Big Three reduce prices over time, but they&#8217;re not tracking with effeciency gains in available hardware. In 2014, Google Cloud reported that hardware costs improved 20-30% annually while public cloud prices only fell by 8% a year [5]. Google&#8217;s cloud platform pricing would start following the Moore&#8217;s Law curve, announcing price reductions on various core offerings.</p><p>In 2022, Google announced a 50% price hike for multi-region nearline storage and a doubling of storage network fees [6]. AWS has hiked prices too, for example through the introduction of the Public IPv4 Charge [7]. I have my own anecdotes for Azure, like when they deprecated Azure CDN in favour of Front Door, forcing us to take on new idle fees and an effective downgrade to our Web Application Firewall if we didn&#8217;t pay up for the &#8220;Premium&#8221; SKU.</p><p>These days, AWS operating margins are approaching 40% [8], quite the step up from 28% back in 2015 [9]. You have to wonder how these cloud companies are getting rich so much quicker than the rest of us.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KxKO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KxKO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!KxKO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!KxKO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!KxKO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KxKO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2490642,&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;:&quot;https://blog.42futures.com/i/177196431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.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_!KxKO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!KxKO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!KxKO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!KxKO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f57c9b3-2e14-4086-a48a-2a73298713a2_1628x828.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><h2><strong>US-EU relationship strain</strong></h2><p>Putting aside how we each might feel about the current US administration, it&#8217;s clear that the situtation is posing a risk to European businesses.</p><p>First, there&#8217;s the US CLOUD Act, signed into law by Donald Trump in 2018 [10].</p><p>The CLOUD Act lets US law enforcement compel American companies to provide access to data stored abroad, even if that data is in a European data center and belongs to a non-US entity.</p><p>It gives the US government the ability to access data controlled by American-owned clouds without the cooperation of (or disclosure to) European authorities. This conflicts with Europe&#8217;s GDPR, which seeks to protect the privacy of EU citizens by preventing their personal information to be transfered without legal basis [11].</p><p>Then we have the &#8220;kill switch&#8221; story. Following the arrest warrants for Isreali officials issued by the International Criminal Court, the ICC chief prosecutor lost access to his Microsoft email account as sanctioned by the US government [12]. While there is contention over the details, this has sparked serious discussions about over-reliance on US digital infrastructure by EU authorities.</p><h2><strong>Concentration risk</strong></h2><p>Time for a reality check.</p><p><strong>We must expect that corporations will maximise shareholder profit.</strong> Corporations are supposed to do that.</p><p><strong>We must expect that authoritarian governments will maximise their reach.</strong> In their frame of mind, that&#8217;s rational.</p><p>But the over-concentration on three US-owned cloud providers is leaving EU consumers exposed. We see that reflected in growing cloud spend, shrinking control over European data, and an increasing barrier to exit due to vendor lock-in and borderline anti-competitive behaviour [13].</p><p>That doesn&#8217;t mean that everyone should stop using the Big Three, though. It also doesn&#8217;t mean we, in the EU, need to get rid of all US technology services. But I think it would be healthy for European business leaders to ponder:</p><p><strong>Do you think this trajectory is headed for better or for worse?</strong></p><p>If you think worse, figuring out how to reduce your dependency on the Big Three could be a smart strategy. Let&#8217;s explore the alternatives so you can make an informed choice about what to do next.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5lFl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5lFl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!5lFl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!5lFl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!5lFl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5lFl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1260530,&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;:&quot;https://blog.42futures.com/i/177196431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.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_!5lFl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!5lFl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!5lFl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!5lFl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F548a4a28-d4b3-49c3-8375-2d15950057cd_1628x828.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><h2><strong>EU-sovereign public clouds</strong></h2><p>As we focus on the Big Three, we sometimes forget that European public cloud offerings exist. They generally have less features, fewer datacenters and modest service level objectives. But there are solid, (actually) EU-sovereign clouds - good enough for many use cases.</p><p>Hetzner Cloud is is a popular choice for EU and US businesses looking to optimise cloud cost. They&#8217;re based out of Germany, and offer IaaS through datacenters in Central Europe, South-East Asia and the US [14]. Managed services for Kubernetes and databases might be coming [15], but for now, you would have to roll your own or add a PaaS layer with something like Coolify [16]. On the positive, Hetzner is cheaper than most competitors by quite a margin [17].</p><p>If you&#8217;re looking for managed services, you could consider Scaleway. They&#8217;re based in France, and their offerings span wider, including serverless [18] and managed services for Kubernetes [19], Postgres, MySQL, MongoDB, Redis [20]. On some parameters, Scaleway is cheaper than AWS, but it depends how you compare them [21]. A limiting factor is that they only have datacenters in the EU [22].</p><p>Finally, I&#8217;ll mention OVHcloud. Another French cloud provider. Of the options I&#8217;ve listed, OVHcloud has the broadest regional coverage with 43 datacenters across Europe, North America and Asia Pacific [23]. Like Scaleway, they provide managed Kubernetes [24], databases [25] and more. OVHcloud is typically cheaper than AWS, but again, it depends [26].</p><p>As you can see, the feature set and regional coverage varies by provider, but they have this in common:</p><ul><li><p>They can probably host your apps (with some migration effort)</p></li><li><p>They are European-owned and comply with EU regulations</p></li><li><p>They are generally cheaper to use</p></li></ul><p>Something to keep in mind here is vendor lock. EU public cloud providers appear more open than US ones. But if we migrate from the Big Three to one of these, we ultimately swap one proprietary dependency for another. Each business will have to assess if that&#8217;s an acceptable risk.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.42futures.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.42futures.com/subscribe?"><span>Subscribe now</span></a></p><h2><strong>Your own cloud</strong></h2><p>You don&#8217;t have to be a renter to use cloud technologies. Over the years, open source has been catching up on cloud software. If you can put up the CapEx and deal with the operational complexity, running cloud-native workloads on your own hardware is a viable option.</p><p>Enter OpenStack, an open source cloud software project which was co-founded by NASA and RackSpace in 2010 [27]. OpenStack is popular among large European organizations such as CERN, Deutsche Telekom and Banco Santander [28]. It&#8217;s modular platform provides what you need for elastic storage, compute, networking and auth.</p><p>OpenStack isn&#8217;t the only option, either. There&#8217;s CloudStack, OpenNebula and proxmox, each with their own characteristics that suit them to different use cases [29].</p><p>On the hardware side, we have Oxide. They build specialised cloud computing hardware that ships with cloud platform software, ready to go [30]. Buy Oxide racks and start building.</p><p>Though all these approaches have matured significantly over the years, they&#8217;re not at feature parity with the US public clouds for managed services. Your engineering team will need to fill in some blanks if you adopt these technologies.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hDxu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hDxu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!hDxu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!hDxu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!hDxu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hDxu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1896513,&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;:&quot;https://blog.42futures.com/i/177196431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.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_!hDxu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!hDxu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!hDxu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!hDxu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e16fd6-24ce-4416-a6f4-8de817ce14c8_1628x828.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><h2><strong>Bare metal</strong></h2><p>Another way to reduce your dependency on cloud providers is by leaving the cloud altogether. In 2022, 37signals (creators of Basecamp and HEY) made waves by announcing they would do that: exit the cloud and revert to the &#8220;old ways&#8221; of hosting with owned hardware [31].</p><p>Buy servers, rent a rack, put them in it and run your applications on them. If your traffic patterns are predictable and your application architecture isn&#8217;t too complex, running on your own hardware offers long-term cost savings and vendor independence. The tradeoff is a higher capital cost and a bigger (or at least different) operational burden.</p><p>David Heinemeier Hansson&#8217;s chronicle on the 37signals cloud exit is worth a read. It was a bold, but appropriate choice for them. Their application architecture was well-suited [32], they had scale with predictable growth [33], they had $600k to spend on hardware [34] and an ops team that could pull it off [35].</p><p>At scale, there is a strong financial case to be made for bringing home your cloud workloads. Sarah Wang and Martin Casado of a16z put it nicely: <em>&#8220;You&#8217;re crazy if you don&#8217;t start in the cloud; you&#8217;re crazy if you stay on it&#8221;</em> [36].</p><p>But how do you decide whether to make the leap?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!COAD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!COAD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!COAD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!COAD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!COAD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!COAD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2553897,&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;:&quot;https://blog.42futures.com/i/177196431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.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_!COAD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!COAD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!COAD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!COAD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a729b85-254d-464f-87aa-736f5ce2238a_1628x828.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><h2><strong>Weighing the tradeoffs</strong></h2><p>Choosing a technology platform is a sticky decision with long-term consequences. Each option presents a trade-off: a benefit in one dimension costs you in another.</p><p>Here are some factors to weigh against your business constraints.</p><h3><strong>Short-term cost-effectiveness</strong></h3><p>How important is minimising initial spend? Pay-as-you-go and managed services of public clouds reduce the barrier to entry when cash is tight.</p><h3><strong>Long-term cost-effectiveness</strong></h3><p>Are we optimising for the next five years? As you scale, rental costs add up. Self-hosting requires upfront investment but can lower your total cost of ownership.</p><h3><strong>Data sovereignty</strong></h3><p>Who controls your data? A US-owned cloud is subject to the US CLOUD Act. EU-sovereign infrastructure keeps your data under European law.</p><h3><strong>Vendor independence</strong></h3><p>How much control do you want to retain? Building on proprietary services creates dependency. Self-hosting or open source solutions offer independence at the cost of operational complexity.</p><h3><strong>Workload elasticity</strong></h3><p>Is your traffic predictable or spiky? The Big Three excel at on-demand elasticity for unpredictable workloads. If your growth is stable, other options are more cost-effective.</p><h3><strong>Availability</strong></h3><p>What uptime do you actually need? Hyperscalers sell high-availability guarantees, but they&#8217;re expensive. Before paying for a 99.99% SLA, weigh the premium against the actual cost of downtime. Is it a crisis or an inconvenience?</p><h3><strong>Regional coverage</strong></h3><p>Where are your users? Performance means being physically close to them. The Big Three have a global footprint, while European providers are well-suited to customer bases primarily in the EU.</p><p><strong>Putting these into your own business context is important:</strong></p><p>A global hypergrowth startup with unpredictable traffic will benefit from hosting with the Big Three.</p><p>An non-tech B2B business with European customers will benefit from hosting with EU-sovereign public clouds.</p><p>An established tech business where margins matter might benefit from hosting on bare metal.</p><p>An EU enterprise that values elasticity with predictable spend could benefit from running their own open-source cloud.</p><p>There is no silver bullet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_oQi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_oQi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!_oQi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!_oQi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!_oQi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_oQi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5908d277-8301-4245-9d75-7c286aea602d_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2383722,&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;:&quot;https://blog.42futures.com/i/177196431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.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_!_oQi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!_oQi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!_oQi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!_oQi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5908d277-8301-4245-9d75-7c286aea602d_1628x828.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><h2><strong>Conclusion</strong></h2><p>At the beginning I asked three questions. Let&#8217;s see if we can answer them now.</p><h3><strong>Is hosting EU services in US clouds still a good idea?</strong></h3><p>For EU businesses, the answer is increasingly no. The current concentration on the Big Three is creating unfavourable market conditions, and the current political landscape poses a risk to European data security.</p><h3><strong>What are the options for EU-sovereign hosting?</strong></h3><p>There are several EU-sovereign public cloud offerings to choose from. These are typically the most direct migration path. But as we have seen, self-hosting with bare metal or even your own cloud is also a possibility.</p><h3><strong>How should an EU business choose its hosting strategy?</strong></h3><p>It&#8217;s a multivariate problem. You must weigh each option based on its fit to your business context and strategy. I highlighted concrete factors to consider, like short/long-term cost, sovereignty, independence, elasticity, availability and regional coverage needs.</p><p>As you will have gathered by now, there is a lot of nuance to the EU-US cloud dependency conundrum. I hope this post has provided you with tools for figuring out what you want to do about it.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div><h2><strong>Sources</strong></h2><p>[1] <a href="https://www.oreilly.com/radar/the-cloud-in-2021-adoption-continues">https://www.oreilly.com/radar/the-cloud-in-2021-adoption-continues</a></p><p>[2] <a href="https://www.statista.com/chart/18819/worldwide-market-share-of-leading-cloud-infrastructure-service-providers">https://www.statista.com/chart/18819/worldwide-market-share-of-leading-cloud-infrastructure-service-providers</a></p><p>[3] Caesar Wu, Rajkumar Buyya, Cloud Data Centers and Cost Modeling (Part 1, Chapter 1)</p><p>[4] <a href="https://www.cloudzero.com/state-of-cloud-cost/">https://www.cloudzero.com/state-of-cloud-cost/</a></p><p>[5] <a href="https://developers.googleblog.com/en/google-cloud-platform-live-blending-iaas-and-paas-moores-law-for-the-cloud/">https://developers.googleblog.com/en/google-cloud-platform-live-blending-iaas-and-paas-moores-law-for-the-cloud/</a></p><p>[6] <a href="https://cloud.google.com/storage/pricing-announce">https://cloud.google.com/storage/pricing-announce</a></p><p>[7] <a href="https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/">https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/</a></p><p>[8] <a href="https://www.cnbc.com/2024/10/31/amazons-cloud-unit-records-highest-profit-margin-in-at-least-a-decade.html">https://www.cnbc.com/2024/10/31/amazons-cloud-unit-records-highest-profit-margin-in-at-least-a-decade.html</a></p><p>[9] <a href="https://en.wikipedia.org/wiki/Amazon_Web_Services">https://en.wikipedia.org/wiki/Amazon_Web_Services</a></p><p>[10] <a href="https://en.wikipedia.org/wiki/CLOUD_Act">https://en.wikipedia.org/wiki/CLOUD_Act</a></p><p>[11] <a href="https://wire.com/en/blog/cloud-act-eu-data-sovereignty">https://wire.com/en/blog/cloud-act-eu-data-sovereignty</a></p><p>[12] <a href="https://www.politico.eu/article/donald-trump-eu-internet-europe-us-trade-war-data-cyber/">https://www.politico.eu/article/donald-trump-eu-internet-europe-us-trade-war-data-cyber/</a></p><p>[13] <a href="https://www.sdxcentral.com/news/anti-competitive-cloud-practices-threaten-13tn-eu-economic-impact-lobbying-group-claims/">https://www.sdxcentral.com/news/anti-competitive-cloud-practices-threaten-13tn-eu-economic-impact-lobbying-group-claims/</a></p><p>[14] <a href="https://docs.hetzner.com/cloud/general/locations/">https://docs.hetzner.com/cloud/general/locations/</a></p><p>[15] <a href="https://www.reddit.com/r/hetzner/comments/18yhy89/seems_like_we_are_finally_getting_managed/">https://www.reddit.com/r/hetzner/comments/18yhy89/seems_like_we_are_finally_getting_managed/</a></p><p>[16] <a href="https://coolify.io">https://coolify.io</a></p><p>[17] <a href="https://dev.to/dkechag/cloud-provider-comparison-2024-vm-performance-price-3h4l#performance-price-on-demand-pay-as-you-go">https://dev.to/dkechag/cloud-provider-comparison-2024-vm-performance-price-3h4l#performance-price-on-demand-pay-as-you-go</a></p><p>[18] <a href="https://www.scaleway.com/en/serverless/">https://www.scaleway.com/en/serverless/</a></p><p>[19] <a href="https://www.scaleway.com/en/kubernetes-kapsule/">https://www.scaleway.com/en/kubernetes-kapsule/</a></p><p>[20] <a href="https://www.scaleway.com/en/cloud-database-solutions/">https://www.scaleway.com/en/cloud-database-solutions/</a></p><p>[21] <a href="https://getdeploying.com/aws-vs-scaleway">https://getdeploying.com/aws-vs-scaleway</a></p><p>[22] <a href="https://www.scaleway.com/en/docs/account/reference-content/products-availability/">https://www.scaleway.com/en/docs/account/reference-content/products-availability/</a></p><p>[23] <a href="https://www.ovhcloud.com/en/datacenters-ovhcloud/">https://www.ovhcloud.com/en/datacenters-ovhcloud/</a></p><p>[24] <a href="https://www.ovhcloud.com/en/public-cloud/kubernetes/">https://www.ovhcloud.com/en/public-cloud/kubernetes/</a></p><p>[25] <a href="https://www.ovhcloud.com/en/public-cloud/databases/">https://www.ovhcloud.com/en/public-cloud/databases/</a></p><p>[26] <a href="https://getdeploying.com/aws-vs-ovh">https://getdeploying.com/aws-vs-ovh</a></p><p>[27] <a href="https://openmetal.io/resources/blog/who-is-using-openstack/">https://openmetal.io/resources/blog/who-is-using-openstack/</a></p><p>[28] <a href="https://www.openstack.org/use-cases/#location=europe">https://www.openstack.org/use-cases/#location=europe</a></p><p>[29] <a href="https://storpool.com/blog/4-leading-cloud-management-platforms-you-need-to-consider">https://storpool.com/blog/4-leading-cloud-management-platforms-you-need-to-consider</a></p><p>[30] <a href="https://oxide.computer">https://oxide.computer</a></p><p>[31] <a href="https://basecamp.com/cloud-exit">https://basecamp.com/cloud-exit</a></p><p>[32] <a href="https://medium.com/signal-v-noise/the-majestic-monolith-29166d022228">https://medium.com/signal-v-noise/the-majestic-monolith-29166d022228</a></p><p>[33] <a href="https://world.hey.com/dhh/don-t-be-fooled-by-serverless-776cd730">https://world.hey.com/dhh/don-t-be-fooled-by-serverless-776cd730</a></p><p>[34] <a href="https://world.hey.com/dhh/we-stand-to-save-7m-over-five-years-from-our-cloud-exit-53996caa">https://world.hey.com/dhh/we-stand-to-save-7m-over-five-years-from-our-cloud-exit-53996caa</a></p><p>[35] <a href="https://world.hey.com/dhh/the-big-cloud-exit-faq-20274010">https://world.hey.com/dhh/the-big-cloud-exit-faq-20274010</a></p><p>[36] <a href="https://a16z.com/the-cost-of-cloud-a-trillion-dollar-paradox/">https://a16z.com/the-cost-of-cloud-a-trillion-dollar-paradox/</a></p>]]></content:encoded></item><item><title><![CDATA[Code economics]]></title><description><![CDATA[Beyond the feature factory]]></description><link>https://blog.42futures.com/p/code-economics</link><guid isPermaLink="false">https://blog.42futures.com/p/code-economics</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Wed, 08 Oct 2025 08:33:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_rOM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png" 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_!_rOM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_rOM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 424w, https://substackcdn.com/image/fetch/$s_!_rOM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 848w, https://substackcdn.com/image/fetch/$s_!_rOM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!_rOM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_rOM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png" width="1456" height="1098" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1098,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2955581,&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://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.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_!_rOM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 424w, https://substackcdn.com/image/fetch/$s_!_rOM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 848w, https://substackcdn.com/image/fetch/$s_!_rOM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.png 1272w, https://substackcdn.com/image/fetch/$s_!_rOM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2f98bd-f2c9-4789-9281-8c5633afd5b7_1628x1228.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>Over time, software folks come to appreciate <strong>adaptability</strong>. Building something once, and having it keep working: elastic, scalable, elegant, serving any which need.</p><p>That&#8217;s an intuition for the value of <strong>platforms and learning</strong>. But justifying that intuition in the business context can be difficult.</p><p>When we build software, we invest. Time and money spent on this, not the other. So we want to pick good investments. Software with <em><strong>&#8220;a good ROI&#8221;.</strong></em></p><p>Financial methods can help us value software investments in a way that ties directly business outcomes. But traditional valuation methods underestimate the power of platforms and learning because they can&#8217;t capture the value of strategic flexibility and uncertainty management.</p><p>In this post, I want to dive into the <strong>financial mechanics of software investment</strong> to highlight where traditional analysis falls short, and show you how to measure the value of adaptability.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R-mK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R-mK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!R-mK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!R-mK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!R-mK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R-mK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2013893,&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;:false,&quot;internalRedirect&quot;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.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_!R-mK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!R-mK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!R-mK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!R-mK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff00b75b6-947a-4e84-aa94-bb5b66518694_1628x828.png 1456w" sizes="100vw"></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><h2>Three types of software investment</h2><p>Let&#8217;s get this out of the way first: A business wants to make money, save money, or do both later. Commercial software exists to serve these goals.</p><p>At a macro level, we can think about software investment in three categories:</p><h4><strong>Features create value now</strong></h4><p>Build a checkout flow -&gt; people can buy -&gt; number goes up. The path from investment to return is quite direct.</p><h4><strong>Platforms create future options</strong></h4><p>Build an SDK -&gt; enable new features -&gt; build some of those features -&gt; number goes up. The value is in the flexibility of future investments.</p><h4><strong>R&amp;D manages uncertainty</strong></h4><p>Run a pilot -&gt; learn what works -&gt; make better investments -&gt; number goes up. The value is in discovering good investments.</p><p>Most businesses benefit from a healthy mix of these three things.</p><p><em>&#8220;Feature factory&#8221;</em> gets thrown around like a derogatory term, but actually: Features are solid short-term investments because they make money faster. Making &#8364;1 today is better than making &#8364;1 tomorrow. Where feature factories go wrong is when they fail to balance that with options in the long term. Going only for quick wins, you&#8217;ll miss a better long play.</p><p>Part of the problem is that we, in software, struggle to show how platforms and learning create business value. The value of features is easily understood (build this, get that), but the rest is a bit harder to reason about. To do that, we need the right financial tools.</p><p>When we&#8217;re through, I hope to have shown you that adaptability has value, and with the right inputs, we can put a number to it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7JvG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7JvG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!7JvG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!7JvG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!7JvG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7JvG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1751872,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.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_!7JvG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!7JvG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!7JvG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!7JvG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71e7da50-531e-4de9-aea7-2a1ea58d87ca_1628x828.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><h2><strong>A software portfolio</strong></h2><p>Consider a (fictional) vacation rental platform. The platform manages bookings for property owners and processes &#8364;10M in monthly bookings, earning a 10% commission (&#8364;1M monthly, &#8364;12M annually).</p><p>The team is arguing over product roadmap. They have engineering capacity for a few new projects, but several good ideas are on the table. Each idea promises growth, retention or new opportunities, but resources are limited.</p><p>Here&#8217;s what they&#8217;re considering:</p><h3><strong>Feature: Instant booking</strong></h3><p>Let guests book immediately without owner approval, for a higher conversion rate.</p><h3><strong>Feature: Auto-reply</strong></h3><p>Pre-written templates for check-in, house rules, and checkout, saving property managers time, improving retention.</p><h3><strong>Platform: Public booking API</strong></h3><p>Enable property managers to add booking on their own platforms. Could attract more and larger property managers.</p><h3><strong>R&amp;D: Dynamic pricing</strong></h3><p>Test if ML-based pricing can beat simple rules. This could increase revenue, but the feasibility of the idea is unknown.</p><p>How should they prioritize the work? We can evaluate the portfolio using progressively strategic financial methods.</p><h2><strong>A note on inputs</strong></h2><p>Models are only as good as their inputs. Garbage in = garbage out.</p><p>When we look at custom software investment, we are mostly thinking about labor cost and impact to ongoing revenue. In other words, we look at the effort required to build the thing, and the money you could make as a result by selling more of it, keeping users for longer or making it cheaper to deliver.</p><p><em>Software estimation is notoriously hard.</em> Some say we shouldn&#8217;t bother trying, and I sometimes agree. We can still use estimates to compare investments, though. Not to predict the final outcome, but to get a sense of which investments are more <em>likely</em> to be good. If the estimates are all wrong, hopefully they&#8217;re equally wrong. (Side-note: It&#8217;s possible to anticipate estimate uncertainty in the cost model itself.)</p><p>Rather than front-loading all these inputs, I&#8217;ll try to sprinkle them in as we go along.</p><h2><strong>Round 1: Return on Investment (ROI)</strong></h2><p>You know this one. <strong>Return on Investment (ROI)</strong>measures the efficiency of an investment by looking at the ratio between benefits and costs.</p><pre><code><code># Benefits: What we expect to earn
benefits = 120

# Costs: What we expect to spend
costs = 100

# ROI: The expected return per unit invested
roi = benefits / costs

&gt; ROI = 1.2</code></code></pre><p>An ROI over 1 is good. To make ROI more fair, it&#8217;s common to combine it with <strong>Total Cost of Ownership (ROI/TCO)</strong>, where we consider <em>all the costs</em> we can think of to build and run the software.</p><p>Let&#8217;s put some numbers to the investment ideas at hand. Bear with me as we work these out - it will be handy later!</p><h3><strong>Instant booking</strong></h3><p><strong>Benefits:</strong> Based on industry benchmarks, we expect this will lead to a 10% higher conversion rate. If we assume that 20% of properties adopt this feature over time, it could lead to ~&#8364;240k in added revenue yearly.</p><p><strong>Costs:</strong> The booking team estimates 10 weeks to implement, our initial labor costs being ~&#8364;100k and ongoing support cost of ~&#8364;20k yearly.</p><p><strong>ROI (year 1):</strong> <code>&#8364;240k / &#8364;120k = 2.0</code></p><h3><strong>Auto-reply</strong></h3><p><strong>Benefits:</strong> Exit surveys show that half of churned property managers cite <em>&#8220;too much time spent on guest communication&#8221;</em>. With auto-reply for guests, we expect to quickly reduce churn amounting to ~&#8364;120k in retained value a year.</p><p><strong>Costs:</strong> The frontend team estimates 4 weeks to implement, our initial labor costs being ~&#8364;60k and ongoing support cost of ~&#8364;10k a year.</p><p><strong>ROI (year 1):</strong> <code>&#8364;120k / &#8364;70k = 1.7</code></p><h3><strong>Booking API</strong></h3><p><strong>Benefits:</strong> A public API could attract larger property management companies who want to embed booking on their own sites. Let&#8217;s optimistically assume 10 new big customers, generating ~&#8364;380k a year. This is pure speculation.</p><p><strong>Costs:</strong> The platform team estimates 16 weeks to implement, our initial labor costs being ~&#8364;180k and ongoing support cost of ~&#8364;30k a year.</p><p><strong>ROI (year 1):</strong> <code>&#8364;380k / &#8364;210k = 1.8</code></p><h3><strong>Dynamic pricing</strong></h3><p><strong>Benefits:</strong> The pilot itself generates no revenue. It tests whether a dynamic pricing system is even feasible.</p><p><strong>Costs:</strong> The data team estimates 6 weeks to prototype, our labor cost being ~&#8364;50k.</p><p><strong>ROI (year 1):</strong> <code>&#8364;0 / &#8364;50k = 0.0</code></p><h3><strong>ROI Scoreboard</strong></h3><p>If we rank the projects by ROI goodness, instant booking comes out as a clear winner, public API coming in 2nd. Dynamic pricing isn&#8217;t even worth talking about.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dWxf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dWxf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!dWxf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!dWxf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!dWxf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dWxf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:64413,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.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_!dWxf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!dWxf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!dWxf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!dWxf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65a2d3a1-76a2-48cc-958a-f8e4f70657de_1628x828.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>End of story? Well, no!</p><p>There are several things wrong here:</p><ul><li><p>We are not considering timing factors</p></li><li><p>Projected benefits for the API are highly speculative</p></li><li><p>We&#8217;re ignoring the strategic value of learning</p></li></ul><h2><strong>Round 2: Net Present Value (NPV)</strong></h2><p>Let&#8217;s say you take a contract to build an app. Would you rather get paid before or after the work is done?</p><p>Before, right?</p><p>If you get paid earlier, you can spend earlier: to pay your bills, re-invest or go grocery shopping. There&#8217;s also the element of risk. If you get paid before, you&#8217;ll definitely have the money. If you wait till later, maybe the client won&#8217;t pay. That makes intuitive sense.</p><p><strong>Net Present Value (NPV)</strong> helps us compare investment decisions in terms of what they&#8217;re worth to us today, factoring in the time value of money by &#8220;discounting&#8221; future cash flows. The <strong>discount rate</strong> is set to match your expectations of risk, interest and opportunity cost. The influence of discount on cash flow grows exponentially with time.</p><pre><code><code># Cash flow: The net in/out cash flow at each timestep
cash = [-100, 10, 20, 40, 80]

# Discount rate: How to &#8220;discount&#8221; future cash flows
discount = 0.1

# NPV: The sum of discounted cash flows
npv = 0
for t in range(len(cash)):
    npv += cash[t] / (1 + discount)**t

&gt; NPV = ~10.3</code></code></pre><p>A positive number is good. When we compare investments through the lens of NPV, we are optimising for positive cash flows sooner and negative cash flows later. It also lets us compare investments that play out on different time-scales.</p><p>Let&#8217;s calculate the NPV for our investment options and see what happens. In these examples I choose a discount rate of 2.5% per quarter, reflecting adoption risk and opportunity cost.</p><h3><strong>Instant booking</strong></h3><p><strong>Cash flow:</strong> We will be paying for initial labor in the first quarter, then ongoing support. We expect the revenue added to grow slowly thereafter, as users progressively adopt.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T7wE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T7wE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!T7wE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!T7wE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!T7wE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T7wE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png" width="728" height="180" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:360,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:29412,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!T7wE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!T7wE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!T7wE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!T7wE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313327f8-d1b3-40de-8edf-5fab7a2ab907_1628x402.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>NPV (year 1): </strong><code>&#8364;17.3k</code></p><h3><strong>Auto-reply</strong></h3><p><strong>Cash flow:</strong> Fast 4-week build means we can launch in Q1. Retention benefits kick in quickly, from Q2 onward.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dWjp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dWjp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!dWjp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!dWjp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!dWjp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dWjp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png" width="1456" height="360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27531,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.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_!dWjp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!dWjp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!dWjp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!dWjp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59410f6c-5b55-4891-aaed-23d8faf7219f_1628x402.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>NPV (year 1): </strong><code>&#8364;22.8k</code></p><h3><strong>Booking API</strong></h3><p><strong>Cash flow:</strong> 16-week build drags into Q2. Customer adoption is slow and uncertain. We assume gradual onboarding starting Q3.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9ry8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9ry8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!9ry8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!9ry8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!9ry8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9ry8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png" width="1456" height="360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28777,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.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_!9ry8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!9ry8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!9ry8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!9ry8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ba305a-ca4d-4fd5-b15e-613456403083_1628x402.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>NPV (year 1): </strong><code>&#8364;-69.5k</code></p><h3><strong>Dynamic pricing</strong></h3><p><strong>Cash flow:</strong> The pilot costs &#8364;50k in Q1 but generates no revenue without further investment.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ScO6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ScO6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!ScO6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!ScO6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!ScO6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ScO6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png" width="1456" height="360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26045,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.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_!ScO6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 424w, https://substackcdn.com/image/fetch/$s_!ScO6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 848w, https://substackcdn.com/image/fetch/$s_!ScO6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 1272w, https://substackcdn.com/image/fetch/$s_!ScO6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11c7a17a-7ed5-428d-9a71-31e595c402d8_1628x402.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>NPV (year 1):</strong> <code>&#8364;-50k</code></p><h3><strong>NPV Scoreboard</strong></h3><p>Let&#8217;s rank the projects by Net Present Value. Now that we account for cash flow timings, priorities have changed!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W1m9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W1m9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!W1m9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!W1m9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!W1m9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W1m9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68985,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.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_!W1m9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!W1m9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!W1m9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!W1m9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0fb6b4d-3b49-4a26-bba1-b5fb5c358458_1628x828.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>Auto-reply wins on NPV because it pays back quicker. That&#8217;s interesting. The API and R&amp;D projects now look quite dire, both projected at a loss. What we see, is that NPV captures the value of timing but not the value of adaptability.</p><h2><strong>Round 3: Real Options Analysis (ROA)</strong></h2><p>Traditional valuation methods assume a static world. But our world isn&#8217;t static. <strong>When the work is complex and the environment is dynamic, it&#8217;s good to be adaptable.</strong></p><p>There&#8217;s a modern approach that can help us here: <strong>Real Options Analysis (ROA)</strong>, quantifying the value of <em>optionality</em>. To understand how it works, we should start with financial options.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N8WH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N8WH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!N8WH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!N8WH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!N8WH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N8WH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:775417,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.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_!N8WH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!N8WH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!N8WH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!N8WH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5773cec-b083-485a-b6c8-a931fb97c6ba_1628x828.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><h3><strong>Understanding options</strong></h3><p>Think of a refundable airline ticket. Assume you paid &#8364;100 extra for the ability to cancel. If you get sick or change your plans, you can cancel the ticket and only lose the &#8364;100 premium. If you end up using the ticket, you&#8217;ll have paid extra for flexibility you didn&#8217;t need.</p><p>The &#8364;100 premium buys you an option: the right to refund the ticket later, when you know more.</p><p>Financial options are kind of like that. A financial option is the right (but not obligation) to buy or sell an asset at a pre-agreed price and time. Stock options are one example, often used in tech startups as compensation. Take less salary (that&#8217;s the premium), get the option to buy stock at a good price later.</p><p>Real options build on this idea. The core insight is that you can think of growth investment opportunities as &#8220;call options&#8221;. When an investment has options, that adds value, because options let us change our approach in response to new information. We can analyse a business strategy as a series of real options.</p><h3><strong>Using options in software</strong></h3><p>Building a platform gives you the <strong>option to expand</strong>into new territory later. Running an R&amp;D pilot gives you the <strong>option to abandon</strong> a big project if its outcome isn&#8217;t good. These options have value because they let you invest more when things are looking good and cut your losses when they&#8217;re not.</p><pre><code><code># The cost of learning
learning = 30
# The probability of success (40% chance)
chance = 0.4
# The expected benefits (if the project succeeds)
benefits = 200
# The costs to implement the project
costs = 100

# With option: weighting our success and failure branches
branch_success = benefits - costs
branch_failure = 0
expected_with_option = (-learning
                        + chance * branch_success
                        + (1 - chance) * branch_failure)

# Without option: commit costs regardless of success
expected_no_option = (-costs
                      + chance * benefits)

&gt; With learning: &#8364;10k
&gt; Without learning: &#8364;-20k</code></code></pre><p>The code above demonstrates the value of the <strong>option to abandon</strong>. It may seem counterintuitive: learning adds &#8364;30k in upfront cost. But without it, you commit &#8364;100k regardless of outcome, losing that investment 60% of the time. With learning, you only invest the &#8364;100k when the learning validates the idea (40% of the time). The option to abandon the project before full investment creates &#8364;30k of expected value.</p><p>More broadly, we&#8217;re happy to see investments that have:</p><ul><li><p><strong>The option to expand</strong> (let&#8217;s do more!)</p></li><li><p><strong>The option to contract</strong> (let&#8217;s do less&#8230;)</p></li><li><p><strong>The option to switch</strong> (let&#8217;s do something else instead?)</p></li><li><p><strong>The option to defer</strong> (let&#8217;s wait and see&#8230;)</p></li><li><p><strong>The option to abandon</strong> (let&#8217;s drop it and sell for parts.)</p></li></ul><p>The total value of an investment can then be viewed as the value of its options weighted by the probability that we&#8217;ll use them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ERb0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ERb0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!ERb0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!ERb0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!ERb0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ERb0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:622660,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.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_!ERb0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!ERb0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!ERb0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!ERb0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d8dd937-74a4-41ed-89b8-4e2b534f0aa7_1628x828.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>There are many ways to model real options, binomial trees being quite common. <strong>Think decision trees.</strong> The underlying mechanics of these models are a bit complicated, which is probably why it has taken some time for real options to gain traction in corporate finance.</p><p>Let&#8217;s apply it to our software portfolio. If we call the &#8220;static NPV&#8221; we calculated earlier <code>sNPV</code>, let&#8217;s now determine the &#8220;expanded NPV&#8221; with real options included and call that <code>eNPV</code>. We&#8217;ll focus on the API and R&amp;D since these are investments that have options</p><h3><strong>Booking API</strong></h3><p>If we see strong enterprise adoption in Q3, we realize that we have the <strong>option to expand</strong> by investing an additional &#8364;80k in Q3 to build premium enterprise features. This will justify a high-value enterprise tier that could generate &#8364;400k in additional Q4 revenue.</p><p>In the diagram below, we&#8217;re looking at two possible futures. In the first, we build the API and see weak adoption: this gives us the original NPV of &#8364;-69.5k. In the second, we see strong adoption and capitalize on that by expanding with premium features, reaping a new NPV of &#8364;116.4k driven by enterprise license sales.</p><p>Weighing these possible futures by their probabilities, the eNPV flips the API from a loss to a gain through the ability to scale based on market signals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xEyS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xEyS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!xEyS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!xEyS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!xEyS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xEyS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117221,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.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_!xEyS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!xEyS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!xEyS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!xEyS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59a0fa9f-d4f5-4c28-8a11-3ed3d8882da2_1628x1028.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><strong>eNPV (year 1):</strong> <code>&#8364;23.4k</code></p><h3><strong>Dynamic pricing</strong></h3><p>Finally (!) we can explain the value of the dynamic pricing pilot. It creates an <strong>option to abandon</strong> before a bigger investment.</p><p>We spend &#8364;50k in Q1 to see if it works. If the pilot fails (70% risk), we abandon and lose only &#8364;50k. If it succeeds (30% chance), we invest &#8364;200k in Q2-Q3 to build the full thing, expecting to generate &#8364;450k in Q4 from dynamic pricing benefits.</p><p>Without a pilot, we would either commit &#8364;200k on blind faith (risking a total loss) or miss the opportunity altogether. In other words, the pilot limits the downside while preserving potential upside.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HE-r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HE-r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!HE-r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!HE-r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!HE-r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HE-r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101237,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.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_!HE-r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 424w, https://substackcdn.com/image/fetch/$s_!HE-r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 848w, https://substackcdn.com/image/fetch/$s_!HE-r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.png 1272w, https://substackcdn.com/image/fetch/$s_!HE-r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9125bf-4f31-42aa-b7bf-66e6c3c71bbd_1628x1028.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><strong>eNPV (year 1):</strong> <code>&#8364;17.5k</code></p><h3><strong>eNPV Scoreboard</strong></h3><p>Now let&#8217;s see how accounting for real options changes our rankings:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TfUQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TfUQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!TfUQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!TfUQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!TfUQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TfUQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01f90865-9857-402f-8476-9c982606367d_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68395,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.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_!TfUQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!TfUQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!TfUQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!TfUQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01f90865-9857-402f-8476-9c982606367d_1628x828.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>Our original ROI winner has moved to the bottom because it doesn&#8217;t make money quickly and it doesn&#8217;t have strategic options. The API is at the top, because we realized the potential of introducing an enterprise pricing tier.</p><h2><strong>Making the call</strong></h2><p>What is the rational next step for our vacation rental platform? As with most things in software, it depends.</p><p>If we believe and agree on the assumptions presented, we should build the API first because of its strategic potential. The current revenue looks like it could support that. If the focus is instead on short-term survival, we should probably build the auto-reply feature first.</p><p>Are these valuations objective and true? <strong>Not really!</strong>There&#8217;s a bunch of assumptions, expectations and guesses involved here. But as we worked our way up the ladder of strategic valuation methods, we became increasingly explicit about the stakes involved.</p><p>At the end of the day, we make our best educated guess. But thinking in NPV and real options, we ground our decision-making in structured thinking about uncertainty, timing and adaptation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ocOO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ocOO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!ocOO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!ocOO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!ocOO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ocOO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png" width="1456" height="741" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:741,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1142156,&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;:&quot;https://blog.42futures.com/i/175524170?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.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_!ocOO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 424w, https://substackcdn.com/image/fetch/$s_!ocOO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 848w, https://substackcdn.com/image/fetch/$s_!ocOO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.png 1272w, https://substackcdn.com/image/fetch/$s_!ocOO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F960418fe-c60d-45f2-a5d6-372708febe97_1628x828.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><h2><strong>Conclusion</strong></h2><p>I hope you found this helpful (and not boring). Figuring out how to value new software initiatives is a bit of work, but I invite you to try it.</p><p>My hope is that you come away with a clearer sense of the <strong>financial value of adaptability</strong>. Traditional ROI and NPV undervalue platforms and R&amp;D because they don&#8217;t capture optionality. Real options analysis gives you the tools to quantify what engineers intuitively know: <strong>building for adaptability has real, measurable value</strong>.</p><p>Knowing this won&#8217;t eliminate uncertainty in decision-making. But it will make your assumptions explicit, tradeoffs visible, and priorities defensible. </p><p>Whether you&#8217;re advocating for piloting a new idea or weighing features against platforms, you now have financial frameworks that match the complexity of the decisions you&#8217;re actually making.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div><h2><strong>Sources</strong></h2><p><em>Here are my primary sources for this post. They have lots more great insights, and this write-up would&#8217;ve been way too long if I tried to include them all. I can very much recommend checking them out if this topic interests you!</em></p><ul><li><p>Kent Beck: Tidy First?</p></li><li><p>Kent Beck: The Good News Factory</p></li><li><p>Caesar Wu, Rajkumar Buyya: Cloud Data Centers and Cost Modeling</p></li><li><p>Timothy A. Luehrman (in HBR): Strategy as a Portfolio of Real Options</p></li></ul>]]></content:encoded></item><item><title><![CDATA[A vibe code review]]></title><description><![CDATA[Good vibes, bad code]]></description><link>https://blog.42futures.com/p/a-vibe-code-review</link><guid isPermaLink="false">https://blog.42futures.com/p/a-vibe-code-review</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Mon, 24 Mar 2025 13:33:42 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%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Vibe_coding">&#8220;Vibe coding&#8221;</a> is a big deal in the AI community right now. It&#8217;s a fun phrase for a new way of developing software, primarily by prompting LLMs.</p><p>The demos look cool. I&#8217;ve found LLMs helpful in some scenarios, but is &#8220;vibe coding&#8221; really the future of software engineering, as some AI enthusiasts claim?</p><p>Let&#8217;s find out. I&#8217;ll vibe code an app from scratch as a novice and then review the code as an experienced software engineer.</p><h2><strong>Weapon of choice</strong></h2><p>Some of the tools I&#8217;ve heard about in this context are <a href="https://www.cursor.com/">Cursor</a>, <a href="https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview">Claude Code</a> and <a href="https://lovable.dev/">Lovable</a>. Initially, I was excited to try out Cursor, but unfortunately, <a href="https://anysphere.inc/">Anysphere</a> did not believe I was a human.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1KIt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1KIt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 424w, https://substackcdn.com/image/fetch/$s_!1KIt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 848w, https://substackcdn.com/image/fetch/$s_!1KIt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 1272w, https://substackcdn.com/image/fetch/$s_!1KIt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1KIt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png" width="1456" height="1104" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1104,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:397279,&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://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.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_!1KIt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 424w, https://substackcdn.com/image/fetch/$s_!1KIt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 848w, https://substackcdn.com/image/fetch/$s_!1KIt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.png 1272w, https://substackcdn.com/image/fetch/$s_!1KIt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa258fe63-de7d-4994-9a05-9113992fc294_2060x1562.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">Anysphere didn&#8217;t believe I was human.</figcaption></figure></div><p>So, I decided to try <a href="https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview">Claude Code</a> instead. I&#8217;ve enjoyed using Claude for search, docs and test stubs in the past, so it seemed a decent choice.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hTpw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hTpw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 424w, https://substackcdn.com/image/fetch/$s_!hTpw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 848w, https://substackcdn.com/image/fetch/$s_!hTpw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!hTpw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hTpw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png" width="1456" height="1072" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1072,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:263325,&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;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.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_!hTpw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 424w, https://substackcdn.com/image/fetch/$s_!hTpw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 848w, https://substackcdn.com/image/fetch/$s_!hTpw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 1272w, https://substackcdn.com/image/fetch/$s_!hTpw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5396dcb-88e3-486e-aeaf-54bc315fedc5_1684x1240.png 1456w" sizes="100vw"></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">Claude Code has a nice CLI tool.</figcaption></figure></div><p>I was ready to go after a quick registration process with <a href="https://www.anthropic.com/">Anthropic</a> and upgrading my NodeJS installation.</p><h2><strong>Mission statement</strong></h2><p>Vibe coding aims to make software development accessible to non-programmers. I tested this by acting as a beginner, giving minimal technical input and letting the AI guide the process.</p><p>Still, I wanted a slightly more advanced use case to review the capabilities better later.</p><p><strong>The prompt:</strong></p><blockquote><p>Build a progressive web app with C# that allows users to create and share playlists. Users should be able to subscribe to other users playlist for a custom monthly fee.</p></blockquote><p>The first thing that happened was impressive: Claude ran commands to create and design a scaffold for a Blazor frontend and API, including reasonable data models, DTOs, database integration and a Swagger UI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!udML!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!udML!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 424w, https://substackcdn.com/image/fetch/$s_!udML!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 848w, https://substackcdn.com/image/fetch/$s_!udML!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 1272w, https://substackcdn.com/image/fetch/$s_!udML!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!udML!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png" width="1456" height="1094" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1094,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:579778,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.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_!udML!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 424w, https://substackcdn.com/image/fetch/$s_!udML!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 848w, https://substackcdn.com/image/fetch/$s_!udML!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.png 1272w, https://substackcdn.com/image/fetch/$s_!udML!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d22c7c4-1593-4916-9c10-38a7a29df6b6_2058x1546.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><figcaption class="image-caption">Neat! That&#8217;s a lot of progress for 10 minutes.</figcaption></figure></div><p>The next thing that happened was more frustrating: It didn&#8217;t work. When registering my user via <code>/api/Auth/register</code>, I got a <code>403 Forbidden</code> error. Naturally, I let Claude know about this, which launched a 45-minute process of building, rebuilding and testing the project. </p><p>I could register my user after disabling HTTPS redirection and vibe debugging some weird .NET compatibility issues.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6OI7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6OI7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!6OI7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!6OI7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!6OI7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6OI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/38599355-8460-440e-858e-69b22c7a2242_2036x1478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:720452,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.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_!6OI7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!6OI7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!6OI7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!6OI7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F38599355-8460-440e-858e-69b22c7a2242_2036x1478.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>At this point, I am still running on complete auto-pilot. I have no idea how the code works, but it does appear to work.</p><p>I want a front-end, too, so I ask for it. Halfway through building it, Claude exceeds its context window and restarts the conversation, passing a summary to itself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ho81!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ho81!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 424w, https://substackcdn.com/image/fetch/$s_!Ho81!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 848w, https://substackcdn.com/image/fetch/$s_!Ho81!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 1272w, https://substackcdn.com/image/fetch/$s_!Ho81!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ho81!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png" width="1456" height="1112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1112,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:529971,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.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_!Ho81!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 424w, https://substackcdn.com/image/fetch/$s_!Ho81!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 848w, https://substackcdn.com/image/fetch/$s_!Ho81!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.png 1272w, https://substackcdn.com/image/fetch/$s_!Ho81!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe13db81-c4a0-43f9-8f13-dde4d298bf6e_1684x1286.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>I ask how to test the frontend and get a satisfactory response. Now, I can see a webpage, although it does not integrate with the API in any way. We have:</p><ul><li><p>A home page with a menu, a blue box and some text</p></li><li><p>An &#8220;About&#8221; button that links Microsoft&#8217;s <a href="http://asp.net/">ASP.NET</a> docs</p></li><li><p>A popup about an unhandled error</p></li><li><p>A Playlists page which says: <code>Sorry, there's nothing at this address.</code></p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EqCY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EqCY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!EqCY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!EqCY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!EqCY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EqCY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:644907,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.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_!EqCY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!EqCY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!EqCY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!EqCY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54008837-e83c-4561-b4ea-4c84d42ce3df_2036x1478.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><figcaption class="image-caption">Not great, but not terrible.</figcaption></figure></div><p>I then asked for the front end to be expanded with capabilities from the API, after which Claude realised the entire project was wrongly structured and needed to be reorganised to compile. </p><p>Now, both the API and the frontend build again, but uh-oh:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g264!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g264!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!g264!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!g264!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!g264!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g264!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:831047,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.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_!g264!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!g264!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!g264!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!g264!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74ff234-a842-4bfa-954b-958b7b91284b_2036x1478.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><figcaption class="image-caption">The frontend has a circular dependency.</figcaption></figure></div><p>Naturally, I asked for help to get this fixed. Claude was happy to oblige. And the webpage now loads. Except there is now nothing here to do with playlists.</p><p>Claude has populated the page with &#8220;hello world&#8221; placeholders, a counter, a link to a Blazor survey and <em><strong>a broken weather forecast</strong></em>. The unhandled error is still unhandled.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SgJs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SgJs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!SgJs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!SgJs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!SgJs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SgJs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:596450,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.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_!SgJs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 424w, https://substackcdn.com/image/fetch/$s_!SgJs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 848w, https://substackcdn.com/image/fetch/$s_!SgJs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.png 1272w, https://substackcdn.com/image/fetch/$s_!SgJs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac966905-f9fe-498d-8913-e6bc38e5aa3a_2036x1478.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><figcaption class="image-caption">How is vibe coding working for me?</figcaption></figure></div><p>I tried to request a proper integration, but now the builds fail. After another hour of vibe debugging, we now have more correct-looking content, but the user registration doesn&#8217;t work again.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ls9i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ls9i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 424w, https://substackcdn.com/image/fetch/$s_!ls9i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 848w, https://substackcdn.com/image/fetch/$s_!ls9i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 1272w, https://substackcdn.com/image/fetch/$s_!ls9i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ls9i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:778982,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.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_!ls9i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 424w, https://substackcdn.com/image/fetch/$s_!ls9i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 848w, https://substackcdn.com/image/fetch/$s_!ls9i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.png 1272w, https://substackcdn.com/image/fetch/$s_!ls9i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F082e5b6f-5b5f-46fe-80db-1522c608ee79_2568x1712.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><figcaption class="image-caption">I thought we fixed that already.</figcaption></figure></div><p>Oh my god. That&#8217;s it. I&#8217;ve spent 4 hours and $20 Claude-bucks - I&#8217;m done. </p><p>I&#8217;m tired and frustrated with acting as QA for a bot. Claude Code occasionally makes heroic progress and then chases its tail for hours on random trivial issues. </p><p>Every prompt feels like one step forward, two steps back. I made some fast initial progress, but now I pay the price with a sluggish, frustrating debugging flow. </p><p>I struggle to fix issues without investing more effort into reading and understanding Claude's code. And if I can do that, I might as well write the code myself.</p><h2>Code review</h2><p>Up until this point, I&#8217;ve been acting as a novice. By &#8220;vibe coding&#8221; for 4 hours, I could spin up an API with authentication and a frontend that is nearly functional.</p><p>Frustrations aside, this <em>is</em> a neat tool that anyone can use to make working programs. But is it more than a toy? Can these programs be used in production? Let&#8217;s review.</p><h3><strong>&#9888;&#65039; Request changes: </strong><code>run.sh</code><strong> doesn&#8217;t do anything</strong></h3><p>This is a small but silly one. <code>run.sh</code> doesn&#8217;t do anything but <code>echo</code> to your console that you should go ahead and use <code>dotnet run</code>. The frontend port note is wrong.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kQXD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kQXD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 424w, https://substackcdn.com/image/fetch/$s_!kQXD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 848w, https://substackcdn.com/image/fetch/$s_!kQXD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 1272w, https://substackcdn.com/image/fetch/$s_!kQXD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kQXD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png" width="1456" height="962" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:962,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1218438,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.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_!kQXD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 424w, https://substackcdn.com/image/fetch/$s_!kQXD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 848w, https://substackcdn.com/image/fetch/$s_!kQXD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.png 1272w, https://substackcdn.com/image/fetch/$s_!kQXD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b4fa580-8a08-4c00-a116-ef39699f5c3c_3114x2058.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><h3><strong>&#9888;&#65039; Request changes: Duplicated projects</strong></h3><p>While reorganising the project, Claude has created not one, not two, but three duplicate API folders. As far as I can tell, only <code>PlaylistPro/ApiProject</code> is in use. While it doesn&#8217;t break anything, it&#8217;s a mess (!) and will be hard to maintain. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gqCA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gqCA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 424w, https://substackcdn.com/image/fetch/$s_!gqCA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 848w, https://substackcdn.com/image/fetch/$s_!gqCA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!gqCA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gqCA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png" width="1456" height="1052" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1052,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1274047,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.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_!gqCA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 424w, https://substackcdn.com/image/fetch/$s_!gqCA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 848w, https://substackcdn.com/image/fetch/$s_!gqCA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!gqCA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d209e18-d872-4b8e-aa9b-d9313a4ed23e_3024x2184.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><h3><strong>&#9888;&#65039; Request changes: Weather forecast</strong></h3><p>Why do the API and client apps implement a weather forecast? This was not part of the requirements or even tangentially related to playlists. The result returned by the weather forecast is random and arbitrary.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OSpg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OSpg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 424w, https://substackcdn.com/image/fetch/$s_!OSpg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 848w, https://substackcdn.com/image/fetch/$s_!OSpg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!OSpg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OSpg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png" width="1456" height="1052" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1052,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1193543,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.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_!OSpg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 424w, https://substackcdn.com/image/fetch/$s_!OSpg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 848w, https://substackcdn.com/image/fetch/$s_!OSpg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!OSpg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feae45096-18a9-451e-af2d-e87a045017ae_3024x2184.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><h3><strong>&#128997; Decline: Mocked auth implementation</strong></h3><p>The first auth implementation was not too bad (I reviewed it early). However, after the confusion with structure and integration, Claude has opted for a mocked auth implementation that lets everyone in. This is not acceptable for a public application.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q1mF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q1mF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 424w, https://substackcdn.com/image/fetch/$s_!q1mF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 848w, https://substackcdn.com/image/fetch/$s_!q1mF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!q1mF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q1mF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png" width="1456" height="1052" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9747874f-00bc-4400-affc-03e20bada679_3024x2184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1052,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1231790,&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;:&quot;https://42futures.substack.com/i/159744105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.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_!q1mF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 424w, https://substackcdn.com/image/fetch/$s_!q1mF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 848w, https://substackcdn.com/image/fetch/$s_!q1mF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.png 1272w, https://substackcdn.com/image/fetch/$s_!q1mF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9747874f-00bc-4400-affc-03e20bada679_3024x2184.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><h2><strong>Declined: Do not merge</strong></h2><p>As a reviewer, I would not accept a pull request like this into my repo and would certainly not release it to end-users.</p><p>I have been impressed with the tool's capabilities, though. Maybe an innovation that&#8217;ll make these tools &#8220;the future of software engineering&#8221; is around the corner. I doubt it, but I am open to being wrong.</p><p>&#8220;Vibe coding&#8221; is making software engineering available to a new group of people. It makes prototypes and &#8220;personal software&#8221; cheaper to produce. But I don&#8217;t think it&#8217;ll displace the traditional software engineering industry in its current form. </p><p>Instead, I&#8217;m guessing we are looking at a <a href="https://en.wikipedia.org/wiki/Jevons_paradox">Jevons Paradox</a> situation, where lowering the cost of creating simple software will lead to more simple software being created.</p><p>Personally, I found &#8220;vibe coding&#8221; a frustrating experience, and I felt less productive. Someone without coding experience might find learning the tech equally a barrier to building what they want. Each to their own.</p><p>You can &#8220;vibe your way&#8221; to decent prototypes for apps where quality and security are unimportant. But please, <strong>don&#8217;t deploy these apps to production</strong> without serious scrutiny. Otherwise, you may need to prepare for some &#8220;vibe firefighting&#8221; as well.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Into the unknown]]></title><description><![CDATA[Systematic approaches to uncertainty in software engineering]]></description><link>https://blog.42futures.com/p/into-the-unknown</link><guid isPermaLink="false">https://blog.42futures.com/p/into-the-unknown</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Mon, 10 Mar 2025 08:10:36 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%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My son loves Disney's "Frozen 2." I must have watched it with him a hundred times. In the film, ice queen Elsa ventures into the unknown with courage and curiosity to discover her true identity and purpose.</p><p>Software engineers sometimes need to be like Elsa&#8212;minus the ice magic, of course. Finding solutions to novel problems requires that we brave the fog of uncertainty. We need to get things done with incomplete knowledge. But when does strategic ignorance cross the line into reckless risk-taking?</p><p>In this post, I explore systematic approaches to handling uncertainty in software projects.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S_0m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S_0m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!S_0m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!S_0m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!S_0m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S_0m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2172620,&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://42futures.substack.com/i/158647725?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.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_!S_0m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!S_0m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!S_0m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!S_0m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc46ccee5-f31b-4896-b716-031a0fb3eff1_1232x928.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><h2>A theory of knowledge</h2><p>Engineering decisions require balancing what we know against what we don't. If perfect knowledge were possible, we'd always implement the optimal solution. But reality is messy.</p><p>Categorising knowledge isn't an academic exercise&#8212;it's a tool for deciding where to invest our limited research time and when to start building. With this in mind, we can categorise information into three groups:</p><ol><li><p><strong>Known:</strong> Facts and constraints we're confident about.</p></li><li><p><strong>Knowable:</strong> Information we could discover with some effort.</p></li><li><p><strong>Unknowable:</strong> Uncertainties that cannot be resolved in advance.</p></li></ol><p>The first two categories are straightforward&#8212;what we know and what we could learn. The third category is trickier: things we can't reasonably know until we're in the weeds of building the software.</p><p>In history, &#8220;unknowables&#8221; are what <a href="https://en.m.wikipedia.org/wiki/The_Black_Swan:_The_Impact_of_the_Highly_Improbable">Nassim Nicholas Taleb would call &#8220;Black Swan&#8221;</a> events. In his research, Taleb demonstrates how our planning consistently underestimates unknowable events&#8212;not because we're careless, but because they are outside our predictive capabilities.</p><p>In tech, as in most domains, some things are <em>unknowable</em>&#8212;like how markets and cultures will evolve in relation to what we're building. In the structured world of software, many things are <em>theoretically knowable</em>. Practically though, some information requires so much effort to obtain that it is <em>very nearly</em> <em>unknowable</em>. It&#8217;s a continuum ranging from easy-to-know to practically unknowable.</p><p>When venturing into something new, whether it's a greenfield project or major changes to existing systems, it can be helpful to map the information that matters to us most (knowable or not) so we can increase our chances of building the right thing in the right way.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VPzc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VPzc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!VPzc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!VPzc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!VPzc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VPzc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2645657,&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;:&quot;https://42futures.substack.com/i/158647725?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.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_!VPzc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!VPzc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!VPzc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!VPzc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea0cea22-bee2-44d6-9233-438ee586ad61_1232x928.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><h2>The knowledge quadrant</h2><p>Every project begins with decisions that require learning. How else can we make informed choices in a complex, vast universe if we&#8217;re not first obtaining knowledge?</p><p>To keep things practical, I use a 2x2 matrix to prioritise what I need to learn:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{|c|c|c|}\n\\hline\n&amp; \\textbf{Easy to know} &amp; \\textbf{Hard to know} \\\\\n\\hline\n\\textbf{Important} &amp; \\text{Prototype immediately} &amp; \\text{Start working and find out} \\\\\n\\hline\n\\textbf{Not important} &amp; \\text{Make assumptions} &amp; \\text{Don't bother} \\\\\n\\hline\n\\end{array}&quot;,&quot;id&quot;:&quot;LIRTLYUPXK&quot;}" data-component-name="LatexBlockToDOM"></div><p>It&#8217;s like <a href="https://www.forbes.com/sites/hillennevins/2023/01/05/how-to-get-stuff-done-the-eisenhower-matrix-aka-the-urgent-vs-the-important/">Eisenhower&#8217;s classic &#8220;Urgent-Important&#8221; matrix</a>, except I&#8217;m not concerned with a temporal dimension, but instead trying to prioritise learning according to impact and effort.</p><p>When making decisions under uncertainty, it can help to create a short-list of &#8220;things you&#8217;d like to know&#8221; and organise it to maximise certainty with minimal effort. At the end of the day, we gotta ship products. </p><p>You can use the knowledge quadrant to do that:</p><h3><strong>Important + Easy</strong></h3><p>These are no-brainers. Do quick research, build a prototype, resolve the uncertainty.</p><p>Consider payment processing in a web app&#8212;deciding whether to build your own system or use an established provider like Stripe. Basic research into security requirements, PCI compliance, and implementation time will quickly reveal that using an existing payment provider is a good idea. This high-impact decision can be made with a small investment in upfront research.</p><h3><strong>Important + Hard</strong></h3><p>This is where agile development methods shine. Start working, target the uncertainty, and create feedback loops to learn as you build.</p><p>When designing a real-time collaboration feature (like multiple users editing the same document), the exact conflict resolution strategy that will provide the best user experience isn't something that&#8217;s easy to find out. Interactions between concurrency, latency, and user expectations make that complicated. An answer may theoretically be knowable, but probably not without significant effort. Instead of trying to design a perfect system upfront, start small, test it with real people, and improve it based on feedback and your own observations.</p><h3><strong>Not Important + Easy</strong></h3><p>Make assumptions, pick something and move on. If it's not important, it doesn't matter if you're wrong.</p><p>When choosing a logging library or deciding on code formatting standards, just pick something reasonable based on quick research or personal preference. These decisions rarely make or break a project.</p><h3><strong>Not Important + Hard</strong></h3><p>Don't waste precious engineering time here.</p><p>Like trying to predict exactly how your application might need to scale three years from now if you succeed beyond all expectations. Instead of over-engineering for hypothetical future scale, build a solid architecture that handles current needs well with reasonable extension points, knowing you might change parts of the system as you learn more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cY9M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cY9M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cY9M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cY9M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cY9M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cY9M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:722269,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/158647725?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.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_!cY9M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cY9M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cY9M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cY9M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de855c9-a4a7-491f-8e24-9dfe62de1127_1232x928.jpeg 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><h2>The solution landscape</h2><p>Think of your journey into the unknown as navigating an unfamiliar mountainous landscape. Your goal is to plant a flag on the highest mountain but you don&#8217;t have a map.</p><p>You have two activities at your disposal:</p><ol><li><p><strong>Scouting the terrain (exploration):</strong> Climbing nearby high points to see what&#8217;s ahead, sending small parties in different directions to discover paths, obstacles and resources. This is your research, prototypes and user interviews.</p></li><li><p><strong>Traveling the path (exploitation):</strong> Committing to a direction and making efficient progress along it. This is your focused development, optimisation, and refinement work.</p></li></ol><p>Both activities are important, but they compete for your effort. Every day spent scouting is a day not traveled towards a destination. Every day traveling without terrain awareness could lead you down a wrong path, forcing you to backtrack.</p><p>The landscape metaphor isn't just helpful imagery&#8212;it connects to optimisation theory in computer science. When building software, we're solving what mathematicians would call an "optimisation problem with incomplete information"&#8212;finding the best solution without seeing the whole map. A journey through this imaginary landscape reveals relevant optimisation constraints:</p><ul><li><p><strong>Local / global optima</strong>: You might climb the nearest hill (local optimum) not realising a much taller mountain (global optimum) was just outside your line of sight. This is the same challenge that optimisation algorithms like gradient descent face&#8212;getting stuck on a <em>good</em> solution while missing the <em>best</em> one.</p></li><li><p><strong>Gradient locality:</strong> The further ahead you look, the less accurate your predictions become. Plans made for distant terrain will be inaccurate. In optimisation theory, this mirrors how gradients provide only local information&#8212;they tell you which direction to climb at your current position, but can't reliably predict the landscape beyond your immediate vicinity.</p></li><li><p><strong>Path dependence:</strong> The cost of changing direction increases dramatically the further you travel along a given path. Optimisation theorists would recognise this as a form of "hysteresis", where your history constrains your future options.</p></li><li><p><strong>Unknown unknowns:</strong> No matter how thoroughly you scout, some features of the terrain only reveal themselves when you encounter them directly. This connects to the "No Free Lunch Theorem" in optimisation, which tells us that no strategy can discover all properties of an unknown space without direct sampling.</p></li></ul><p>Software engineers often face this dilemma: do we invest time exploring potential solutions (scouting) or commit to a path and start building (traveling)? This challenge is particularly complex because software landscapes, unlike physical terrain, exist in multiple dimensions, evolve continuously, and shift in response to our own actions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h9bb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h9bb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!h9bb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!h9bb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!h9bb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h9bb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2641174,&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;:&quot;https://42futures.substack.com/i/158647725?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.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_!h9bb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!h9bb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!h9bb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!h9bb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc88fccea-7835-4363-9f56-cedc630b20ee_1232x928.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><h2>Lost in the woods</h2><p>I've seen it happen before (and done it myself, too): teams get stuck in analysis paralysis, debating theoretical concerns while competitors ship products. Analysis paralysis is like spending all your time on the nearest vantage point, mapping every possible route but never actually traveling. The quest for perfect knowledge is understandable&#8212;but it's ultimately self-defeating.</p><p>Behavioural economists have studied this fact. In their research on decision-making under uncertainty, Daniel Kahneman and Amos Tversky identified <a href="https://en.wikipedia.org/wiki/Ambiguity_aversion">"ambiguity aversion"</a>&#8212;our irrational preference for known risks over unknown ones, even when they're mathematically equivalent. Ambiguity aversion makes us prefer well-mapped routes with known obstacles over potentially shorter but uncharted paths.</p><p>I&#8217;ve also seen the opposite: teams charging ahead with blind confidence, only to build something nobody wants or that collapses under real-world conditions. </p><p>Kahneman and Tversky identifies this cognitive bias as well&#8212;<a href="https://en.wikipedia.org/wiki/Planning_fallacy">"planning fallacy"</a>&#8212;where we systematically underestimate complexities and overestimate our understanding. The planning fallacy has us underestimating how difficult certain terrain will be to traverse, even when similar journeys have taken longer in the past.</p><p>As such, the magic is in the middle&#8212;enough exploration to set a clear direction, followed by decisive action with built-in feedback.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!InpX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!InpX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!InpX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!InpX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!InpX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!InpX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2126554,&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;:&quot;https://42futures.substack.com/i/158647725?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.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_!InpX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!InpX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!InpX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!InpX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F083c0052-f4f1-41d4-8552-ee4939ad1ad5_1232x928.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><h2>Conclusion</h2><p>Uncertainty isn't a bug in software engineering&#8212;it's a feature. It's what makes our field challenging, dynamic, and fun. Mastery in software isn't about memorising APIs or frameworks (hello LLMs). It's about developing judgment under uncertainty. At least, that&#8217;s part of it.</p><p>I've provided a few ideas to help you tackle uncertainties more systematically. The rest is up to you&#8212;mastering this skill requires artistic intuition <em>and</em> scientific rigor. Though I&#8217;m far from perfecting this myself, I'm committed to developing this skill because I think it's essential for successful software projects.</p><p>Like Elsa venturing into the unknown, we must move forward with courage, humility, and a willingness to adapt as we learn. The path reveals itself to those in motion.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Company as Code]]></title><description><![CDATA[Reimagining organisational structure for the digital age.]]></description><link>https://blog.42futures.com/p/company-as-code</link><guid isPermaLink="false">https://blog.42futures.com/p/company-as-code</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Tue, 25 Feb 2025 05:40:30 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%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, as I sat across from our <a href="https://www.iso.org/standard/27001">ISO 27001</a> information security auditor, watching them strenuously work through our documentation, a thought struck me: </p><blockquote><p>Here we are, a software company, with nearly all of our operations running in interconnected digital systems, yet the core of our business&#8212;our policies, procedures, and organisational structure&#8212;is a <em>basic</em> collection of documents.</p></blockquote><p>It just felt ironic. We use advanced tools to automate compliance checks, store our code in version-controlled repositories, and manage our infrastructure as code. However, when describing and managing our company, we resort to digital paper and tidbits of info distributed across people in the building.</p><p>The disconnect became increasingly apparent as I reflected on our day-to-day process: 90% of our products, documents, communication, and decision-making live in digital channels. That&#8217;s data. It lives in the cloud, spread over SaaS solutions that specialise in handling individual work processes&#8212;all systems with robust APIs and programmatic access.</p><p>At the centre of it all sits a lonely island of documents: our ambitions, goals, policies and formal structures. And I think those are pretty important.</p><p>Our security posture was solid before we even considered ISO 27001 because we&#8217;d already worked hard to comply with our customer&#8217;s requirements. Between collecting evidence for controls, arguing about and updating policy wording, document review, and the actual audit, <em><strong>we spent hundreds of additional person-hours</strong></em> that could&#8217;ve otherwise been spent creating great products for our users.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P-Is!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P-Is!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P-Is!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P-Is!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P-Is!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P-Is!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:396166,&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://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.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_!P-Is!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P-Is!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P-Is!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P-Is!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cddc69a-a86d-4a18-82c9-4ffa6a4eeb98_1232x928.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><h2>A missing link</h2><p>If we desire operational data to be so rich, why do we accept organisational data to be so sparse? We&#8217;ve revolutionised how we handle infrastructure with Infrastructure as Code (IaC), how we manage deployments with GitOps, and how we handle security with Policy as Code. </p><p>We see the benefit. </p><p>But when representing our organisation (the beating heart of our operations), we apply old-school methods.</p><p>Imagine if we could represent our entire organisational structure programmatically instead&#8212;not a static picture, but a living, breathing digital representation of our company that can be versioned, queried, tested, and automatically verified. A system where policy changes could be tracked as code changes, where compliance could be continuously monitored, and where the relationships between people, processes and technology could be explicitly mapped and understood.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vFMg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vFMg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vFMg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vFMg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vFMg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vFMg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:287628,&quot;alt&quot;:&quot;A person in motion, linked in a graph.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A person in motion, linked in a graph." title="A person in motion, linked in a graph." srcset="https://substackcdn.com/image/fetch/$s_!vFMg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vFMg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vFMg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vFMg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa47e3728-e301-4e34-936e-42155b113034_1232x928.jpeg 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><h2>Thinking bigger</h2><p>Existing solutions like HRIS systems manage people data but struggle with policy relationships. GRC tools track compliance but rarely connect meaningfully to organisational structure. I&#8217;m proposing we think bigger. It&#8217;s about creating a holistic, programmatic representation of the <em>entire</em> organisation: a &#8220;company manifest&#8221; that serves as a single source of truth for organisational structure, policy, and operations.</p><p>Consider how helpful this might be for:</p><ul><li><p><strong>Compliance audits:</strong> Instead of manually piecing together evidence from various systems, auditors could query the company manifest directly, with clear traceability between policies and their implementations.</p></li><li><p><strong>Policy changes:</strong> Updates could be version-controlled, and automated impact analysis could show which teams and processes would be affected.</p></li><li><p><strong>Organisational design:</strong> Leaders could model structural changes in a &#8220;staging environment&#8221; before implementing them, gaining a better understanding of how changes cause ripple effects throughout the company.</p></li></ul><h2>Why isn&#8217;t this a thing?</h2><p>As this idea swirls around in my mind, I find more questions than answers. </p><p>Has anyone tried this yet? If not, why not?</p><p><strong>Is it because organisations are inherently too complex and dynamic to be represented as code?</strong> If so, that seems at odds with regulation and standards, where we expect corporate activities to be so uniform and procedural that we can reliably stamp them as compliant, non-compliant, legal, or illegal.</p><p><strong>Is it because we haven&#8217;t yet found the right abstraction level&#8212;the equivalent of what Infrastructure as Code did for system administration?</strong></p><p>The tools and concepts exist: Graph databases for representing organisational relationships, domain-specific languages for describing business rules, and API-first architectures for integration.</p><p><strong>Maybe what&#8217;s missing is a framework to bring these ideas together in a way that&#8217;s powerful enough to be useful and simple enough to be used.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nrqf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nrqf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nrqf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nrqf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nrqf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nrqf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg" width="728" height="548.3636363636364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:367675,&quot;alt&quot;:&quot;An intricate machinery of people, process and data.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="An intricate machinery of people, process and data." title="An intricate machinery of people, process and data." srcset="https://substackcdn.com/image/fetch/$s_!nrqf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nrqf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nrqf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nrqf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5b87009-60f1-4725-8645-04d63920976b_1232x928.jpeg 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><h2>Putting it into practice</h2><p>Let&#8217;s think about how this could work.</p><p>In this section, I&#8217;ll fantasise about what I would want from &#8220;Company as Code.&#8221; Then, I&#8217;ll map that to some system components that could address those needs.</p><p>As an engineer and business stakeholder, I would want a company model to be:</p><h4>Queryable</h4><p>The system must trace relationships between people, policies, and systems&#8212;similar to code dependency tracking. Users should easily see the organisation from different angles, such as which people are affected by a policy and who owns it.</p><h4>Versionable</h4><p>Explicit tracking of organisational changes, including who made them, what changed, and why. This is crucial for audits and understanding organisational evolution.</p><h4>Integrated</h4><p>Seamless data exchange with existing tools (Azure, Slack, etc.) to maintain an up-to-date organisational picture and enforce tool configurations based on policy.</p><h4>Testable</h4><p>A &#8220;staging environment&#8221; where organisational changes can be modeled before implementation, supporting automated tests for individual rules and controls.</p><h4>Accessible</h4><p>Though powered by code, the interface should be intuitive enough for non-technical leaders to use effectively.</p><p>Bringing this vision to life requires several puzzle pieces. Each component must address specific requirements to approximate something that can be powerful while being relatively simple to use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pkbW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pkbW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pkbW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pkbW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pkbW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pkbW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158191,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.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_!pkbW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pkbW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pkbW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pkbW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57dbeeb3-a5af-4113-ad9c-e5ec70c80519_1232x928.jpeg 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><h3>A declarative language for organisations</h3><p>Drawing inspiration from Infrastructure as Code tools like Terraform, let&#8217;s imagine a declarative Domain Specific Language (DSL) that reads naturally while expressing a formal structure.</p><p>The basic syntax follows a clear pattern:</p><pre><code>EntityType "Identifier" {
    References = AnotherEntity.Identifier
    Attribute = Value
    ListAttribute = [
        "Item One",
        "Item Two"
    ]
}</code></pre><p>A type, unique identifier, and set of attributes define each entity. Entities can reference each other using dot notation, creating a web of relationships that forms our organisational graph.</p><h4>Specifying an organisation</h4><p>Let's walk through how you could define a small engineering team in this language:</p><ol><li><p>First, let&#8217;s define the roles that exist in the organisation:</p></li></ol><pre><code>Role "SoftwareEngineer" {
    Responsibilities = [
        "Write clean, maintainable code",
        "Participate in code reviews",
        "Document technical decisions"
    ]
}

Role "EngineeringManager" {
    Responsibilities = [
        "Provide technical leadership",
        "Conduct performance reviews",
        "Manage team resources"
    ]
}</code></pre><ol start="2"><li><p>Next, we&#8217;ll create an organisational unit for our team:</p></li></ol><pre><code>OrganisationalUnit "EngineeringTeam" {
    Department = "Engineering"
    CostCenter = "ENG-001"
}</code></pre><ol start="3"><li><p>With these structures in place, we can define the actual people and their relationships:</p></li></ol><pre><code>Person "AliceSmith" {
    FullName = "Alice Smith"
    Role = Role.EngineeringManager
    Unit = OrganisationalUnit.EngineeringTeam
    Email = "alice.smith@company.com"
}

Person "BobJohnson" {
    FullName = "Bob Johnson"
    Role = Role.SoftwareEngineer
    Unit = OrganisationalUnit.EngineeringTeam
    Manager = Person.AliceSmith
    Email = "bob.johnson@company.com"
}</code></pre><ol start="4"><li><p>Policy definitions create a framework for compliance:</p></li></ol><pre><code>PolicyGroup "SecurityPolicies" {
    Owner = Person.AliceSmith
}

PolicyRule "MFARequired" {
    Group = PolicyGroup.SecurityPolicies
    Enforcement = "Mandatory"
    ComplianceLevel = "Critical"
}</code></pre><ol start="5"><li><p>Finally, we can map these policies to external requirements:</p></li></ol><pre><code>ExternalRequirement "ISO27001_A9_4_1" {
    Standard = "ISO 27001:2013"
    Control = "A.9.4.1"
    ComplianceLevel = "Mandatory"
}

ComplianceMapping "MFACompliance" {
    Requirement = ExternalRequirement.ISO27001_A9_4_1
    ImplementingPolicies = [PolicyRule.MFARequired]
}</code></pre><p>This declarative approach allows us to build a complete picture of our organisation, from high-level structures to individual policies and their regulatory implications. Each definition is clear and self-documenting, while the references between entities create a graph of relationships that can be analysed, validated, and used to automate organisational processes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FnF0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FnF0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 424w, https://substackcdn.com/image/fetch/$s_!FnF0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 848w, https://substackcdn.com/image/fetch/$s_!FnF0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 1272w, https://substackcdn.com/image/fetch/$s_!FnF0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FnF0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png" width="1456" height="635" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:635,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140118,&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;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.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_!FnF0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 424w, https://substackcdn.com/image/fetch/$s_!FnF0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 848w, https://substackcdn.com/image/fetch/$s_!FnF0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.png 1272w, https://substackcdn.com/image/fetch/$s_!FnF0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bfb9e3a-a857-4388-a2c5-11c5a7c5d1f3_2126x927.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><figcaption class="image-caption">The entities declared in the DSL form a graph.</figcaption></figure></div><p>With a representation like this, we benefit from organising definitions into logical files and directories, treating organisational changes like code changes: versioned, reviewed, and validated before application. </p><p>This enables practices like reviewing changes through pull requests, testing policy modifications before rollout, and automatically generating compliance documentation while tracking the evolution of organisational structures over time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hdjr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hdjr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hdjr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hdjr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hdjr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hdjr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:418214,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.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_!Hdjr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hdjr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hdjr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hdjr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f69136a-14c5-4aa0-bbaa-1c0a90819230_1232x928.jpeg 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><h3>Building a model</h3><p>While Infrastructure as Code tools like Terraform work with directed acyclic graphs (DAGs) to determine deployment order, an organisation's structure is inherently more interconnected. People manage other people, policies reference activities that refer back to policies, and teams have complex interdependencies. This calls for an undirected cyclic graph model to represent these rich relationships.</p><pre><code>public record Node(
    string Id,          // e.g. "Person.AliceSmith"
    string Type,        // e.g. "Person", "PolicyRule"
    List&lt;Edge&gt; Relations = null
);

public record Edge(
    string FromId, 
    string ToId,
    string RelationType, // e.g. "ManagedBy"
);

public class CompanyGraph
{
    private Dictionary&lt;string, Node&gt; _nodes = new();
    private List&lt;Edge&gt; _edges = new();

    public void AddNode(string id, string type) =&gt;
        _nodes[id] = new Node(id, type);

    public void AddRelation(string fromId, string toId, string type)
    {
        var edge = new Edge(fromId, toId, type);
        _edges.Add(edge);
        (_nodes[fromId].Relations ??= new()).Add(edge);
        (_nodes[toId].Relations ??= new()).Add(edge);
    }

    // Example: Find all requirements impacted by changing a policy
    public IEnumerable&lt;Node&gt; GetImpactedRequirements(string policyId) =&gt;
        _nodes[policyId].Relations
            .Where(e =&gt; e.RelationType == "ImplementsRequirement")
            .Select(e =&gt; _nodes[e.FromId == policyId ? e.ToId : e.FromId])
            .Where(req =&gt; req.Type == "ExternalRequirement");
}</code></pre><p>The example above shows a naive implementation of a queryable graph structure based on a declarative DSL. This representation makes it easier to answer questions requiring multiple references in the structure, such as "Which external requirements would be affected if we changed our MFA policy?"</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XLJb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XLJb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XLJb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XLJb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XLJb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XLJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:285076,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.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_!XLJb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XLJb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XLJb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XLJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4811476e-62d6-4158-9343-b72f542fcc87_1232x928.jpeg 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><h3>Bridging models and reality</h3><p>A DSL can define an organisation's structure and rules, but the model must be connected to real-world data to be useful. This requires a storage strategy that can:</p><ul><li><p>Persist the organisational graph itself</p></li><li><p>Store data associated with graph entities (like evidence)</p></li><li><p>Enable validation of considered changes</p></li></ul><p>A way to deliver this at scale would be to combine several data stores: A graph database for the organisational model, a relational database for associated data, and an event store for audit trail and change tracking. If you wanted to start small, you could serialise all this information to your local filesystem instead.</p><p>To activate external data, we would need an integration framework with a plug-in architecture to bridge the organisational model and production systems. This would handle three key aspects: (1) data collection from integrated systems like GitHub or Azure, mapping evidence to nodes in our graph; (2) policy validation that programmatically checks collected evidence against rules; and (3) policy enforcement where organisational changes automatically trigger updates across connected systems&#8212;from employee provisioning to access permission changes.</p><p>The DSL would supply this functionality using built-in modules or user-supplied plug-ins to perform the work needed to interact with other systems. Let&#8217;s imagine a Control entity in the DSL which uses a custom script to perform routine checks on MFA usage and links results to the compliance mapping:</p><pre><code>Control "MFAMonitoring" {
    Implements = ComplianceMapping.MFACompliance
    
    Verify {
        Script = "Security/mfa-checks.js"
        Methods = [
            "allUsersHaveMfaEnabled"
        ]
        Frequency = "Daily"
    }
}</code></pre><p>Then in <code>security/mfa-checks.js</code>: </p><pre><code>export async function allUsersHaveMfaEnabled() {
    const users = await myAuthClient.listUsers()
    return users.every(user =&gt; user.mfaEnabled)
}</code></pre><p>The solution should be open and extendable to maximise its usefulness, allowing for custom integrations, validations, and automation. Terraform does a good job of this with its &#8220;<a href="https://developer.hashicorp.com/terraform/language/providers">Providers</a>&#8221; plug-in architecture, although integrations to inspect and modify data in corporate systems might need to support more custom scripting.</p><p>For organisations wanting to test this approach, you could start small:</p><ol><li><p>Model just your organisational structure and reporting lines.</p></li><li><p>Add key policies and compliance mappings.</p></li><li><p>Begin connecting to your most critical systems.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vw8K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vw8K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vw8K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vw8K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vw8K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vw8K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:463092,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.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_!Vw8K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vw8K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vw8K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vw8K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ad1389-c5e3-45e2-96ec-3938cf5e1cdd_1232x928.jpeg 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><h3>Making it shine</h3><p>A code-based declaration of an organisation offers powerful capabilities for technologists, but we also need to acknowledge that many business stakeholders don&#8217;t &#8220;think in code&#8221;. </p><p>The elegance of a DSL doesn&#8217;t have to be limited to those most comfortable with text editors and version control software. A genuinely accessible &#8220;Company as Code&#8221; solution must connect a programmatic representation and the business users who make daily decisions about organisation structure, policy and compliance.</p><p>This could be solved with a low-code / no-code interface where:</p><ul><li><p><strong>Business leaders </strong>drag and drop organisational entities and reporting structures while the system generates code declarations behind the scenes.</p></li><li><p><strong>Compliance officers</strong> use simple forms to define policies and instantly visualise which parts of the business they affect. When regulations change, they can quickly identify gaps or conflicts through visual highlighting.</p></li><li><p><strong>Technologists</strong> keep the codebase organised and provide data integrations and tools to implement policy in external systems.</p></li></ul><p>With an approach like this, we can maintain the rigour of the code model while making it accessible to everyone. Changes through the interface update the underlying code, preserving that single source of truth that can be versioned and validated.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hb3s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hb3s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hb3s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hb3s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hb3s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hb3s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:350162,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://42futures.substack.com/i/157739313?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.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_!Hb3s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Hb3s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Hb3s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Hb3s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1848a14-156f-41ce-91e6-2561a0c9f985_1232x928.jpeg 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><h3>Final notes</h3><p>Beyond the technical feasibility, the real promise lies in the organisational benefits: faster audits, clearer decision-making, and better understanding of changes' impact before implementing them. <strong>Hundreds of hours spent on compliance documentation could instead be invested in creating value.</strong></p><p>In this post, I hoped to establish that a codification of organisational structure is <em><strong>missing</strong></em> and that it&#8217;s <em><strong>buildable</strong></em>. Practical? Don&#8217;t know. Viable? I don&#8217;t have the answer. <em><strong>Buildable, though?</strong></em> Yes. I believe so.</p><p>Let me know what you think about it.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[It's time to break free from Corporate Agile]]></title><description><![CDATA[I'm a bit of a Reddit lurker.]]></description><link>https://blog.42futures.com/p/corporate-agile</link><guid isPermaLink="false">https://blog.42futures.com/p/corporate-agile</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Sun, 11 Feb 2024 15:00:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2691d4dd-2973-4417-85f4-87dbf53a0510_1232x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I'm a bit of a Reddit lurker. I hang around the tech communities. Occasionally, I review memes. You know, serious business. Over the years, I've noticed a shift in sentiment about agile working methods in these communities. <em>Agile is dead</em>, they say.</p><p>In this article, I'll introduce <strong>Corporate Agile</strong> as a way to label dark patterns that drive the rising negativity about agile working methods. As a path forward, I will make the case for a return to principles with <strong>Basic Agile</strong>.</p><h2>The Heart of Agile</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q7ta!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q7ta!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!Q7ta!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!Q7ta!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!Q7ta!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q7ta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Q7ta!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!Q7ta!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!Q7ta!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!Q7ta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d1f8592-a628-42f0-9e4b-375259f96e24_1232x928.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>I welcome a change of attitude - too many Agile implementations seem to create significant worker frustration and corporate overhead. It inevitably leads to debates about whether insert-your-favourite-flavour-of-agile is inherently broken or poorly implemented.</p><p>Nevertheless, I don't think the agile principles are wrong. An agile mindset is fantastic when working under complexity and uncertainty. In circumstances like these, a plan-driven approach isn't helpful because the outcomes of the process are too hard to predict.</p><p>Consider questions like these, common-place in start-ups and software shops:</p><ul><li><p><em>What is the best way to do something youve never done before?</em></p></li><li><p><em>What do customers want, what do they need, and what will they pay for?</em></p></li><li><p><em>How could markets and funding impact our capacity to do the thing?</em></p></li><li><p><em>What might competitors do, and how should we react?</em></p></li></ul><p>As workers in tech, we participate in hard-to-predict <a href="https://en.m.wikipedia.org/wiki/Complex_system#:~:text=Complex%20systems%20are%20systems%20whose,given%20system%20and%20its%20environment.">Complex Systems</a> because people, markets and new inventions are involved. How can we thrive in such conditions? Well, in an agile spirit, we make headway by:</p><ul><li><p><strong>Collaborating closely and communicating often</strong> to come up with good starting ideas.</p></li><li><p><strong>Working in small increments</strong>, doing the important parts first to test our ideas against reality.</p></li><li><p><strong>Continually reflecting and improving</strong> from our experiences, changing course when needed.</p></li></ul><p>Dead simple. Thats just my rough summary of <a href="https://heartofagile.com">Heart of Agile</a>, by the way - a response to the overly complex state of the Agile industry launched by <a href="https://en.m.wikipedia.org/wiki/Alistair_Cockburn">Alastair Cockburn</a>, an agile-manifesto-original.</p><p>Theres no need to evangelise or make a religion of it: <strong>Working Agile boils down to prioritising adaptability over predictability</strong>. We minimise risk by reacting quickly to unforeseen troubles, and we maximise impact by reprioritising based on the opportunities we see. In times when the future is hard to predict, an agile way of working is remarkably efficient.</p><h2>Corporate Agile</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Egs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Egs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!6Egs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!6Egs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!6Egs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Egs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!6Egs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!6Egs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!6Egs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!6Egs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed610785-91dc-4fc8-a4a2-5314904ef54e_1232x928.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The straightforward and practical mantra of Agile is getting lost in complicated processes, pedantry and productivity theatre.</p><p>Reputable Agile voices have highlighted this problem before: Agile, as implemented in many organisations, is bloated, inefficient and, frankly, missing the point.</p><ul><li><p><a href="https://en.m.wikipedia.org/wiki/Martin_Fowler_(software_engineer)">Martin Fowler</a> calls it <a href="https://martinfowler.com/articles/agile-aus-2018.html">faux-agile</a>, perpetuated by the <a href="https://martinfowler.com/articles/agile-aus-2018.html">agile industrial complex</a>.</p></li><li><p><a href="https://en.m.wikipedia.org/wiki/Ron_Jeffries">Ron Jeffries</a> talks about <a href="https://ronjeffries.com/articles/016-09ff/defense/">Dark Scrum</a>.</p></li><li><p><a href="https://en.m.wikipedia.org/wiki/Andy_Hunt_(author)">Andy Hunt</a> said, "Agile now means we do half of Scrum poorly and use Jira".</p></li></ul><p>Some even advocate for leaving the Agile label behind to escape its widespread misimpression. I think that would be throwing the baby out with the bathwater, but that's just me. At least, we should continue to shed light on the dysfunction and figure out how to avoid it. I'll call it <em><strong>Corporate Agile</strong></em>.</p><p><strong>Corporate Agile</strong> attempts to prioritise adaptation AND predictability, not realising that you must prefer one over the other. It maintains a strict hierarchical decision-making process. It assumes general managers are qualified to decide how specialists should do their work.</p><p><strong>Corporate Agile</strong> reckons splitting work into arbitrary deadlines (like sprints) improves meaningful outcomes. It believes estimates are accurate and uses them to plan delivery timelines. It uses prescriptive metrics like velocity and burndown, prompting teams to do work that fits in the box, regardless of whether its valuable.</p><p><strong>Corporate Agile</strong> needs coaches, consultants and middle managers in abundance to keep workers in line. It supposes that a 2-day course prepares someone without technical or domain expertise to run the process. It does not show concern that all involved attend lengthy mandatory meetings to conform to the process. It does not admit to the astounding amount of time and money wasted, which couldve been spent working on tangible outcomes for real customers.</p><p>In summary, Corporate Agile practices emerge when businesses attempt to implement Agile as a "canned process" while continuing to apply traditional project management thinking to the process, unwilling to pass control to the workers.</p><h2>The price of planning</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HX4B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HX4B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!HX4B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!HX4B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!HX4B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HX4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HX4B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!HX4B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!HX4B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!HX4B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad33bf-fe22-4d23-9a2e-a137c32bb915_1232x928.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>To get an indication of the price we pay to do Corporate Agile, lets review the time spent to perform a typical process. Ill take a Scrum team as an example, making a few simplifications to make measures easy to follow.</p><p>Our hypothetical team consists of <a href="https://www.scrum.org/forum/scrum-forum/5759/development-team-size">7 Developers</a> doing <a href="https://agilepainrelief.com/blog/choosing-scrum-sprint-length.html">1-week sprints</a>. They have four team meetings each sprint: Refinement, Planning, Retrospective and Review. Well assume each meeting takes one hour, totalling four hours a week per person.</p><p><strong>That's 28 person-hours spent each week</strong> doing Scrum instead of doing work that directly benefits customers, and were not even counting the Daily. Now add the overhead of a professional scrum master, dedicated product owner, and layers of management between the team and its real stakeholders.</p><p>I think it's fair to say this team uses the equivalent of a full-time role (or more!) in meetings and management to keep the gears turning. Think about that. What did they gain? In my experience, efforts toward backlog grooming, task refinement, and sprint planning rarely yield noticeable benefits except to make work fit in a box.</p><p>For those currently in Scrum teams, ask yourself which would make your products more awesome: These meetings? Another engineer, designer, artist or domain expert? Budget for tools, services or runway? A few hours to relax and recharge?</p><p>Of course, coordinating a group of co-workers costs <em>something</em>. My point here is that <strong>Corporate Agile encourages wasteful behaviour</strong> - large groups of clever people sitting around in lengthy sessions to coordinate, align, and plan work that is likely to change before it's even ready to be started. These meetings are typically run by managers, and only a few participants contribute. <strong>We can do better than that.</strong></p><h2>The blame game</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3XdM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3XdM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!3XdM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!3XdM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!3XdM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3XdM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!3XdM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!3XdM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!3XdM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!3XdM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29fe3172-dba9-4771-86e9-d47f1964619b_1232x928.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Techies often point to the business as the perpetrator when an organisation devolves into Corporate Agile. But I've also noticed that some technical types are quick to forfeit responsibility, like taking the role of a code monkey working on tickets and waiting for payday. Compared to speaking up, taking ownership and collaborating intently, working tickets is a simple and comfortable life (but only half the fun).</p><p>Zooming out, I do think multiple groups contribute to the problem:</p><ul><li><p><strong>Leaders</strong> keen to exert control and influence may disempower the teams, denying their ability to reflect and adapt.</p></li><li><p><strong>Managers</strong> who seek self-preservation may unnecessarily insert themselves into the work, making processes complicated and bureaucratic.</p></li><li><p><strong>Consultants and trainers</strong> who hunger for sales may tell corporate clients what they want to hear: <em>Sure, Agile methods are compatible with a top-down, plan-driven approach. It's called SAFe. Yes, you can have your cake and eat it, too!</em></p></li><li><p><strong>Workers</strong> who choose the path of least resistance may not speak up about barriers to work that they face for fear of conflict or apprehension to change.</p></li><li><p><strong>Stakeholders and customers</strong> who feel unsettled by uncertainty may push toward fixed-scope solutions that require a more plan-driven approach.</p></li></ul><p>Yeah, I'm firing shots at everybody here. If you agree with me, you can see that a goal of being agile concerns the entire organisational stack, not just a single group.</p><p>Every individual is unique. Some struggle without the predictability of a plan-driven approach, while others thrive. It's important to be empathetic to that, understanding that agility does not come naturally to all.</p><h2><strong>Basic Agile</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4rFr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4rFr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!4rFr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!4rFr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!4rFr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4rFr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4rFr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!4rFr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!4rFr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!4rFr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c040673-f523-454d-9e3a-cf3a05f6b082_1232x928.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If Corporate Agile is so bad, how can we do better?</p><p>I think we need to strip away the broken processes and go back to basics. I'll call it <em><strong>Basic Agile</strong></em>, but it has many names: (lowercase) agile, Heart of Agile, the Agile principles and being agile.</p><p><strong>Basic Agile</strong> is about returning to the principles of agility, allowing teams to self-organise to be efficient and under uncertainty. It's about rejecting the complicated processes that spawn from corporate bureaucracy. It's not something you can easily buy or roll out as a one-size-fits-all ruleset. It's about adopting a no-nonsense way of thinking about work that lowers the barriers to prioritising things that make customer's lives better.</p><p><strong>Basic Agile</strong> empowers those closest to the work to decide how the job gets done. It flips the control flow of the organisation from top-down to bottom-up: Managers support the teams to do their best work rather than telling them what to do. That leaves less to manage, and naturally, the management layer shrinks as a result.</p><p><strong>Basic Agile</strong> is about embracing uncertainty. It's being humble to the fact that we simply don't know enough for big plans to be realistic. It's about climbing a mountain one step at a time, finding the route as we go, and making our way to the peak at a sustainable pace.</p><p><strong>Basic Agile</strong> has certain prerequisites. You need:</p><ul><li><p><strong>Strong teams</strong> that can get great work done without intervention.</p></li><li><p><strong>Managers who support their teams</strong> without controlling or sheltering them.</p></li><li><p><strong>Leaders who can set a goal</strong> without dictating how it should be achieved.</p></li><li><p><strong>Contracts that are flexible in scope.</strong> If youre working under fixed-price-fixed-scope terms, agility is impossible.</p></li><li><p><strong>A readiness among all to face uncertainty,</strong> make changes and figure things out along the way.</p></li></ul><p>If you can't satisfy these requirements, you may be better off dropping Agile entirely and embracing a plan-based approach like Waterfall despite its well-known disadvantages.</p><p>How do teams practice Basic Agile? The short answer is that it's up to them. People, projects and priorities differ, so it makes sense that a team can figure out a workflow that suits them instead of just following the Scrum Bible.</p><p>Tools? You can use Jira, Monday, Trello, Tuesday, Atera, Wednesday, post-its, or whatever works for you. The critical thing is that everyone involved can:</p><ul><li><p><strong>Collaborate closely and communicate often</strong>.</p></li><li><p><strong>Work in small increments</strong>.</p></li><li><p><strong>Continually reflect and improve</strong>.</p></li></ul><p>I'm starting to sound like a broken record here. By focusing on principles over process, Basic Agile encourages teams to learn and develop the best approach for their problem space.</p><p>Basic Agile is less like executing a plan and more like a process of evolution that drives towards more optimal solutions. However, we can still understand our progress by projecting past work into the future. These projections are like weather forecasts where results are consistent in the short term and get more uncertain as you look further out. Forecasts are much better than estimates because they're based on empirical data instead of guesswork. If you're interested in this, <a href="https://www.youtube.com/watch?v=QVBlnCTu9Ms">I recommend you watch Allen Holub's talk on #NoEstimates</a>.</p><h2>A Basic example</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L43h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L43h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!L43h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!L43h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!L43h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L43h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!L43h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!L43h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!L43h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!L43h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b476262-1af5-49c3-90c7-3241ca767d01_1232x928.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>To make things more practical, I'll share some highlights from the process weve developed in my current team. For context, we work on spatial training simulators.</p><p>Our daily routine starts with a 15-minute "App Bash" for testing the latest build - optional and open to all. A focused 15-minute Daily follows this to hash out findings and today's blockers. For deep dives, we turn to Slack and ad-hoc huddles.</p><p>Sprint planning stays short and flexible, focusing on weekly themes and potential dependencies between people. We break features into tasks when we're actually ready to work on them, and we don't spend time on estimates.</p><p>Immediate concerns? We tackle them on the spot and hold a Retro every few months for a deeper look.</p><p>For those interested in our progress on long-term objectives, we make rough forecasts based on past work. Between forecasts, open builds and Slack updates, we don't need formal Review meetings.</p><p>Compared to the Corporate Scrum example from before, we get by just fine with <strong>less than a quarter of the weekly person-hours</strong> dedicated to team meetings. We don't have a product owner or project lead, as we collaborate directly with our stakeholders.</p><p>We've worked this way throughout 2023, and <strong>things have not descended into chaos.</strong> To the contrary: The team is healthy, and we keep delivering great work in good time.</p><p>Your mileage may vary. The point isn't that you should replicate our process in your teams, but it's worthwhile allowing your teams to find their own.</p><h2>Now what?</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mLM7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mLM7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!mLM7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!mLM7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!mLM7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mLM7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8376a13-bffc-4871-aea8-e2e800670291_1232x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mLM7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 424w, https://substackcdn.com/image/fetch/$s_!mLM7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 848w, https://substackcdn.com/image/fetch/$s_!mLM7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 1272w, https://substackcdn.com/image/fetch/$s_!mLM7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8376a13-bffc-4871-aea8-e2e800670291_1232x928.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If you just read this and thought, <em>That made sense to me</em>, then maybe you should try making things more Basic and observe the outcome. If things get better, try doing more of that. Let me know how it goes. If you're looking to shake things up, you could quit doing Scrum and re-design your process with adaptability and efficiency in mind.</p><p>Tell your friends - the extent to which the organisational stack understands agile principles is vital to the success of a Basic Agile approach.</p><p>Walking away from established processes takes some courage, but remember: Nothing is stopping you from going back if things don't work out. You might learn something new, and if you can adapt and improve from it, that is an agile way to be.</p><div><hr></div><p>Daniel Rothmann runs <a href="https://42futures.com">42futures</a>, where he helps technical leaders validate high-stakes technical decisions through structured software pilots.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[From order to chaos: Anti-patterns in Unity software design]]></title><description><![CDATA[Unity is undeniably a powerful game engine, but there's a disheartening trend I can't ignore: Too many projects developed with Unity end up in a complete mess.]]></description><link>https://blog.42futures.com/p/anti-patterns-in-unity-software-design</link><guid isPermaLink="false">https://blog.42futures.com/p/anti-patterns-in-unity-software-design</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Fri, 21 Jul 2023 09:13:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4e7a8a31-5d0e-4af5-803e-9db89ef90223_1536x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://unity.com/">Unity</a> is undeniably a powerful game engine, but there's a disheartening trend I can't ignore: Too many projects developed with Unity end up in a complete mess.</p><p>In the Unity project graveyard, many ventures meet their demise in silence. Unsuccessful initiatives are plenty, often abandoned due to a slow buildup in complexity that brings development to a painful, grinding halt.</p><p>Over the years, I've noticed that many of us (myself included) fall into bad habits while designing software with Unity. Today, I want to share these anti-patterns with you so you can avoid them in your projects.</p><blockquote><p>In this article, I'll focus on Unity's <code>MonoBehaviour</code> paradigm.</p></blockquote><h2>Excessive use of global state</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xlfw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xlfw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!xlfw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!xlfw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!xlfw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xlfw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a group of people standing around a table, writing on the same document&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="a group of people standing around a table, writing on the same document" title="a group of people standing around a table, writing on the same document" srcset="https://substackcdn.com/image/fetch/$s_!xlfw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!xlfw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!xlfw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!xlfw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42c48b3a-6ec0-4c8b-b64c-30f08d856462_1536x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p><a href="https://docs.unity3d.com/Manual/Hierarchy.html">The Hierarchy</a> is a central concept in Unity, and it makes it extremely easy to access shared state. For instance, any <a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.html">MonoBehaviour</a> can find and use any <a href="https://docs.unity3d.com/ScriptReference/GameObject.html">GameObject</a> and its corresponding behaviors. Each MonoBehaviour can manage them as needed, including making changes or removing them.</p><p><a href="https://docs.unity3d.com/Manual/class-GameObject.html">It's a straightforward programming model</a>: A GameObject represents a game entity that combines individual behaviors to perform complex tasks in a modular way.</p><p>The MonoBehaviour concept blurs the lines between software and data. When we add behaviors to a GameObject, we are composing functionality, but also configuration, such as which other GameObjects our behaviors will interact with.</p><p>This is easily overlooked - how all this configuration, <em>all this data,</em> is exposed to other entities in the Hierarchy. Unfortunately, this exposure can lead to breaking encapsulation principles.</p><h3>What's wrong with that?</h3><p>Let's take an example. In your Unity project, you're developing a user interface with nested GameObjects, each representing individual UI elements.</p><p>Some of these nested objects have MonoBehaviours with public fields like <code>Width</code> or <code>FontColor</code>. These are intended to be configured by their parent UI window.</p><pre><code>Unity Hierachy
&#9500;&#9472;&#9472; MyUserInterface
&#9474;   &#9500;&#9472;&#9472; FirstUiWindow
&#9474;   &#9474;   &#9500;&#9472;&#9472; APanel
&#9474;   &#9474;   &#9500;&#9472;&#9472; AButton
&#9474;   &#9500;&#9472;&#9472; SecondUiWindow
&#9474;   &#9474;   &#9500;&#9472;&#9472; SomeText
&#9474;   &#9474;   &#9500;&#9472;&#9472; AnAnimation</code></pre><p>As the UI implementation grows, you notice that certain elements directly access public fields on other nested objects in the Hierarchy. For instance, when you press a button within one UI window, it directly modifies the <code>FontColor</code> property on a text element in a different UI window.</p><pre><code>Unity Hierachy
&#9500;&#9472;&#9472; MyUserInterface
&#9474;   &#9500;&#9472;&#9472; FirstUiWindow
&#9474;   &#9474;   &#9500;&#9472;&#9472; APanel
&#9474;   &#9474;   &#9500;&#9472;&#9472; AButton       &gt;&gt;| OnPress()
&#9474;   &#9500;&#9472;&#9472; SecondUiWindow      |
&#9474;   &#9474;   &#9500;&#9472;&#9472; SomeText      &lt;&lt;| FontColor = Color.Green
&#9474;   &#9474;   &#9500;&#9472;&#9472; AnAnimation</code></pre><p>The button and text elements are now directly related, even though you would not expect them to be so. We could easily imagine how you could end up with several other UI elements modifying this same text element.</p><p>Direct access between nested objects creates tight coupling within the system, and unintended consequences start to emerge. The UI elements become harder to maintain, as any one component may be modified by many others, causing <a href="https://en.wikipedia.org/wiki/Race_condition#:~:text=A%20race%20condition%20can%20arise,bugs%20due%20to%20unanticipated%20behavior.">race conditions</a> and making bug detection and resolution a challenging task.</p><p>As developers venture into the labyrinth of tightly coupled UI complexities, stress and frustration rear their mischievous heads &#128545; The absence of clear separation and encapsulation casts a shadow on the code, slowing down progress to a snail's pace.</p><h3>Tips to limit global state exposure</h3><ol><li><p>If you're intending to expose a class field for setting in the <a href="https://docs.unity3d.com/Manual/UsingTheInspector.html">Unity Inspector</a>, but not for other behaviors to modify, consider making it <a href="https://docs.unity3d.com/ScriptReference/SerializeField.html"><code>[SerializeField] private</code></a> instead of <code>public</code>.</p></li><li><p>If changing a class field has side effects, consider exposing it through <a href="https://stackoverflow.com/questions/11159438/looking-for-a-short-simple-example-of-getters-setters-in-c-sharp">setter methods</a> or <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-properties">properties</a> that can validate the new value and apply side effects immediately, providing better observability when things go wrong.</p></li><li><p>When a group of GameObjects are directly related, encapsulate them in a <a href="https://docs.unity3d.com/Manual/Prefabs.html">Prefab</a>. If you are feeling particularly defensive, instantiate children at runtime, so they cannot be referenced by other entities at edit-time.</p></li><li><p>Try to point Inspector references laterally or downward in the Hierarchy. Avoid referencing entities and behaviors that are not siblings or children of the GameObject you're working on.</p></li><li><p>Avoid global search methods like <a href="https://docs.unity3d.com/ScriptReference/Object.FindObjectOfType.html"><code>FindObjectOfType</code></a> when possible. Instead, opt for <a href="https://docs.unity3d.com/ScriptReference/GameObject.GetComponent.html"><code>GetComponent</code></a> or <a href="https://docs.unity3d.com/ScriptReference/Component.GetComponentInChildren.html"><code>GetComponentInChildren</code></a> to limit the search to the current entity or its children in the Hierarchy.</p></li></ol><h2>Weak dependency management</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y2j8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y2j8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!Y2j8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!Y2j8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2j8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y2j8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Y2j8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!Y2j8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!Y2j8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Y2j8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a895b39-68f5-40f2-9946-eed7de2215a4_1536x768.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If you've worked with <a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection">.NET's dependency injection features</a> in other contexts, you'll likely share my frustration with the absence of robust dependency management in most Unity codebases.</p><p>Unity offers a helpful attribute called <a href="https://docs.unity3d.com/ScriptReference/RequireComponent.html"><code>[RequireComponent]</code></a>, allowing us to state dependencies explicitly. By using this attribute, when we add a new component to a GameObject in the Editor, all the required dependencies are automatically included.</p><p>However, the real challenge lies in handling unstated dependencies that lurk beneath the surface. These hidden dependencies may not be immediately apparent, but they can wreak havoc at runtime, leading to perplexing and unexpected issues. A repeat offender is the use of <a href="https://docs.unity3d.com/ScriptReference/GameObject.GetComponent.html"><code>GetComponent</code></a> to find a MonoBehaviour, which introduces implicit dependencies that may cause problems down the road.</p><p>To complicate things further, we cannot make assumptions on the execution order of game loop callbacks for MonoBehaviours unless we manually manage them using the <a href="https://docs.unity3d.com/Manual/class-MonoManager.html">Script Execution Order settings</a> or the less-known <a href="https://forum.unity.com/threads/undocumented-but-public-defaultexecutionorder-attribute.530618/"><code>[DefaultExecutionOrder]</code></a> attribute. For this reason, each behavior may need to double-check if its dependencies are ready before trying to use them.</p><h3>So, what's the problem?</h3><p>Let's expand upon the previous example to illustrate the scenario further. Imagine you have a UI window dedicated to displaying a player's inventory, organized in the Hierarchy as follows:</p><pre><code>Unity Hierachy
&#9500;&#9472;&#9472; MyUserInterface
&#9474;   &#9500;&#9472;&#9472; InventoryWindow
&#9474;   &#9474;   &#9500;&#9472;&#9472; AllItemsPanel
&#9474;   &#9474;   &#9500;&#9472;&#9472; SelectedItemImage
&#9474;   &#9474;   &#9500;&#9472;&#9472; EquipItemButton</code></pre><p>Similar to before, the <code>InventoryWindow</code> contains several UI elements, each designed for specific purposes. To bring it together, we add a new script called <code>InventoryWindowManager</code> to the <code>InventoryWindow</code> entity:</p><pre><code>public class InventoryWindowManager : MonoBehaviour
{
    private void Awake()
    {
        // Get the button component and subscribe to press events
        var button = GetComponentInChildren&lt;MyButton&gt;();
        button.OnPressed += OnEquipItemButtonPressed();
    }

    private void OnEquipItemButtonPressed()
    {
        // TODO: Equip the selected item from inventory...
    }
}</code></pre><p>Initially, using <code>GetComponentInChildren</code> in <code>InventoryWindowManager</code> seems promising. It finds the <code>MyButton</code> component on <code>EquipItemButton</code> within the <code>InventoryWindow</code> hierarchy and handles its <code>OnPressed</code> event smoothly.</p><p>However, as the project evolves, challenges arise from this implicit dependency. UI changes, like altering the <code>InventoryWindow</code> layout or using a different button interaction can break the implicit link established by <a href="https://docs.unity3d.com/ScriptReference/Component.GetComponentInChildren.html"><code>GetComponentInChildren</code></a>. This may lead to null references or unexpected behavior during runtime.</p><p>Moreover, the current implementation tightly binds the <code>InventoryWindowManager</code> script to the specific hierarchy of the <code>InventoryWindow</code>, limiting its flexibility and reusability.</p><p>As the codebase expands, dealing with implicit dependencies becomes an exasperating task, hindering progress and creating a sense of burden in the development process.</p><h3>Tips to manage your dependencies</h3><ol><li><p>If it makes sense to store dependent behaviors on the same GameObject, use the <a href="https://docs.unity3d.com/ScriptReference/RequireComponent.html"><code>[RequireComponent]</code></a> attribute to automatically enforce the dependency.</p></li><li><p>Instead of using search methods like <a href="https://docs.unity3d.com/ScriptReference/Component.GetComponentInChildren.html"><code>GetComponentInChildren</code></a>, consider if you can take a dependency explicitly in the Editor with a serialized private field instead.</p></li><li><p>Gather and validate all your behavior's dependencies in <a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html"><code>Awake</code></a> or <a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html"><code>Start</code></a>. This makes it easier to debug problems caused by bad dependencies down the road.</p></li><li><p>In situations where a dependency could be uninitialized or null, <a href="https://docs.unity3d.com/ScriptReference/Assertions.Assert.html">Assertions</a> can be used to validate it in a performant way, as these are automatically stripped from production builds.</p></li><li><p>Try out a dependency injection framework like <a href="https://github.com/gustavopsantos/Reflex">Reflex</a> or <a href="https://github.com/hadashiA/VContainer">VContainer</a>, or <a href="https://moderncsharpinunity.github.io/post/dependency-injection-on-unity/">make your own IoC container</a> and learn something new!</p></li></ol><h2>Hard-to-verify behavior</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HS2W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HS2W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!HS2W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!HS2W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!HS2W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HS2W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!HS2W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!HS2W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!HS2W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!HS2W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc12f98da-e8b3-489c-85b8-9483d45ecc57_1536x768.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Many developers, including myself, tend to lean towards manual testing when working with Unity. However, I think it's worth questioning whether <a href="https://unity.com/how-to/automated-tests-unity-test-framework">automated testing</a> would be more appealing if our components weren't so tightly coupled.</p><p>Personally, I have found the most value in targeting the lower end of the <a href="https://martinfowler.com/articles/practical-test-pyramid.html">Testing Pyramid</a>, focusing on component tests that validate individual behaviors from the <a href="https://www.stride.build/blog/outside-in-versus-inside-out-tdd">"outside-in"</a> through their public interfaces. Oftentimes, MonoBehaviour methods (like <a href="https://docs.unity3d.com/ScriptReference/MonoBehaviour.Update.html"><code>Update</code></a>) don't return a result. Instead, they produce side effects in the Hierarchy or their dependencies. These can be verified with automated tests.</p><p>Yet, the path to effective testing is often obstructed by coupling and dependency management issues. Additionally, most Unity apps rely heavily on Unity engine features, and these are often accessed through <a href="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members">static methods</a> or classes without interfaces. This makes it hard to test a behavior independently of the engine.</p><p>Without careful consideration, individual scripts become entangled in specific contexts, resulting in what I call "hard-to-verify behavior." Such behaviors heavily depend on their surroundings, breaking when they are moved away from certain components, Hierarchy objects, or if they are instantiated at the wrong time. As the number of such behaviors grows, manual testing becomes the only way to ensure app functionality, leading to an error-prone process as the app's complexity expands.</p><h3>A concrete example</h3><p>Imagine you are developing a 2D platformer game with a player character controlled by a MonoBehaviour script called <code>PlayerController</code>. The script handles essential functionalities such as movement, jumping, and collision detection:</p><pre><code>[RequireComponent(typof(RigidBody))]
public class PlayerController : MonoBehaviour
{
    public delegate void PlayerEvent();
    public event PlayerEvent OnPlayerDied;

    private bool _isInvincible;

    public void SetInvincibility(bool shouldBeInvincible)
    {
        _isInvincible = shouldBeInvincible;
        // TODO: Do more stuff while invincible (e.g., visual effects)
    }

    private void OnCollisionEnter(Collision collision)
    {
        // Trigger death event on collission if not invincible
        if (!_isInvincible)
        {
            OnPlayerDied();
        }
    }

    // TODO: Movement, jumping, etc.
}</code></pre><p>Initially, everything seems to work well, and manual testing confirms that the game behaves as expected. However, as the development progresses and more features are added, the codebase starts to become more complex.</p><p>Now, you want to introduce a new power-up that gives the player temporary invincibility. To achieve this, you create a <code>PowerUpController</code> script that manages the power-up behavior:</p><pre><code>[RequireComponent(typof(PlayerController))]
public class PowerUpController : MonoBehaviour
{
    private PlayerController _playerController;

    private void Awake()
    {
        _playerController = GetComponent&lt;PlayerController&gt;();
    }

    public async Task ApplyInvincibilityPowerUp()
    {
        // Make player invincible for 5 seconds
        _playerController.SetInvincibility(true);
        await Task.Delay(5000);
        _playerController.SetInvincibility(false);
    }
}</code></pre><p>However, you soon discover that interacting with the existing <code>PlayerController</code> script is not as straightforward as you thought. This script depends on Unity's physics system, making it challenging to test in isolation. When trying to verify the behavior of the <code>PowerUpController</code> through automated testing, difficulties arise again due to these interactions with physics, which cannot be easily mocked or simulated.</p><p>As more features are added, and the game becomes more intricate, manual testing becomes increasingly time-consuming and prone to human error. Bugs related to the interactions between different scripts, such as the <code>PowerUpController</code> and <code>PlayerController</code> may go unnoticed until playtesting, leading to a frustrating development experience and potentially jeopardizing the project's success.</p><h3>Tips to make your logic more testable</h3><ul><li><p>Instead of an all-or-nothing mindset, make a habit of writing automated tests for critical things. This will help nudge your designs towards <a href="https://ericvruder.dk/20191014/writing-testable-code-an-intro-to-unit-testing/">testable behaviors</a>, and these can be tested more extensively later if necessary.</p></li><li><p>If a class relies heavily on Unity engine features, consider creating <a href="https://www.c-sharpcorner.com/article/wrapper-patterns-in-C-Sharp-part-i/">wrappers</a> with <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface">interfaces</a> that you can replace for test doubles when needed.</p></li><li><p>Consider using the <a href="https://martinfowler.com/bliki/HumbleObject.html">Humble Object pattern</a> to segregate your business logic from engine code, making it a lot simpler to set up in tests.</p></li><li><p>Avoid <a href="https://gamedevbeginner.com/singletons-in-unity-the-right-way/">singletons</a>. If you are using <a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection">dependency injection</a>, consider registering a service instead, so it can be replaced with a test double when needed.</p></li><li><p>Check out <a href="https://kentbeck.github.io/TestDesiderata/">Test Desiderata</a> for a great overview of tradeoffs and valuable properties in automated tests.</p></li></ul><h2>In conclusion</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K81D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K81D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!K81D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!K81D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!K81D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K81D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!K81D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 424w, https://substackcdn.com/image/fetch/$s_!K81D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 848w, https://substackcdn.com/image/fetch/$s_!K81D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 1272w, https://substackcdn.com/image/fetch/$s_!K81D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd5844-3c6f-496c-8ad8-17ff1f698bb2_1536x768.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Navigating the Unity software design landscape can be a difficult task, but understanding and avoiding common anti-patterns will lead to faster development progress and more maintainable projects.</p><p><em><strong>Excessive use of global state</strong></em> leads to coupling and race conditions, making it hard to maintain and extend your app. By limiting global state exposure and embracing encapsulation principles, you can achieve a more modular and robust design.</p><p><em><strong>Weak dependency management</strong></em> can introduce hidden links, causing runtime issues and restricting the flexibility of your codebase. Embracing explicit dependency declarations or utilizing dependency injection frameworks can help untangle these complexities.</p><p><em><strong>Hard-to-verify behavior</strong></em>, arising from tightly coupled scripts and a heavy reliance on platform features, can become a testing nightmare. By prioritizing automated testing, segregating business logic from engine code, and employing designs like the Humble Object pattern, you can make your components more testable and easier to maintain.</p><p>In my view, understanding and addressing these anti-patterns is key to maintaining a well-organized and stable project. By employing best practices, embracing modular design, and prioritizing automated testing, you can create harmony in your Unity software designs, setting the stage for successful and enjoyable development experiences.</p>]]></content:encoded></item><item><title><![CDATA[The Overlooked Benefits of Range in Software Engineering]]></title><description><![CDATA[In most fields &#8212; especially those that are complex and unpredictable &#8212; generalists, not specialists, are primed to excel.]]></description><link>https://blog.42futures.com/p/the-overlooked-benefits-of-range-in-technology-415a394092cf</link><guid isPermaLink="false">https://blog.42futures.com/p/the-overlooked-benefits-of-range-in-technology-415a394092cf</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Wed, 01 Dec 2021 14:52:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/59eb426b-5bb2-432c-a600-2e751ccb6776_800x484.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ryWh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ryWh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ryWh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ryWh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ryWh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ryWh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!ryWh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ryWh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ryWh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ryWh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a6ae4b9-828a-4ab0-bef4-7767f7350320_800x484.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Earlier this year, I read <a href="https://davidepstein.com/the-range/">David Epstein's "Range</a>." It's a great book that presents a lot of evidence favoring a generalist approach to complex work. Since reading it, thoughts have kept circulating in my mind about how its ideas apply in software, data, and technology&#8202;&#8212;&#8202;Here's my take.</p><blockquote><p>David Epstein examined the world&#8217;s most successful athletes, artists, musicians, inventors, forecasters and scientists. He discovered that in most fields&#8202;&#8212;&#8202;especially those that are complex and unpredictable&#8202;&#8212;&#8202;generalists, not specialists, are primed to excel. Generalists often find their path late, and they juggle many interests rather than focusing on one. They&#8217;re also more creative, more agile, and able to make connections their more specialized peers can&#8217;t see.</p></blockquote><h3>A sports&nbsp;analogy</h3><p>We've all heard tales of child prodigies. This type of story is the ultimate archetype of early specialization and its benefits. In the world of sports, we have <a href="https://en.wikipedia.org/wiki/Tiger_Woods">Tiger Woods</a>, who showcased<a href="https://www.youtube.com/watch?v=MxPmzIKBris&amp;ab_channel=XateFN"> his golf skills on national TV at two</a>! Safe to say, Tiger was on his road to mastery early and, by now, he's had his <a href="https://en.wikipedia.org/wiki/Outliers_%28book%29">10000 hours of deliberate practice</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0cWW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0cWW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0cWW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0cWW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0cWW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0cWW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!0cWW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0cWW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0cWW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0cWW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb129e9a-2b95-4f01-b099-721b2b6984f4_800x445.jpeg 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>With this model in mind, does it follow that the path to greatness in a tech career boils down to <em><strong>"pick something good (ASAP) and practice a lot"</strong></em>?</p><p>According to Epstein, not so. The story of tennis professional <a href="https://en.wikipedia.org/wiki/Roger_Federer">Roger Federer</a> reveals a different strategy for excellence. As a young child, Roger did not focus on tennis. Instead, he would try many sports, including skateboarding, badminton, swimming, ping pong, and basketball. Roger went on to become a tennis world champion, <a href="https://straightsets.blogs.nytimes.com/2009/05/29/not-just-tennis/">crediting his hand-eye coordination to the wide range of sports played as a child</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PpAD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PpAD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PpAD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PpAD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PpAD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PpAD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!PpAD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PpAD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PpAD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PpAD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663d63e1-e5d0-484b-820c-caa17ec3b856_800x480.jpeg 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h3>Building skills for complex environments</h3><p>At first glance, the success stories of Woods and Federer seem at odds with each other. To explain the difference, Epstein refers to psychologist <a href="https://www.jstor.org/stable/44318900">Robin Hogarth and his work on </a><strong><a href="https://www.jstor.org/stable/44318900">"kind"</a></strong><a href="https://www.jstor.org/stable/44318900"> and </a><strong><a href="https://www.jstor.org/stable/44318900">"wicked"</a></strong><a href="https://www.jstor.org/stable/44318900"> learning environments</a>.</p><blockquote><p>In kind environments, where the goal is to re-create prior performance with as little deviation as possible, teams of specialists work superbly.</p></blockquote><p>Golf is a <strong>kind</strong> learning environment. To succeed, you must be able to repeat learned procedures with minimal deviation&#8202;&#8212;&#8202;Choosing the right swing for a specific situation and executing it precisely. Tennis, however, is more <strong>wicked</strong>. Due to the game's speed and being real-time rather than turn-based, players must spontaneously anticipate their opponent's moves.</p><blockquote><p>In wicked domains, the rules of the game are often unclear or incomplete, there may or may not be repetitive patterns and they may not be obvious, and feedback is often delayed, inaccurate, or both.</p></blockquote><p><strong>The world of technology is a wicked learning environment.</strong> It moves rapidly with no shortage of <a href="https://en.wikipedia.org/wiki/Disruptive_innovation">disruptive innovations</a>; those who do not keep up the pace risk being left behind.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BCHU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BCHU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BCHU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BCHU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BCHU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BCHU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!BCHU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BCHU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BCHU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BCHU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578872d-0570-4edc-9b81-c8888c5422d1_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Connecting the&nbsp;dots</h3><p>As a society, we are becoming increasingly reliant on knowledge workers (such as IT professionals) who can operate in wicked environments.</p><p>However, I still feel there is a cultural bias in favor of narrow specialization. <a href="https://en.wikipedia.org/wiki/Scientific_management">Maybe it's an industrial way of thinking that carried over into our post-industrial society</a>. You've probably heard the saying: <em>"jack of all trades, master of none."</em> In my experience, this saying does not ring true. A more accurate (and boring) reinterpretation might be: <em>"jack of some trades, master of some."</em></p><p>The fact is that most generalists in tech stay within specific domains, focusing their energy on a few topics at a time while dabbling in related areas. More often than not, these experiences overlap to some extent. You can combine them to achieve great results, especially in areas where innovation and complex problem solving are required.</p><p>I dislike the "generalist" label for technologists because the way it's used is usually inaccurate. What we're talking about are <a href="https://www.devopsinstitute.com/from-i-shaped-to-t-shaped-why-devops-professionals-need-to-be-multi-skilled/">"multi-skilled" profiles</a> or <a href="https://en.wikipedia.org/wiki/Polymath">polymaths</a> who have cultivated a broad general knowledge in addition to deep expertise on one or more subjects.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PUZL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PUZL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PUZL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PUZL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PUZL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PUZL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!PUZL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PUZL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PUZL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PUZL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3033dafc-7f5a-4974-af69-6116b6ff4cfc_800x285.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Illustration borrowed from the <a href="https://www.devopsinstitute.com/from-i-shaped-to-t-shaped-why-devops-professionals-need-to-be-multi-skilled/">DevOps Institute</a></figcaption></figure></div><h3>Polymath superstars</h3><p><a href="https://www.gatesnotes.com/Books/Range">In his 2020 review of Range</a>, <strong>Bill Gates</strong> recognizes his path to success in Epstein's findings. This came as a surprise to me, as I had always thought of Bill as this kid who got obsessed with computers early and created Microsoft.</p><blockquote><p>My own career fits the generalist model pretty well. As a kid, I used to sneak out of my basement bedroom to do late-night coding at the University of Washington, but my passion for computers was always mixed with many other interests. I spent a lot of time reading books on a wide range of topics.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KjTs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KjTs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KjTs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KjTs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KjTs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KjTs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!KjTs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KjTs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KjTs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KjTs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10643f7c-a6f0-4836-b5d3-aa9e2c1aa73f_800x450.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>On the topic of generalists in tech, we must not fail to mention <strong>Elon Musk</strong>. He is one of the most visible and influential personalities in tech today. <a href="https://www.inc.com/marcel-schwantes/elon-musk-how-to-become-an-expert-in-any-field.html">Cited as an "expert generalist</a>," Elon has navigated many domains such as fintech, public transportation, solar energy, electric cars, and space exploration.</p><blockquote><p>It is important to view knowledge as sort of a semantic tree&#8202;&#8212;&#8202;make sure you understand the fundamental principles, i.e., the trunk and big branches, before you get into the leaves/details or there is nothing for them to hang on to.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!22CV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!22CV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 424w, https://substackcdn.com/image/fetch/$s_!22CV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 848w, https://substackcdn.com/image/fetch/$s_!22CV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!22CV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!22CV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!22CV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 424w, https://substackcdn.com/image/fetch/$s_!22CV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 848w, https://substackcdn.com/image/fetch/$s_!22CV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!22CV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda422cc7-c41c-4435-9ea0-da242be23fe4_800x450.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Complex problem&nbsp;solvers</h3><p>Throughout the history of computers, generalists have made exceptional contributions to the field. Consider <strong>John Von Neumann</strong>,<strong> </strong>who is<strong> </strong>often cited as the "father of the modern computer." A mathematician by trade, <a href="https://en.wikipedia.org/wiki/John_von_Neumann">John pioneered new ideas in mathematics, physics, economics, computing, and statistics</a>. Notably, he invented one of the <a href="https://en.wikipedia.org/wiki/Von_Neumann_architecture">world's most popular computer architectures</a>, laying the foundation for many innovations to come.</p><blockquote><p>If people do not believe that mathematics is simple, it is only because they do not realize how complicated life is.</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SLBG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SLBG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SLBG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SLBG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SLBG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SLBG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!SLBG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SLBG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SLBG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SLBG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a7f49a9-774b-4f0f-9843-425976f51e4e_744x389.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Another example comes from the origin of the <a href="https://en.wikipedia.org/wiki/Artificial_neural_network">artificial neural network</a> (ANN), one of my favorite topics in machine learning. <strong>Warren Sturgis McCulloch</strong> and <strong>Walter Pitts</strong> initially conceived the ANN.</p><p><a href="https://en.wikipedia.org/wiki/Warren_Sturgis_McCulloch">Warren was a student of philosophy and psychology.</a> He went on to become a professor of psychiatry and contributor to the <a href="https://en.wikipedia.org/wiki/Cybernetics">cybernetics</a> movement. In his spare time, he wrote poetry and engineered buildings for his farm. Walter was a self-taught logician who would later dive into <a href="https://en.wikipedia.org/wiki/Walter_Pitts">physics, electrical engineering, and computer science</a>.</p><p>Together, they sowed the seeds for a paradigm shift in artificial intelligence, connectivism, and computational neuroscience fueled by the neural network.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-6mM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-6mM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 424w, https://substackcdn.com/image/fetch/$s_!-6mM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 848w, https://substackcdn.com/image/fetch/$s_!-6mM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 1272w, https://substackcdn.com/image/fetch/$s_!-6mM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-6mM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!-6mM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 424w, https://substackcdn.com/image/fetch/$s_!-6mM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 848w, https://substackcdn.com/image/fetch/$s_!-6mM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 1272w, https://substackcdn.com/image/fetch/$s_!-6mM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081478ad-ae23-4c30-a60c-dba62a911ca9_800x476.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>It's good to have a&nbsp;hobby</h3><p>In "Range", Epstein presents an exciting finding: <a href="https://www.psychologytoday.com/files/attachments/1035/arts-foster-scientific-success.pdf">Nobel Prize winners are significantly more likely than their peers to have an aesthetic hobby</a> like acting, dancing, music, and photography. For honored scientists, the finding persists: They also cultivate more hobbies than the general population.</p><p>Let's qualify this finding with some current names in technology:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z0l_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z0l_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Z0l_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Z0l_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Z0l_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z0l_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!Z0l_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Z0l_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Z0l_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Z0l_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6eced504-f8fd-4b03-9894-33077862262f_300x300.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h4><strong>Mark Russinovich</strong></h4><p>At the moment and since 2014, he's been the <a href="https://youtu.be/69PrhWQorEM">CTO at Azure</a>.</p><p>What you might not know about Mark is that, in addition to being a software engineer and technology leader, <a href="https://trojanhorsethebook.com/wordpress/books/">he's written multiple science fiction books</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!twAW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!twAW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!twAW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!twAW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!twAW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!twAW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!twAW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!twAW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!twAW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!twAW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b198586-a7ed-4769-95cc-c20313bff5ba_300x300.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h4><strong>Andy Hunt</strong></h4><p>Co-founder of the <a href="https://www.agilealliance.org/agile101/the-agile-manifesto/">Agile Manifesto</a> and co-author of <a href="https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X">The Pragmatic Programmer</a>. When he's not writing books on software development, Andy is <a href="https://soundcloud.com/strange-special-air">playing various horns</a>, <a href="https://psyaknob.bandcamp.com/album/wormhole-waiting-room">producing electronica</a>, <a href="https://conglommora.com/">writing fiction</a>, or doing woodworking.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YCH2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YCH2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YCH2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YCH2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YCH2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YCH2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!YCH2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YCH2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YCH2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YCH2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe70f7ce-7eba-41ad-b5d2-8063f5b64d85_300x300.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h4>Rachel Andrew</h4><p><a href="https://www.linkedin.com/in/rachelandrew/">Staff technical writer at Google</a>, member of the <a href="https://en.wikipedia.org/wiki/CSS_Working_Group">CSS Working Group</a>, and <a href="https://rachelandrew.co.uk/books">author of 22 books</a> on web development. Rachel used to be a trained dancer <a href="https://www.awwwards.com/interview-with-rachel-andrew-a-woman-s-vision-of-the-web.html">working in West End theatre</a>. Now, she enjoys <a href="https://rachelandrew.co.uk/about/">religious studies and learning to fly airplanes</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vexo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vexo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vexo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vexo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vexo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vexo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!Vexo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Vexo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Vexo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Vexo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbea57bf4-f4b1-465d-9082-01ce4d215271_300x300.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h4>John Resig</h4><p>Creator of <a href="https://jquery.com/">JQuery</a> and <a href="https://www.linkedin.com/in/jeresig/">chief software architect at Khan Academy</a>. In his spare time, John has combined an interest in art history and computer vision engineering with his programming skills to <a href="https://johnresig.com/research">improve digital humanities study</a>.</p><h3>In conclusion</h3><p>Don't get me wrong: A singular drive is an excellent thing to have under the right circumstances. However, the examples I have highlighted in this article show us that our role models in technology can also be <em>multi-skilled</em>.</p><p><strong>If you are an aspiring polymath, dabbler, or generalist in the world of tech, this article was for you</strong>. I hope to have convinced you that your broad interests should not be neglected in favor of a clean and straightforward career timeline. In fact,<strong> </strong><em><strong>you can use your breadth as a superpower</strong> </em>to navigate complex and uncertain environments with ease as long as you manage to connect the dots and combine your knowledge.</p><p>As a software engineer with a broad set of interests, I&#8217;ve found Epstein&#8217;s ideas empowering and energizing. I hope you will too.</p><p>Who are some of your favorite generalists in software and tech?</p>]]></content:encoded></item><item><title><![CDATA[How Adopting an Upgrader’s Mindset Made Me a Better Developer Today]]></title><description><![CDATA[To keep improving your software, nurture a positive and productive thinking]]></description><link>https://blog.42futures.com/p/how-adopting-an-upgraders-mindset-made-me-a-better-developer-today-d0db3790d008</link><guid isPermaLink="false">https://blog.42futures.com/p/how-adopting-an-upgraders-mindset-made-me-a-better-developer-today-d0db3790d008</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Fri, 17 Sep 2021 18:07:33 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5243b468-8b5e-415c-a13c-18fad1affd6f_800x534.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>To keep improving your software, nurture a positive and productive thinking</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9z82!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9z82!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9z82!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9z82!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9z82!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9z82!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!9z82!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9z82!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9z82!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9z82!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda57de42-929e-4d22-858b-90d3d6546e99_800x534.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@guitarist321?utm_source=medium&amp;utm_medium=referral">Chris Ainsworth</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>My work as a data engineer at <a href="https://www.kanda.dk/">Kanda</a> has shifted from being focused on projects to products as we scale up our platforms. This has caused me to reflect on my early days of coding, and my experience getting familiar with the products I have worked on in different organizations.</p><p>To be honest, I&#8217;ve wasted too much energy feeling frustrated. It would bother me when I had to work on a system where I didn&#8217;t agree with the design or when I inherited code that didn&#8217;t have great docs. Just a few examples.</p><p>It took me a while to accept that software development is always a work-in-progress.</p><p>Despite everyone&#8217;s best intentions, it won&#8217;t ever be perfect. In that way, code is like art (except you keep refining it even after it's released). Because of this, I now try to approach software engineering with an &#8220;upgrader mindset&#8221;&#8202;&#8212;&#8202;Focusing my energy on improving what&#8217;s there and figuring out what&#8217;s next.</p><h3>There&#8217;s Always Scope To&nbsp;Improve</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m81R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m81R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 424w, https://substackcdn.com/image/fetch/$s_!m81R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 848w, https://substackcdn.com/image/fetch/$s_!m81R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!m81R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m81R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!m81R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 424w, https://substackcdn.com/image/fetch/$s_!m81R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 848w, https://substackcdn.com/image/fetch/$s_!m81R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!m81R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0532be3e-3a1a-4ddb-92bc-6460ec32c528_800x450.jpeg 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@dianamia?utm_source=medium&amp;utm_medium=referral">C Dustin</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>You&#8217;re excited.</p><p>It&#8217;s your first commercial software project, and you&#8217;re ready to work on a clean, well-architected codebase for a big project. Hitting it big time! You quickly realize that the codebase is not perfect. There might be documentation missing or you might find some questionable designs and awkward workarounds. <em>&#8220;What would <a href="http://cleancoder.com">Uncle Bob</a> say?&#8221;</em>, you wonder.</p><p>It works, but&#8230;</p><p>If you voice the issues you&#8217;ve found, your senior colleagues will likely agree with you. The product works, but there are definitely a few kinks in the codebase that they&#8217;d like to iron out. Also, there are some manual processes that they&#8217;d love to automate. Also, that system component could really use a rewrite. Ah right, and they forgot to tell you about this helpful tool that you&#8217;ll need for debugging.</p><p>This is normal.</p><p>We&#8217;ll explore why that is. But realizing that production software can always be improved will start you off on the right foot. Reality is messy, so expect to find a bit of mess. This is where <a href="https://www.redhat.com/en/topics/devops/what-is-ci-cd">CI/CD practices</a> come in handy, enabling the team to accelerate the delivery of those crucial improvements to the customer.</p><h3>Sometimes Decisions Get Made With Incomplete Knowledge</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h8iV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h8iV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h8iV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h8iV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h8iV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h8iV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!h8iV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h8iV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h8iV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h8iV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18e6d1e2-ba6e-408a-9ea2-81b57a84885c_800x488.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@rosiefoto13?utm_source=medium&amp;utm_medium=referral">Rosie Steggles</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>Nobody wants to make a bad decision. I like to think that, as a team, we want to always do our best work and make great decisions. Here&#8217;s the thing: When we make a software decision, we need to balance many factors. Accounting for uncertainty is just one of those factors.</p><p>Optimal technical decisions always seem more clear in hindsight. However, in the moment when a decision is made, the future is unknowable. We can lean into that uncertainty by favoring dynamic, extendable designs. On the other hand, if we put too much focus on uncertainty, we won&#8217;t get our stuff done on time. Worse yet, we might waste months building something very dynamic that doesn&#8217;t solve our customer&#8217;s most pressing problems.</p><p>Software teams balance many factors when making a decision, such as:</p><ul><li><p>What&#8217;s our budget?</p></li><li><p>How fast does this need to be delivered?</p></li><li><p>Are other teams affected by this decision?</p></li><li><p>How likely is it that the requirements for this will change in the future?</p></li><li><p>Are there any limitations in our dependencies that could impact this?</p></li></ul><p>For these reasons, I try to avoid questioning the intent behind a software decision. Always assume the best intentions and try to focus on the content of the decision and how it could be tweaked to work for the new circumstances.</p><h3>Adopting An Upgrader&nbsp;Mindset</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YOrz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YOrz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YOrz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YOrz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YOrz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YOrz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!YOrz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YOrz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YOrz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YOrz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03ff67d9-10ce-4067-a8ac-386339a6f041_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@imattsmart?utm_source=medium&amp;utm_medium=referral">iMattSmart</a> on&nbsp;<a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure></div><p>Accepting that a decision made sense at the time, does that mean we should just leave it alone if it&#8217;s not a critical issue right now?</p><p>No, of course not! A &#8220;leave-it-be&#8221; attitude is going to pile up technical debt which can ultimately sink your software project.</p><p>Let&#8217;s try an upgrader mindset instead.</p><p>Start on the assumption that we all want to create a great product. If you find a problem, the team has an upgrade opportunity (and that&#8217;s great).</p><p>Identifying a problem isn&#8217;t enough. To make an impact as an upgrader, you need to find a path to improve the situation. Sometimes you can just go ahead and fix it yourself. You know, <a href="https://deviq.com/principles/boy-scout-rule">leave the campsite cleaner than you found it</a>. Larger problems aren&#8217;t usually solved with quick fixes, so in those situations, you&#8217;ll probably need some teammates to put their heads together.</p><p>When you are working on a software product as a new developer and you encounter something questionable, here are five points to consider:</p><ul><li><p>Be respectful. Assume that the person who worked on this before made the best decision they could, given the circumstances.</p></li><li><p>Don&#8217;t hesitate to (politely) ask: &#8220;Is this intentional?&#8221;.<em> </em>Your teammates might be able to provide additional context.</p></li><li><p>If you understand the context and feel that the problem is fixable, go ahead and fix it.</p></li><li><p>If the problem is larger or structural in nature, raise it to the team. Think of a solution ahead of time, but be open-minded to ideas from the team.</p></li><li><p>Don&#8217;t feel bad if the team isn&#8217;t ready to fix a large issue right away. Some improvements are not time-critical and prioritizations must be made.</p></li></ul><p>Sometimes you need to champion an improvement for a while. A respectful tone goes a long way to get the technical team on board. For example:</p><p><em>&#8220;I had an issue implementing Feature X in System Y. I got some context from Person Z and I think we can avoid this issue in the future by reworking System Y. Here&#8217;s an idea for how we could do it, but what do you think?&#8221;</em></p><p>If management needs convincing, keep it short and focus on the impact to budgets and time spent by the team. For example:</p><p><em>&#8220;Every week, our team is losing 5 hours while working on Feature X because of a technical issue. The team agrees that, by reworking System Y, we can save that time going forward. We estimate it will take 20 hours to do. Can we plan this in?&#8221;</em></p><h3>Conclusion</h3><p>I believe that an upgrader mindset is a highly productive way of approaching old code, and it&#8217;ll make you feel less frustrated too. I may not always succeed at being this kind of coder, but it&#8217;s the kind of coder I strive to be. After all, there&#8217;s always something to improve.</p><p>So, let&#8217;s get to work.</p>]]></content:encoded></item><item><title><![CDATA[7 Tips for Dealing With Small Data]]></title><description><![CDATA[Because more often than not, that&#8217;s what you&#8217;re gonna get.]]></description><link>https://blog.42futures.com/p/7-tips-for-dealing-with-small-data-7ffbd3d399a3</link><guid isPermaLink="false">https://blog.42futures.com/p/7-tips-for-dealing-with-small-data-7ffbd3d399a3</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Tue, 25 Jun 2019 23:07:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bd3841a8-d1d6-4c94-9d58-30737757005a_800x534.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>Because more often than not, that&#8217;s what you&#8217;re gonna&nbsp;get.</h4><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XD9M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XD9M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XD9M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XD9M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XD9M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XD9M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!XD9M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XD9M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XD9M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XD9M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27200806-78ca-49d1-bbf5-86135638fa84_800x534.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>We often hear that <em><strong>Big Data</strong></em> is the key to building successful machine learning projects.</p><blockquote><p><strong>This is a major problem:</strong> Many organizations won&#8217;t have the data you need.</p></blockquote><p>How can we prototype and validate machine learning ideas without the most essential raw material? How can we efficiently obtain and create value with data when resources are sparse?</p><p>At my workplace, we produce a lot of functional prototypes for our clients. Because of this, I often need to make <em><strong>Small Data</strong></em> go a long way. In this article, I&#8217;ll share 7 tips to improve your results when prototyping with small datasets.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ItP5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ItP5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ItP5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ItP5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ItP5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ItP5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!ItP5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ItP5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ItP5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ItP5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87316c56-00af-4e46-adaf-aba74f918f88_800x533.jpeg 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><h3>1: Realize that your model won&#8217;t generalize that&nbsp;well.</h3><p>This should be the first order of business. You&#8217;re building a model whose knowledge is based on a <strong>tiny fraction of the universe</strong>, and that should be the only place or situation where it can be expected to work well.</p><p>If you&#8217;re building a computer vision prototype based on a selection of indoor photos, don&#8217;t expect it to work well outdoors. If you have a language model based on chatroom banter, don&#8217;t expect it to work for a fantasy novel.</p><p><strong>Make sure this is understood by your manager or your client. </strong>This way, everyone can align on a realistic expectation of the results that your model should deliver. It also creates an opportunity to come up with useful new KPIs to quantify model performance both inside and outside the prototype scope.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kAxh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kAxh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kAxh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kAxh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kAxh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kAxh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!kAxh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kAxh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kAxh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kAxh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4f670fa-9a3b-418b-bd8c-203776475730_800x532.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>2: Build good data infrastructure.</h3><p>In many situations, the client won&#8217;t have the data you need, and public data won&#8217;t be an option. If part of your prototype requires collecting and labeling new data, make sure that your infrastructure to do this creates as little friction as possible.</p><p>You&#8217;ll want to <strong>make sure data labeling is very easy </strong>so it&#8217;s approachable for non-techies as well. We have started using <em><strong><a href="https://prodi.gy/">Prodigy</a></strong></em>, which I think is a good tool: Both accessible and extendable. Depending on the size of the project, you might also want to <strong>set up an automated data ingest</strong> which can take in new data and automatically feed it to the labeling system.</p><blockquote><p>If getting new data into your system is quick and easy, <strong>you will get more data.</strong></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!51Vt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!51Vt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!51Vt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!51Vt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!51Vt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!51Vt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!51Vt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!51Vt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!51Vt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!51Vt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4e998fb-7d10-422a-875f-087d5140f9e6_800x534.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>3: Do some data augmentation.</h3><p>You can often extend your dataset by augmenting the data that you have. It&#8217;s about making slight changes to the data that should not significantly change the model output. For example, an image of a cat is still an image of a cat if it&#8217;s rotated 40 degrees.</p><p>In most cases, <strong>augmentation techniques allow you to produce many more &#8220;semi-unique&#8221; data points for training your model</strong>. You could, as a start, try adding small amounts of Gaussian noise to your data.</p><p>For computer vision, there are lots of neat ways to augment your images. I have had positive experiences with the <em><strong><a href="https://github.com/albu/albumentations">Albumentations</a></strong></em> library which does many useful image transformations while keeping your labels unharmed.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q3wF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q3wF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Q3wF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Q3wF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Q3wF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q3wF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!Q3wF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Q3wF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Q3wF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Q3wF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50996e09-4e54-4327-992c-97590ebb8691_691x529.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://github.com/albu/albumentations">Albumentations on&nbsp;Github</a></figcaption></figure></div><p>Another augmentation technique that many have found useful is <em><strong><a href="https://github.com/yu4u/mixup-generator">Mixup</a>. </strong></em>This technique literally takes two input images, mixes them together and combines their labels.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KxKr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KxKr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 424w, https://substackcdn.com/image/fetch/$s_!KxKr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 848w, https://substackcdn.com/image/fetch/$s_!KxKr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 1272w, https://substackcdn.com/image/fetch/$s_!KxKr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KxKr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!KxKr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 424w, https://substackcdn.com/image/fetch/$s_!KxKr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 848w, https://substackcdn.com/image/fetch/$s_!KxKr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 1272w, https://substackcdn.com/image/fetch/$s_!KxKr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65d37ae8-6abb-4eb1-b3a5-d27f6665d7fb_659x237.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://www.groundai.com/project/improved-mixed-example-data-augmentation/1">Cecilia Summers &amp; Michael J.&nbsp;Dinneen</a></figcaption></figure></div><p>When augmenting other input data types, some consideration needs to be given to which transformations would change a label and which wouldn&#8217;t.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hbnl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hbnl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hbnl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hbnl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hbnl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hbnl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!hbnl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hbnl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hbnl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hbnl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c3a1d7f-c6ad-47c7-add8-4cbcc60d3673_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>4: Generate some synthetic data.</h3><p>If you have exhausted your options for augmenting real data, you could start thinking about creating some fake data. Generating synthetic data can also be a great way to cover some edge cases that your real dataset does not.</p><p>An an example, many reinforcement learning systems for robotics (like OpenAI&#8217;s <em><strong><a href="https://openai.com/blog/learning-dexterity/">Dactyl</a></strong></em>) are trained in simulated 3D environments before they are deployed to real robots. For image recognition systems, you can similarly build 3D scenes that could provide you with thousands of new data points.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sXu0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sXu0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 424w, https://substackcdn.com/image/fetch/$s_!sXu0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 848w, https://substackcdn.com/image/fetch/$s_!sXu0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 1272w, https://substackcdn.com/image/fetch/$s_!sXu0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sXu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49a186ab-057e-4da2-a999-e845ed489192_730x489.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!sXu0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 424w, https://substackcdn.com/image/fetch/$s_!sXu0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 848w, https://substackcdn.com/image/fetch/$s_!sXu0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 1272w, https://substackcdn.com/image/fetch/$s_!sXu0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a186ab-057e-4da2-a999-e845ed489192_730x489.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">15 simulated instances of <strong><a href="https://openai.com/blog/learning-dexterity/">Dactyl</a> </strong>training in parallel.</figcaption></figure></div><p>There are many approaches to creating synthetic data. At <a href="https://www.kanda.dk/">Kanda</a>, we are developing a turntable-based solution to create data for object detection. If you have a very high data requirement, you could consider <a href="https://towardsdatascience.com/graduating-in-gans-going-from-understanding-generative-adversarial-networks-to-running-your-own-39804c283399">using </a><em><strong><a href="https://towardsdatascience.com/graduating-in-gans-going-from-understanding-generative-adversarial-networks-to-running-your-own-39804c283399">Generative Adverserial Networks</a></strong></em><a href="https://towardsdatascience.com/graduating-in-gans-going-from-understanding-generative-adversarial-networks-to-running-your-own-39804c283399"> to create synthetic data</a>. Be aware that <em><strong>GANs </strong></em>are notorious for being hard to train, so make sure that it&#8217;ll be worth it first.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x9sy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x9sy!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 424w, https://substackcdn.com/image/fetch/$s_!x9sy!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 848w, https://substackcdn.com/image/fetch/$s_!x9sy!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 1272w, https://substackcdn.com/image/fetch/$s_!x9sy!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x9sy!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!x9sy!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 424w, https://substackcdn.com/image/fetch/$s_!x9sy!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 848w, https://substackcdn.com/image/fetch/$s_!x9sy!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 1272w, https://substackcdn.com/image/fetch/$s_!x9sy!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F665688a7-949d-4b22-b93a-8cd0ac398786_800x468.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">NVIDIAs <strong><a href="https://blogs.nvidia.com/blog/2019/03/18/gaugan-photorealistic-landscapes-nvidia-research/">GauGAN</a> </strong>in&nbsp;action!</figcaption></figure></div><p>Sometimes you can combine approaches: Apple had a very clever way of <strong><a href="https://machinelearning.apple.com/2017/07/07/GAN.html">using a GAN to process images of 3D modeled faces to look more photo-realistic</a></strong>. Awesome technique to extend your dataset, if you have the time.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k-Lz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k-Lz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!k-Lz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!k-Lz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!k-Lz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k-Lz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3980b142-988a-4862-b182-38e05492850a_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!k-Lz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!k-Lz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!k-Lz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!k-Lz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3980b142-988a-4862-b182-38e05492850a_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>5. Beware of lucky&nbsp;splits.</h3><p>When training machine learning models, it is quite common to randomly <a href="https://towardsdatascience.com/why-and-how-to-cross-validate-a-model-d6424b45261f">split the dataset into </a><strong><a href="https://towardsdatascience.com/why-and-how-to-cross-validate-a-model-d6424b45261f">train and test sets</a> </strong>according to some ratio. Usually, this is fine. But when working with small datasets, there is a high risk of noise due to the low volume of training examples.</p><p>In this case, <strong>you may accidentally get a lucky split</strong>: A particular dataset split where your model will perform and generalize really well to the test set. In reality though, this might just be because the test set (by coincidence) contained no difficult examples.</p><p>In this scenario, <em><strong><a href="https://machinelearningmastery.com/k-fold-cross-validation/">k-fold Cross-Validation</a></strong></em> is a better choice. Essentially, you split the dataset into <em><strong>k</strong></em> &#8220;folds&#8221; and train a new model for each <em><strong>k</strong></em> where one fold is used for the test set and the rest is used for training. This controls that the test performance you see is not simply due to a lucky (or unlucky) split.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!apJC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!apJC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!apJC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!apJC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!apJC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!apJC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!apJC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!apJC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!apJC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!apJC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8cde11-c068-4ff3-a17c-28d4106d6e6f_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>6. Use transfer learning.</h3><p>If you&#8217;re working with a somewhat standardized data format like text, images, video or sound, you can leverage all the previous work others have put into these domains with transfer learning. It&#8217;s like standing on the shoulders of giants.</p><p>When you do transfer learning, you take models that others have built (usually, <em>&#8220;others&#8221;</em> being Google, Facebook or a major university) and <strong><a href="https://towardsdatascience.com/a-comprehensive-hands-on-guide-to-transfer-learning-with-real-world-applications-in-deep-learning-212bf3b2f27a">fine-tune them to suit your particular needs</a></strong>.</p><p>Transfer learning works because most tasks to do with language, images or sound share many common characteristics. For computer vision, it could be detecting certain types of shapes, colors or patterns, for example.</p><p>Recently, I worked on an object detection prototype for a client with a high accuracy requirement. I was able to speed up development enormously by fine-tuning a <em><strong><a href="https://towardsdatascience.com/review-mobilenetv1-depthwise-separable-convolution-light-weight-model-a382df364b69">MobileNet</a> </strong></em><strong><a href="https://towardsdatascience.com/review-ssd-single-shot-detector-object-detection-851a94607d11">Single Shot Detector</a> </strong>which had been trained on Google&#8217;s <em><strong><a href="https://opensource.google.com/projects/open-images-dataset">Open Images v4</a></strong></em> dataset (~9 million labeled images!). After a day of training, I was able to produce a fairly robust object detection model with a <strong>test mAP of 0.85 using ~1500 labeled images</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tNt6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tNt6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tNt6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tNt6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tNt6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tNt6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!tNt6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tNt6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tNt6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tNt6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd69efcc4-4a9e-4e24-a903-be22807d18c1_800x534.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>7. Try an ensemble of &#8220;weak learners&#8221;.</h3><p>Sometimes, you just have to face the fact that you do not have enough data to do anything fancy. Luckily, there are many traditional machine learning algorithms you can fall back to which are less sensitive to the size of your dataset.</p><blockquote><p>Algorithms like the <strong><a href="https://towardsdatascience.com/support-vector-machines-svm-c9ef22815589">Support Vector Machine</a></strong> are a good choice when the dataset is small and the dimensionality of the data points is high.</p></blockquote><p>Unfortunately, these algorithms are not always as accurate as state-of-the-art methods. This is why they can be called &#8220;weak learners&#8221;, at least in comparison to highly parameterized neural networks.</p><p>One way to improve the performance is to combine several of these &#8220;weak learners&#8221; (this could be an array of <a href="https://towardsdatascience.com/support-vector-machines-svm-c9ef22815589">Support Vector Machines</a> or <a href="https://towardsdatascience.com/decision-trees-in-machine-learning-641b9c4e8052">Decision Trees</a>) so that they &#8220;work together&#8221; to produce a prediction. <strong><a href="https://becominghuman.ai/ensemble-learning-bagging-and-boosting-d20f38be9b1e">This is what Ensemble Learning is all about.</a></strong></p>]]></content:encoded></item><item><title><![CDATA[Is your algorithm confident enough?]]></title><description><![CDATA[How to measure uncertainty in neural networks.]]></description><link>https://blog.42futures.com/p/is-your-algorithm-confident-enough-1b20dfe2db08</link><guid isPermaLink="false">https://blog.42futures.com/p/is-your-algorithm-confident-enough-1b20dfe2db08</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Sun, 07 Apr 2019 14:12:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a2187a5d-0039-41ed-adda-b0f30e743e97_800x533.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4>How to measure uncertainty in neural networks.</h4><p>When machine learning techniques are used in &#8220;mission critical&#8221; applications, the acceptable margin of error becomes significantly lower.</p><p>Imagine that your model is driving a car, assisting a doctor or even just interacting directly with an (perhaps easily annoyed) end user. In these cases, you&#8217;ll want to ensure that you can be confident in the predictions your model makes before acting on them.</p><blockquote><p>Measuring prediction uncertainty grows more important by the day, as fuzzy systems become an increasing part of our fuzzy lives.</p></blockquote><p>Here&#8217;s the good news: There are several techniques for measuring uncertainty in neural networks and some of them are very easy to implement! First, let&#8217;s get a feel for what we&#8217;re about to measure.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AlTq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AlTq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AlTq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AlTq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AlTq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AlTq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!AlTq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AlTq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AlTq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AlTq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed94f39a-e3fb-4848-848d-9943edaafd18_800x533.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://unsplash.com/@earbiscuits?utm_source=medium&amp;utm_medium=referral">Juan Rumimpunu</a>.</figcaption></figure></div><h3>Putting a number on uncertainty.</h3><p>When you make models of the world, your models cannot always provide accurate answers.</p><p>This is partly due to that fact that models are simplifications of a seriously complicated world. Since some information is unknown, the predictions from your model are subject to some degree of uncertainty.</p><p>Parts of our world (and the ways we measure it) are simply chaotic. Some things happen randomly, and this randomness is also a source of uncertainty in your model&#8217;s predictions.</p><p><a href="https://eng.uber.com/neural-networks-uncertainty-estimation/">Prediction uncertainty can be divided into 3 categories</a>:</p><h4><strong>1. Model uncertainty.</strong></h4><p>Model uncertainty comes from &#8220;ignorance&#8221; of the problem. That is, model uncertainty quantifies the <a href="https://en.wikipedia.org/wiki/Uncertainty_quantification">things that </a><em><a href="https://en.wikipedia.org/wiki/Uncertainty_quantification">could</a></em><a href="https://en.wikipedia.org/wiki/Uncertainty_quantification"> be correctly captured by the model but isn&#8217;t</a>.</p><p><a href="https://engineering.taboola.com/using-uncertainty-interpret-model/">Yoel and Inbar from Taboola provide a fun example:</a></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XlLN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XlLN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XlLN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XlLN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XlLN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XlLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!XlLN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XlLN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XlLN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XlLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc8be1e1-7c74-4de9-b8b9-cdda8251d65a_800x267.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">You want to build a model that gets a picture of an animal, and predicts if that animal will try to eat you. You trained the model on pictures of lions and giraffes. Now you show it a zombie. Since the model wasn&#8217;t trained on pictures of zombies, the uncertainty will be high. If trained on enough pictures of zombies, this uncertainty will decrease.</figcaption></figure></div><p>Sometimes it is also referred to as <em><strong>epistemic</strong> </em>or <em><strong>structural uncertainty</strong></em>. Measuring model uncertainty is an area of statistics which is <a href="https://stat.duke.edu/research-areas/model-uncertainty">considered to be particularly challenging</a>. One reason for this, is that principled techniques like <em>Bayesian model averaging</em> become very costly as models grow more complex.</p><h4><strong>2. Model misspecification.</strong></h4><p>If your model produces good predictions during training and validation but not during evaluation (or in production), it might be misspecified.</p><p>Model misspecification uncertainty captures scenarios where your model is making predictions on new data with very different patterns from the training data.</p><h4><strong>3. Inherent&nbsp;noise.</strong></h4><p>This is uncertainty produced by noise present in the dataset. It could be attributed to imperfect measurement techniques or an inherent randomness in the thing being measured.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!66T0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!66T0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 424w, https://substackcdn.com/image/fetch/$s_!66T0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 848w, https://substackcdn.com/image/fetch/$s_!66T0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 1272w, https://substackcdn.com/image/fetch/$s_!66T0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!66T0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/647f04b5-2270-409f-b584-7a20e4653742_800x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!66T0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 424w, https://substackcdn.com/image/fetch/$s_!66T0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 848w, https://substackcdn.com/image/fetch/$s_!66T0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 1272w, https://substackcdn.com/image/fetch/$s_!66T0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F647f04b5-2270-409f-b584-7a20e4653742_800x540.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Imagine your dataset contains 2 images of cards facing down. You&#8217;re feeling optimistic and you want to build a model to predict the suit and value of each card. The first card is labeled as ace of spades and the other is labeled as 8 of hearts. Here, the exact same features (an image of a card facing down) can be linked to different predictions (either ace of spades or 8 of hearts). Therefore, this dataset is subject to lots of inherent&nbsp;noise.</figcaption></figure></div><p>Inherent noise is also sometimes called <em><strong>aleatoric</strong></em> or <em><strong>statistical uncertainty</strong></em>. The amount of inherent noise is linked to the <a href="https://en.wikipedia.org/wiki/Bayes_error_rate">Bayes error rate</a> which the lowest achievable error rate of a given classifier. As you can imagine, the lowest possible error rate that a model can achieve is tightly linked to the amount of error produced by noise in the data itself.</p><p>These concepts lean heavily on Bayesian statistics. I have outlined these ideas in a simple way, but that&#8217;s just scratching the surface on these deep topics.</p><p>To learn more about uncertainty measures in Bayesian neural networks, I recommend <a href="https://towardsdatascience.com/what-uncertainties-tell-you-in-bayesian-neural-networks-6fbd5f85648e">taking a look at this article</a> by <a href="https://towardsdatascience.com/@laumannfelix">Felix Laumann</a>. For an in-depth explanation of Bayesian statistics in the context of data science, <a href="https://towardsdatascience.com/@rathi.ankit">Ankit Rathi</a> has written a <a href="https://towardsdatascience.com/bayesian-statistics-for-data-science-45397ec79c94">series of great articles on the subject</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LHOp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LHOp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LHOp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LHOp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LHOp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LHOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!LHOp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!LHOp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!LHOp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!LHOp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2918a1f1-b6a1-4662-be06-993e97f89fa9_800x600.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://unsplash.com/@avirichards?utm_source=medium&amp;utm_medium=referral">Avi&nbsp;Richards</a></figcaption></figure></div><h3>Implementing uncertainty.</h3><p>At this point, you may be thinking: <em>&#8220;That sounds good, but how do I implement uncertainty in my model?&#8221;</em>.</p><p>The <a href="https://github.com/kyle-dorman/bayesian-neural-network-blogpost">Bayesian neural network</a> integrates uncertainty by default in addition to generally being more robust to overfitting and handling smaller datasets. However, the toolchain for building Bayesian neural networks is still emerging and the models tend to be more computationally costly, both during training and when making predictions.</p><p>Also, migrating your work to a probabilistic model (like a Bayesian neural network) is going to be annoying.</p><p>In the long run, probabilistic deep learning will likely become the default. For now though, practical techniques to integrate the probabilistic perspective in our existing work is a good first step!</p><h4>Monte Carlo&nbsp;dropout.</h4><p>A couple of years ago, <a href="https://arxiv.org/abs/1506.02142">Yarin and Zoubin from University of Cambridge found a way</a> to approximate model uncertainty without changing the structure or optimization techniques of the neural network.</p><p>Here&#8217;s the short version: By using dropout before each weight layer at test time and running your predictions for several iterations, you can approximate Bayesian uncertainty. They call this process <strong>Monte Carlo dropout</strong>:</p><ol><li><p>You feed an input to your model.</p></li><li><p>You predict for several iterations on that single input, each time disabling small parts of the neural network randomly.</p></li><li><p>You take the mean output value. <strong>This is your prediction.</strong> Finally, you measure the variance between iterations. <strong>This is the model uncertainty.</strong></p></li></ol><p><strong>Intuitively, I think of it like this:</strong> The more your prediction fluctuates with tiny structural changes to the model, the more uncertain that prediction is.</p><p>Implementing Monte Carlo dropout is really easy. Here, I start with a simple dense network for the <a href="http://yann.lecun.com/exdb/mnist/">MNIST problem</a> built with <a href="https://keras.io/">Keras</a>. By default, dropout layers are only enabled during training. To enable the dropout layers at test time, set <code>training=True</code> for each layer.</p><pre><code>img_dim = 28</code></pre><pre><code>x_in = Input(shape=(img_dim, img_dim,))
x = Dropout(0.2)(x_in, training=True)
x = Dense(500, activation="relu")(x)
x = Dropout(0.2)(x, training=True)
x = Dense(250, activation="relu")(x)
x = Dropout(0.2)(x, training=True)
x_out = Dense(10, activation="softmax")(x)</code></pre><pre><code>model = Model(inputs=x_in, outputs=x_out)
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")</code></pre><p>Next, we need a custom prediction function which can predict iteratively and return the mean and variance of those iterations. In this example, we measure the standard deviation instead of the variance, because it&#8217;s expressed in the same units as the mean.</p><pre><code>def predict_with_uncertainty(model, 
                             X, 
                             batch_size=None, 
                             num_iterations=100):</code></pre><pre><code>    last_layer = model.layers[-1]</code></pre><pre><code>    results = np.zeros((num_iterations,
                       X.shape[0],
                       last_layer.output_shape[1]), 
                       dtype="float")</code></pre><pre><code>    for i in range(num_iterations):
        results[i] = model.predict(X, batch_size=batch_size)
    
    predictions = results.mean(axis=0)
    uncertainty = results.std(axis=0)
    
    return predictions, uncertainty</code></pre><p>Now you&#8217;re ready to predict with approximated uncertainty:</p><pre><code>predictions, uncertainty = predict_with_uncertainty(model,your_data)</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g6lC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g6lC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 424w, https://substackcdn.com/image/fetch/$s_!g6lC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 848w, https://substackcdn.com/image/fetch/$s_!g6lC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!g6lC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g6lC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!g6lC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 424w, https://substackcdn.com/image/fetch/$s_!g6lC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 848w, https://substackcdn.com/image/fetch/$s_!g6lC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!g6lC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb548d538-fe2c-4e4f-b5bb-040681ec30ba_800x535.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://unsplash.com/@punttim?utm_source=medium&amp;utm_medium=referral">Tim&nbsp;Gouw</a></figcaption></figure></div><h3>Problems and critique.</h3><p>As we saw, using Monte Carlo dropout is really easy. Maybe even <em><strong>too easy</strong></em>. <a href="https://www.semanticscholar.org/paper/Risk-versus-Uncertainty-in-Deep-Learning-%3A-Bayes-%2C-Osband/dde4b95be20a160253a6cc9ecd75492a13d60c10">The technique was critiqued by Ian Osband from Deepmind</a> who noted that the predictive uncertainty of a simple model with Monte Carlo dropout did not decrease with more data. This raises the question of whether it is an inaccurate approximation of Bayesian uncertainty or if there are any underlying assumptions that need to be made more clear.</p><p>For more that issue, <a href="http://blog.s-schoener.com/2017-12-20-uncertainty-in-dl/">Sebastian Sch&#246;ner has written a great blog post summarizing the critique</a>.</p><p><strong>In my workplace at <a href="https://www.kanda.dk/">Kanda</a>, we have had mixed experiences with the effectiveness of the Monte Carlo dropout.</strong></p><p>For a simple fully connected model trained on MNIST like my previous example, the uncertainty approximations behaved as expected: When presented with noise instead of a handwritten digit, the approximated uncertainty was higher. We found that 50&#8211;100 iterations of Monte Carlo dropout produced satisfactory results.</p><p>Later, we had a scenario, where we needed to run an image recognition task locally on a smartphone as part of an AR application. We used transfer learning, building a classifier on top of the <a href="https://arxiv.org/pdf/1707.07012.pdf">NASNet Mobile architecture</a>.</p><blockquote><p>Running 100 iterations of NASNet on a smartphone is not a good idea.</p></blockquote><p>Even with heavy parallelization, we were only realistically able to run ~20 iterations on the device in order to provide a prediction in good time.</p><p>Secondly, the uncertainty estimates were inaccurate. When fed a picture of random noise, the uncertainty was surprisingly low. It is worth noting that we only implemented dropout in the densely connected part of the classifier which sat on top of NASNet. <strong>If you&#8217;d like to share intuitions about what went wrong here, I&#8217;d be very interested to read a response from you!</strong></p><h3>Conclusion.</h3><p>First, we had a look at why it&#8217;s important to quantify uncertainty in machine learning models. Then, I introduced you to 3 different ways of thinking about prediction uncertainty: <strong>Model uncertainty, model misspecification and inherent noise.</strong></p><p><strong>Monte Carlo dropout is an easy-to-implement technique to approximate Bayesian uncertainty</strong>, but there is some disagreement to whether the approximation is indeed accurate. Practically, I have found Monte Carlo dropout effective for simpler models, but have had some problems with the approach for complex models, both in terms of accuracy and performance.</p><p>I<strong>ntegrating Bayesian probability in machine learning will only become more important in the future</strong>, and I look forward to seeing more probabilistic techniques become part of the toolchain.</p>]]></content:encoded></item><item><title><![CDATA[Human-Like Machine Hearing With AI (3/3)]]></title><description><![CDATA[Results and perspectives.]]></description><link>https://blog.42futures.com/p/human-like-machine-hearing-with-ai-3-3-fd6238426416</link><guid isPermaLink="false">https://blog.42futures.com/p/human-like-machine-hearing-with-ai-3-3-fd6238426416</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Wed, 27 Feb 2019 11:02:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/427176b9-24a0-4a77-8ba0-680d4712ca4b_800x533.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BfQY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BfQY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BfQY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BfQY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BfQY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BfQY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!BfQY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BfQY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BfQY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BfQY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92a16b9b-b843-4ef3-87c6-0414f48a6c0f_800x533.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://unsplash.com/@maltewingen?utm_source=medium&amp;utm_medium=referral">Malte&nbsp;Wingen</a></figcaption></figure></div><h4>Results and perspectives.</h4><p>This is the last part of my article series on<strong> </strong><em><strong>&#8220;Human-Like&#8221; Machine Hearing</strong></em>: Modeling parts of human hearing to do audio signal processing with AI.</p><h4>This last part of the series will&nbsp;provide:</h4><ul><li><p>A concluding summary of the key ideas.</p></li><li><p>Results from empirical testing.</p></li><li><p>Related work and future perspectives.</p></li></ul><p>If you&#8217;ve missed out on the previous articles, here they are:</p><p><strong>Background</strong>: <a href="https://towardsdatascience.com/the-promise-of-ai-in-audio-processing-a7e4996eb2ca">The promise of AI in audio processing</a><br><strong>Criticism</strong>: <a href="https://towardsdatascience.com/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd">What&#8217;s wrong with CNNs and spectrograms for audio processing?</a><br><strong>Part 1</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-1-3-a5713af6e2f8">Human-Like Machine Hearing With AI (1/3)</a><br><strong>Part 2:</strong> <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-2-3-f9fab903b20a">Human-Like Machine Hearing With AI (2/3)</a></p><h3>Summary.</h3><p>Understanding and processing information at an abstract level is not an easy task. Artificial neural networks have moved mountains in this area. Especially for computer vision: Deep 2D CNNs have been shown to capture a hierarchy of visual features, increasing in complexity with each layer of the network. The convolutional neural network was inspired by the <a href="http://vision.stanford.edu/teaching/cs131_fall1415/lectures/Fukushima1988.pdf">Neocognitron</a> which in turn was inspired by the human visual system.</p><p>Attempts have been made at reapplying techniques such as style transfer in the audio domain, but the results are rarely convincing. Visual methods don&#8217;t seem to reapply well on sounds.</p><p><strong>I have argued that sound is a different beast altogether.</strong> It&#8217;s something to keep in mind when doing feature extraction and designing deep learning architectures. Sounds behave differently. Just like computer vision benefited from modeling the visual system, we can benefit from considering human hearing when working with sound in neural networks.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3JsX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3JsX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3JsX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3JsX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3JsX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3JsX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!3JsX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3JsX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3JsX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3JsX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f59d6f-0d82-403b-b80d-58f583e9e5ca_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://unsplash.com/@trommelkopf?utm_source=medium&amp;utm_medium=referral">Steve&nbsp;Harvey</a></figcaption></figure></div><h4>Sound representation.</h4><p>To start exploring a modeling approach, we can establish a human baseline:</p><p>To the brain, sounds are spectrally represented. Pressure waves are processed by the cochlea and divided into ~3500 logarithmically spaced frequency bands in the range ~20-20,000 Hz.</p><p>Sounds are heard at a temporal resolution of 2&#8211;5 ms. Sounds (or gaps in sounds) shorter than this are something near imperceptible to humans.</p><p>Based on this information, <strong>I recommend using a <a href="https://en.wikipedia.org/wiki/Gammatone_filter">Gammatone filterbank</a></strong> instead of the Fourier Transform. <a href="https://www.sciencedirect.com/science/article/pii/S0165027016302898">Gammatone filterbanks are a common tool in auditory modeling</a> and generally, filterbanks allow for the decoupling of spectral and temporal resolutions. <strong>This way, you can have a many spectral bands and a short window of analysis</strong>.</p><h4>Memory and&nbsp;buffers.</h4><p>Humans are thought to have memory for storing sensory impressions in the short-term so that they can be compared and integrated. Although experimental results differer slightly, they have shown that <strong>humans have ~0.25&#8211;4 seconds of echoic memory </strong>(sensory memory dedicated to sound).</p><blockquote><p><strong>Any sound</strong> <strong>that can be understood by a human being can be represented within these&nbsp;limits!</strong></p></blockquote><p>A couple of seconds worth of 2&#8211;5 ms windows, each with ~3500 logarithmically spaced frequency bands. But that does add up to a lot of data.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bgGq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bgGq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 424w, https://substackcdn.com/image/fetch/$s_!bgGq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 848w, https://substackcdn.com/image/fetch/$s_!bgGq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 1272w, https://substackcdn.com/image/fetch/$s_!bgGq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bgGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!bgGq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 424w, https://substackcdn.com/image/fetch/$s_!bgGq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 848w, https://substackcdn.com/image/fetch/$s_!bgGq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 1272w, https://substackcdn.com/image/fetch/$s_!bgGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6364e89a-a2ce-4a53-9137-3ea2f9c024af_800x155.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Two dilated buffers covering ~1.25s of sound with 8 time&nbsp;steps.</figcaption></figure></div><p>To reduce the dimensionality a bit, I proposed the idea of <em><strong>dilated buffers</strong></em>, where the temporal resolution of a time series is reduced by an increasing factor for older timesteps. This way, a larger time context can be covered.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j9fc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j9fc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j9fc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j9fc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j9fc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j9fc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!j9fc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j9fc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j9fc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j9fc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff34bb03e-68ed-4ef0-9c1d-88ed866b88dc_800x533.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://unsplash.com/@alireza_attari?utm_source=medium&amp;utm_medium=referral">Alireza&nbsp;Attari</a></figcaption></figure></div><h4>Listener-processor architecture.</h4><p>We can <strong>conceptualize the inner ear as a spectral feature extractor and the auditory cortex as an analytical processor</strong>, deriving <em>&#8220;cognitive properties&#8221;</em> from memories of auditory impressions.</p><p>In between, there is a set of steps often forgotten about. <a href="https://en.wikipedia.org/wiki/Cochlear_nucleus">They&#8217;re referred to as the </a><em><a href="https://en.wikipedia.org/wiki/Cochlear_nucleus">cochlear nuclei</a></em>. There&#8217;s a lot we don&#8217;t know about these, but they do a sort of initial neural coding of sounds: Encoding basic features essential to localization and sound identification.</p><p>This led me to explore a <em><strong>listener-processor model</strong></em>, where sound buffers are embedded to a low-dimensional space by a general-purpose <a href="https://machinelearningmastery.com/lstm-autoencoders/">LSTM autoencoder</a> (a <em><strong>&#8220;listener&#8221;</strong></em>) before being passed to a task-specific neural network (a <em><strong>&#8220;processor&#8221;</strong></em>). That essentially makes the autoencoder a reusable preprocessing step for doing some task-specific analytical work on a sound.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xPKK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xPKK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 424w, https://substackcdn.com/image/fetch/$s_!xPKK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 848w, https://substackcdn.com/image/fetch/$s_!xPKK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 1272w, https://substackcdn.com/image/fetch/$s_!xPKK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xPKK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!xPKK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 424w, https://substackcdn.com/image/fetch/$s_!xPKK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 848w, https://substackcdn.com/image/fetch/$s_!xPKK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 1272w, https://substackcdn.com/image/fetch/$s_!xPKK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637c4d04-7413-4dc2-a4f4-3e84fe99d014_800x447.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">A listener-processor architecture to do sound classification.</figcaption></figure></div><h3>Results.</h3><p>I like to think this article series has presented a couple of fresh ideas for working with sound in neural networks. Using these principles, I built a model to do environmental sound classification using the <a href="https://urbansounddataset.weebly.com/urbansound8k.html">UrbanSound8K dataset</a>.</p><p>Due to limited computing resources, I settled for humble representation:</p><ul><li><p><strong>100 Gammatone filters.</strong></p></li><li><p><strong>10 ms analysis windows.</strong></p></li><li><p><strong>8-step dilated buffers covering ~1.25 seconds of sound.</strong></p></li></ul><p>To train the listener, I fed thousands of dilated buffers to an autoencoder with 2 LSTM layers on each side, encoding the 800-dimensional sequential input into a latent space with 250 &#8220;static&#8221; dimensions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pUt-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pUt-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 424w, https://substackcdn.com/image/fetch/$s_!pUt-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 848w, https://substackcdn.com/image/fetch/$s_!pUt-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 1272w, https://substackcdn.com/image/fetch/$s_!pUt-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pUt-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!pUt-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 424w, https://substackcdn.com/image/fetch/$s_!pUt-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 848w, https://substackcdn.com/image/fetch/$s_!pUt-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 1272w, https://substackcdn.com/image/fetch/$s_!pUt-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff9b7786-5925-4feb-a110-8755a3ce4b54_800x417.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An illustration of the LSTM autoencoder architecture.</figcaption></figure></div><p>After training for ~50 epochs, <strong>the autoencoder was able to capture the coarse structures for most of the input buffers</strong>. Being able to produce an embedding that captures the complex sequential movements of frequencies in sounds is very interesting!</p><h4>But is it&nbsp;useful?</h4><p>This is the question to ask. To test this, <strong>I trained a 5-layer self-normalizing neural network to predict the sound class</strong> (UrbanSound8K defines 10 possible classes) using embeddings from the LSTM encoder.</p><blockquote><p>After 50 epochs of training, this network predicted sound class with an accuracy of&nbsp;~70%.</p></blockquote><p>In 2018, <a href="https://arxiv.org/pdf/1808.08405.pdf">Z. Zhang et. al. achieved state of the art on the UrbanSound8K dataset</a> with a 77.4% prediction accuracy. They achieved this by doing 1D convolutions on Gammatone spectrograms. With data augmentation, that accuracy can be pushed higher yet. I did not have resources to explore data augmentation, so I am going to compare on non-augmented versions of the system.</p><p>In comparison, my approach was 7.4% less accurate. However, my technique works on 10 ms time frames (usually with some memory attached), meaning that the 70% accuracy covers <strong>a 10 ms moment at any given time</strong> of a sound in the dataset. <strong>This reduces the latency of the system by a factor of 300, making it well suited for realtime processing</strong>. Put simply, this approach was less accurate but introduced significantly less delay when processing.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O7i2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O7i2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 424w, https://substackcdn.com/image/fetch/$s_!O7i2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 848w, https://substackcdn.com/image/fetch/$s_!O7i2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 1272w, https://substackcdn.com/image/fetch/$s_!O7i2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O7i2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!O7i2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 424w, https://substackcdn.com/image/fetch/$s_!O7i2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 848w, https://substackcdn.com/image/fetch/$s_!O7i2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 1272w, https://substackcdn.com/image/fetch/$s_!O7i2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59de691f-804a-4ac8-818d-3c1d0c4e2643_800x335.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">A &#8220;happy accident&#8221; I encountered during initial experiments.</figcaption></figure></div><h3>Perspectives.</h3><p>Working through this project has been very interesting indeed. I hope to have supplied you with some ideas for how you can work with sound in neural networks. Though I am happy with my initial results, I believe they can be significantly improved given a finer spectral resolution and computational resources for training the neural networks.</p><p>I hope that someone will pick this up and experiment with a <strong>listener-processor</strong> approach on new problems. In particular, I am curious to try a <a href="http://kvfrans.com/variational-autoencoders-explained/">variational autoencoder </a>approach to see what happens to reconstructed sounds when their latent spaces are adjusted&#8202;&#8212;&#8202;Maybe this can reveal some intuitions about what makes the basic statistical features of sound itself.</p><h3>Related work.</h3><p>If you&#8217;re interested in sound representation using autoencoders, here are some projects that have inspired me and that I recommend looking into:</p><h4><a href="https://arxiv.org/abs/1603.00982">Audio Word2Vec</a></h4><p>These folks worked on a similar approach for encoding speech using MFCC&#8217;s and Seq2Seq autoencoders. They found that the phonetic structures of speech can be adequately represented this way.</p><h4><a href="https://research.fb.com/publications/a-universal-music-translation-network/">A Universal Musical Translation Network</a></h4><p>This is very impressive and the closest I&#8217;ve seen to style transfer in sound yet. It came out from Facebook AI Research last year. By using a shared WaveNet encoder, they compressed a number of raw-sample musical sequences to a latent space, then decoded with separate WaveNet decoders for each desired output &#8220;style&#8221;.</p><h4><a href="https://arxiv.org/abs/1810.06603v1">Modeling Non-Linear Audio Effects with Neural&nbsp;Networks</a></h4><p>Marco Martinez and Joshua Reiss successfully modeled non-linear audio effects (like distortion) with neural networks. They achieved this by using 1D convolutions to encode raw-sample sequencies, transform these encodings (!) with a deep neural network, and then resynthesize these encodings back to raw samples with deconvolution.</p><p>Dear reader, thanks so much for coming on this journey with me. I feel privileged by the amount of positive, critical and informative response I&#8217;ve had to this article series.</p><p>Having been swamped with work, this final article has been a long time coming. Now that it&#8217;s wrapped up, I am looking forward to next chapters, new projects and ideas to explore.</p>]]></content:encoded></item><item><title><![CDATA[Human-Like Machine Hearing With AI (2/3)]]></title><description><![CDATA[The importance of memory]]></description><link>https://blog.42futures.com/p/human-like-machine-hearing-with-ai-2-3-f9fab903b20a</link><guid isPermaLink="false">https://blog.42futures.com/p/human-like-machine-hearing-with-ai-2-3-f9fab903b20a</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Sat, 25 Aug 2018 12:35:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/77c76d9f-7078-4937-b471-d700fade48b0_800x468.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JNql!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JNql!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JNql!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JNql!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JNql!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JNql!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!JNql!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JNql!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JNql!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JNql!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f71c49c-5987-4717-b05c-ec16a1354e13_800x468.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo credit:&nbsp;<a href="https://unsplash.com/@rawpixel?utm_source=medium&amp;utm_medium=referral">rawpixel</a></figcaption></figure></div><h4>The importance of&nbsp;memory</h4><p><strong>Hi, and welcome back!</strong> This article series details a framework for real-time audio signal processing with AI which I have worked on in cooperation with <a href="http://www.au.dk/en/">Aarhus University</a> and intelligent loudspeaker manufacturer <a href="https://www.dynaudio.com/">Dynaudio</a>.</p><p>If you&#8217;ve missed out on the previous articles, click below to get up to speed:</p><p><strong>Background</strong>: <a href="https://towardsdatascience.com/the-promise-of-ai-in-audio-processing-a7e4996eb2ca">The promise of AI in audio processing</a><br><strong>Criticism</strong>: <a href="https://towardsdatascience.com/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd">What&#8217;s wrong with CNNs and spectrograms for audio processing?</a><br><strong>Part 1</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-1-3-a5713af6e2f8">Human-Like Machine Hearing With AI (1/3)</a></p><p>In the previous part, we mapped the fundamentals of how humans experience sound as spectral impressions formed in the cochlea which are then &#8220;coded&#8221; by a sequence of brainstem nuclei. This article will explore how we can integrate <em>memory </em>when producing spectral sounds embeddings with an artificial neural network for sound understanding.</p><h4>Echoic memory</h4><blockquote><p>The <em>meaning </em>of a sound event arises, in large part, from the temporal interplay between spectral features.</p></blockquote><p>One demonstration of this can be seen in the fact that the human auditory system encodes identical phonemes of speech in different ways depending on their temporal context [1]. That means that a phoneme <em>/e/</em> can mean different things to us neurologically, depending on what came before it.</p><p>Memory is crucial to performing sound analysis since it is only possible to compare impressions of &#8220;the moment&#8221; to previous impressions if they are actually stored somewhere.</p><p>Human short term memory is made up of an collection of components which integrate both sensory and working memory [2]. In examination of sound perception, <em>auditory sensory memory</em> (sometimes referred to as <em>echoic memory</em>) has been found in humans. C. Alain et. al. describe auditory sensory memory as <em>&#8220;a critical first stage in auditory perception that permits listeners to integrate incoming acoustic information with stored representations of preceding auditory events&#8221;</em> [2].</p><blockquote><p>Computationally, we can think of echoic memory as a short buffer of immediate auditory impressions.</p></blockquote><p>There has been disagreements about the duration of echoic memory. On the basis of pure-tone and spoken-vowel masking studies, D. Massaro has argued for ~250 ms while A. Treisman argued for ~4 seconds based on a dichotic listening experiment [3]. For the purpose of integrating the idea of echoic memory with neural networks, we might not need to settle on a fixed duration of sensory store but we can experiment with memory within a range of a few seconds.</p><h4>Going in&nbsp;circles</h4><p>Implementing sensory memory in digital spectral representations could be quite straightforward. We can simply allocate a <em>circular buffer</em> to store a predetermined number of spectra at previous timesteps.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xD_o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xD_o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 424w, https://substackcdn.com/image/fetch/$s_!xD_o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 848w, https://substackcdn.com/image/fetch/$s_!xD_o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 1272w, https://substackcdn.com/image/fetch/$s_!xD_o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xD_o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!xD_o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 424w, https://substackcdn.com/image/fetch/$s_!xD_o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 848w, https://substackcdn.com/image/fetch/$s_!xD_o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 1272w, https://substackcdn.com/image/fetch/$s_!xD_o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff5200c3a-7d64-479a-8ced-a4cf7fd16c52_750x600.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>An illustrated circular buffer for holding spectral memory (where t denotes the timestep).</em></figcaption></figure></div><blockquote><p>A circular buffer is a data structure consisting of an array which is treated as circular, where its indices loop back to 0 after the array&#8217;s length is reached&nbsp;[4].</p></blockquote><p>In our case, this could be a multidimensional array with the length of the desired amount of memory, each indice of the circular buffer holding a full frequency spectrum for a specific timestep. As new spectra are calculated, they are written to the buffer, overwriting the oldest timesteps if the buffer is already full.</p><p>As the buffer fills, two pointers are updated: A <em>tail pointer</em> marking the newest element added and a <em>head pointer</em> marking the oldest element and, as such, the beginning of the buffer [4].</p><p>Here is an example of a circular buffer in Python adapted from <a href="https://github.com/eric-wieser/numpy_ringbuffer">Eric Wieser</a>:</p><pre><code>import numpy as np</code></pre><pre><code>class CircularBuffer():
    # Initializes NumPy array and head/tail pointers
    def __init__(self, capacity, dtype=float):
        self._buffer = np.zeros(capacity, dtype)
        self._head_index = 0
        self._tail_index = 0
        self._capacity = capacity</code></pre><pre><code>    # Makes sure that head and tail pointers cycle back around
    def fix_indices(self):
        if self._head_index &gt;= self._capacity:
            self._head_index -= self._capacity
            self._tail_index -= self._capacity
        elif self._head_index &lt; 0:
            self._head_index += self._capacity
            self._tail_index += self._capacity</code></pre><pre><code>    # Inserts a new value in buffer, overwriting old value if full
    def insert(self, value):
        if self.is_full():
            self._head_index += 1</code></pre><pre><code>        self._buffer[self._tail_index % self._capacity] = value
        self._tail_index += 1
        self.fix_indices()
        
    # Returns the circular buffer as an array starting at head index
    def unwrap(self):
        return np.concatenate((
            self._buffer[self._head_index:min(self._tail_index, self._capacity)],
            self._buffer[:max(self._tail_index - self._capacity, 0)]
        ))</code></pre><pre><code>    # Indicates whether the buffer has been filled yet
    def is_full(self):
        return self.count() == self._capacity</code></pre><pre><code>    # Returns the amount of values currently in buffer
    def count(self):
        return self._tail_index - self._head_index</code></pre><h4>Reducing input&nbsp;size</h4><p>In order to store a full second of frequency spectra at a resolution of 5 ms per timestep, a buffer with a capacity of 200 elements are needed. Each of these elements would contain an array of frequency magnitudes. If human-like spectral resolution is desired, those arrays would contain 3500 values. For a total of 200 timesteps, that is 700,000 values to be processed.</p><p>If passed to an artificial neural network, an input with a length of 700,000 values runs the risk of being computationally expensive. This risk can be mitigated by reducing the spectral and temporal resolution or keeping a shorter duration of spectral information in memory.</p><p>We can also draw inspiration from the <em>Wavenet </em>architecture, which utilizes <em>dilated causal convolutions </em>in order to optimize analysis of the large amount of sequential data in raw sample audio. As explained by A. Van Den Oord et al.,<em> &#8220;A dilated convolution (also called &#225; trous, or convolution with holes) is a convolution where the filter is applied over an area larger than its length by skipping input values with a certain step&#8221;</em> [5].</p><p>Under the assumption that the most recent incoming frequency data is the largest determining factor in momentary sound analysis, a <em>dilated spectral buffer</em> could be a useful tool for reducing the size of computational memory.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EM03!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EM03!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 424w, https://substackcdn.com/image/fetch/$s_!EM03!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 848w, https://substackcdn.com/image/fetch/$s_!EM03!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 1272w, https://substackcdn.com/image/fetch/$s_!EM03!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EM03!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!EM03!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 424w, https://substackcdn.com/image/fetch/$s_!EM03!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 848w, https://substackcdn.com/image/fetch/$s_!EM03!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 1272w, https://substackcdn.com/image/fetch/$s_!EM03!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab678d39-edfa-423c-bcd5-81d84e8ae509_800x412.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>Two methods for dimensionality reduction with dilated spectral buffers (in this figure unrolled for clarity).</em></figcaption></figure></div><p>By dilating each timestep in a new buffer by some ratio (such as an exponential incrementation of <em>2^t</em>, for example) in proportion to the original buffer, the dimensionality can be drastically reduced while retaining a high resolution of spectral developments at the most recent timesteps. The values of the dilated buffer can either be obtained from the original buffer by simply looking up single values further and further back, but it is also possible to combine the number of timesteps to be collapsed by extracting the average or median spectrum across the duration.</p><blockquote><p>The driving concept behind a dilated spectral buffer is to keep the most recent spectral impressions in memory while also retaining some information about the &#8220;big picture&#8221; context in an efficient way.</p></blockquote><p>Below is a simplified code snippet for making dilated spectral frames using a Gammatone filterbank. Note that this example uses offline processing, but the filterbank can be applied real-time as well, inserting spectral frames to a circular buffer.</p><pre><code>from gammatone import gtgram
import numpy as np

class GammatoneFilterbank:
    # Initialize Gammatone filterbank
    def __init__(self, 
                 sample_rate, 
                 window_time, 
                 hop_time, 
                 num_filters, 
                 cutoff_low):
        self.sample_rate = sample_rate
        self.window_time = window_time
        self.hop_time = hop_time
        self.num_filters = num_filters
        self.cutoff_low = cutoff_low</code></pre><pre><code>    # Make a spectrogram from a number of audio samples
    def make_spectrogram(self, audio_samples):
        return gtgram.gtgram(audio_samples,
                             self.sample_rate,
                             self.window_time,
                             self.hop_time,
                             self.num_filters,
                             self.cutoff_low)</code></pre><pre><code>    # Divide audio samples into dilated spectral buffers
    def make_dilated_spectral_frames(self, 
                                     audio_samples, 
                                     num_frames, 
                                     dilation_factor):</code></pre><pre><code>        spectrogram = self.make_spectrogram(audio_samples)
        spectrogram = np.swapaxes(spectrogram, 0, 1)
        dilated_frames = np.zeros((len(spectrogram), 
                                  num_frames, 
                                  len(spectrogram[0])))

        for i in range(len(spectrogram)):
            for j in range(num_frames):
                dilation = np.power(dilation_factor, j)

                if i - dilation &lt; 0:
                    dilated_frames[i][j] = spectrogram[0]
                else:
                    dilated_frames[i][j] = spectrogram[i - dilation]

        return dilated_frames</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jJbJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jJbJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 424w, https://substackcdn.com/image/fetch/$s_!jJbJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 848w, https://substackcdn.com/image/fetch/$s_!jJbJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 1272w, https://substackcdn.com/image/fetch/$s_!jJbJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jJbJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/773771ec-0616-4626-b94f-c95220358272_800x155.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!jJbJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 424w, https://substackcdn.com/image/fetch/$s_!jJbJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 848w, https://substackcdn.com/image/fetch/$s_!jJbJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 1272w, https://substackcdn.com/image/fetch/$s_!jJbJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F773771ec-0616-4626-b94f-c95220358272_800x155.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>Result: Two examples of dilated spectral buffers visualized as a quadrilateral mesh.</em></figcaption></figure></div><h4>Embedding the&nbsp;buffer</h4><p>In many models of human memory, <em>selective attention</em> is applied after sensory memory as a filter to prevent overload of information in short-term memory [3]. Since humans have limited cognitive resources, it is advantageous to allocate attention to certain auditory sensations to optimize consumption of mental energy.</p><p>This process can be approached with an expansion of the <em>autoencoder </em>neural network architecture. Using this architecture, it&#8217;s possible to combine sensory memory of sounds with the bottleneck of selective attention by feeding it dilated frequency spectrum buffers for producing embeddings rather than feeding only the momentary frequency information. To cope with sequential information, a special type of architecture called a <em>sequence-to-sequence autoencoder</em> can be used [6].</p><p>Sequence-to-sequence (<em>Seq2Seq</em>) models typically use LSTM units to encode a sequence of data (an English sentence, for example) to an internal representation containing a compressed &#8220;meaning&#8221; about the sequence as a whole. This internal representation can then be decoded back into a sequence (the same sentence, but in Spanish, for example) [7].</p><blockquote><p>A feature of embedding sounds in this way, is that it makes it possible to analyze and process them using simple feed-forward neural networks which are cheaper to&nbsp;run.</p></blockquote><p>After training a network such as the one drawn below, the right half (the decoding part) can be &#8220;cut off&#8221;, thus generating a network for encoding temporal frequency information into a compressed space. Good results have been achieved in this area of research by Y. Chung et. al. with <em>Audio Word2Vec</em> which succeeded in generating embeddings describing the sequential phonetic structures of vocal recordings by applying a Seq2Seq autoencoder architecture [6]. With greater diversity of input data, it could also be possible to produce embeddings that describe sounds in a more general way.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SSwA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SSwA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 424w, https://substackcdn.com/image/fetch/$s_!SSwA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 848w, https://substackcdn.com/image/fetch/$s_!SSwA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 1272w, https://substackcdn.com/image/fetch/$s_!SSwA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SSwA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!SSwA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 424w, https://substackcdn.com/image/fetch/$s_!SSwA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 848w, https://substackcdn.com/image/fetch/$s_!SSwA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 1272w, https://substackcdn.com/image/fetch/$s_!SSwA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F339228b0-13d8-43cc-a503-2e7a5a2485f8_800x427.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>A simplified illustration of a sequential autoencoder which produces temporal sound embeddings.</em></figcaption></figure></div><h4>Listening with&nbsp;Keras</h4><p>Using the approach described above, we can implement a Seq2Seq autoencoder with Keras to produce audio embeddings. I call this a <strong>Listener</strong> <strong>Network</strong>, since its purpose is to <em>&#8220;listen&#8221;</em> to incoming sequences of sounds and reduce them to a more compact and meaningful representation which we can then analyze and process.</p><p>To train this network, ~3 hours of audio from the <a href="https://urbansounddataset.weebly.com/">UrbanSound8K</a> dataset were used. This dataset contains a selection of environmental sound clips divided into categories. The sounds were processed using a Gammatone filterbank and was segmented into dilated spectral buffers of 8 timesteps with 100 spectral filters each.</p><pre><code>from keras.models import Model
from keras.layers import Input, LSTM, RepeatVector</code></pre><pre><code>def prepare_listener(timesteps,
                     input_dim,
                     latent_dim,
                     optimizer_type,
                     loss_type):
    """Prepares Seq2Seq autoencoder model

        Args:
            :param timesteps: The number of timesteps in sequence
            :param input_dim: The dimensions of the input
            :param latent_dim: The latent dimensionality of LSTM
            :param optimizer_type: The type of optimizer to use
            :param loss_type: The type of loss to use

        Returns:
            Autoencoder model, Encoder model
    """

    inputs = Input(shape=(timesteps, input_dim))</code></pre><pre><code>    encoded = LSTM(int(input_dim / 2), 
                   activation="relu", 
                   return_sequences=True)(inputs)</code></pre><pre><code>    encoded = LSTM(latent_dim, 
                   activation="relu", 
                   return_sequences=False)(encoded)</code></pre><pre><code>    decoded = RepeatVector(timesteps)(encoded)</code></pre><pre><code>    decoded = LSTM(int(input_dim / 2), 
                   activation="relu", 
                   return_sequences=True)(decoded)</code></pre><pre><code>    decoded = LSTM(input_dim, 
                   return_sequences=True)(decoded)

    autoencoder = Model(inputs, decoded)
    encoder = Model(inputs, encoded)

    autoencoder.compile(optimizer=optimizer_type, 
                        loss=loss_type,  
                        metrics=['acc'])

    return autoencoder, encoder</code></pre><p><strong>For my data, this code produces the network architecture below:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KS-Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KS-Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 424w, https://substackcdn.com/image/fetch/$s_!KS-Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 848w, https://substackcdn.com/image/fetch/$s_!KS-Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 1272w, https://substackcdn.com/image/fetch/$s_!KS-Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KS-Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!KS-Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 424w, https://substackcdn.com/image/fetch/$s_!KS-Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 848w, https://substackcdn.com/image/fetch/$s_!KS-Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 1272w, https://substackcdn.com/image/fetch/$s_!KS-Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F511e85e2-a478-4bb4-86f2-7127eb989e4d_800x385.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This Listener Network was trained using <em>mean squared error</em> and <em>Adagrad </em>optimization for 50 epochs on a NVIDIA GTX 1070 GPU arriving at a reconstruction accuracy of 42%. Training took a while so I stopped early, though progress did not seem to have stagnated yet. I&#8217;m very interested to see the performance of such a model with a larger dataset and more computational capacity for training.</p><p>There is certainly room for improvement here, but the images below show that the coarse structure of the sequences were captured after compressing the input by a factor of 3.2.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yd8o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yd8o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 424w, https://substackcdn.com/image/fetch/$s_!Yd8o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 848w, https://substackcdn.com/image/fetch/$s_!Yd8o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 1272w, https://substackcdn.com/image/fetch/$s_!Yd8o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yd8o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!Yd8o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 424w, https://substackcdn.com/image/fetch/$s_!Yd8o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 848w, https://substackcdn.com/image/fetch/$s_!Yd8o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 1272w, https://substackcdn.com/image/fetch/$s_!Yd8o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F715f5b2b-e292-4d27-9e6e-5aa8709535f1_800x367.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>Some examples of original data and predictions by the autoencoder to illustrate reconstruction fidelity.</em></figcaption></figure></div><p>This was the second part of my article series on audio processing with neural networks. In the final article we will put the concepts to use in creating a network for analyzing audio embeddings.</p><p>Follow to stay updated and feel free to leave claps if you enjoyed the article!</p><h4>References</h4><p>[1] J. J. Eggermont, <strong>&#8220;Between sound and perception: reviewing the search for a neural code.,&#8221;</strong> Hear. Res., vol. 157, no. 1&#8211;2, pp. 1&#8211;42, Jul. 2001.</p><p>[2] C. Alain, D. L. Woods, and R. T. Knight, <strong>&#8220;A distributed cortical network for auditory sensory memory in humans,&#8221;</strong> Brain Res., vol. 812, no. 1&#8211;2, pp. 23&#8211;37, Nov. 1998.</p><p>[3] A. Wingfield, <strong>&#8220;Evolution of Models of Working Memory and Cognitive Resources,&#8221;</strong> Ear Hear., vol. 37, p. 35S&#8211;43S, 2016.</p><p>[4] <strong>&#8220;Implementing Circular/Ring Buffer in Embedded C&#8221;</strong>, Embedjournal.com, 2014. [Online]. Available: <a href="https://embedjournal.com/implementing-circular-buffer-embedded-c/.">https://embedjournal.com/implementing-circular-buffer-embedded-c/.</a></p><p>[5] A. Van Den Oord et al., <strong>&#8220;Wavenet: A Generative Model for Raw Audio.&#8221;</strong></p><p>[6] Y.-A. Chung, C.-C. Wu, C.-H. Shen, H.-Y. Lee, and L.-S. Lee, <strong>&#8220;Audio Word2Vec: Unsupervised Learning of Audio Segment Representations Using Sequence-to-Sequence Autoencoder,&#8221; </strong>in Proceedings of the Annual Conference of the International Speech Communication Association, 2016, pp. 765&#8211;769.</p><p>[7] F. Chollet, <strong>&#8220;A ten-minute introduction to sequence-to-sequence learning in Keras&#8221;</strong>, Blog.keras.io, 2018. [Online]. Available: <a href="https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html.">https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html.</a></p>]]></content:encoded></item><item><title><![CDATA[Human-Like Machine Hearing With AI (1/3)]]></title><description><![CDATA[Applying neural networks in real-time audio signal processing]]></description><link>https://blog.42futures.com/p/human-like-machine-hearing-with-ai-1-3-a5713af6e2f8</link><guid isPermaLink="false">https://blog.42futures.com/p/human-like-machine-hearing-with-ai-1-3-a5713af6e2f8</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Tue, 05 Jun 2018 13:03:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5cc3b6a3-21ca-41e6-adfd-04ef12dd1650_800x532.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IKgR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IKgR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IKgR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IKgR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IKgR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IKgR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!IKgR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IKgR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IKgR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IKgR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa80dd123-1c46-4525-b7b9-eafa1b6686aa_800x532.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Photo credit: <a href="https://www.flickr.com/photos/jonathangrossphotography/" title="Go to Jonathan Gross's photostream">Jonathan&nbsp;Gross</a></figcaption></figure></div><h4>Applying neural networks in real-time audio signal processing</h4><p>Significant breakthroughs in AI technology have been achieved through modeling human systems. While artificial neural networks (NNs) are mathematical models which are only loosely coupled with the way actual human neurons function, their application in solving complex and ambiguous real-world problems has been profound. Additionally, modeling the architectural depth of the brain in NNs has opened up broad possibilities in learning more meaningful representations of data.</p><p>If you&#8217;ve missed out on the other articles, click below to get up to speed:</p><p><strong>Background</strong>: <a href="https://towardsdatascience.com/the-promise-of-ai-in-audio-processing-a7e4996eb2ca">The promise of AI in audio processing</a><br><strong>Criticism</strong>: <a href="https://towardsdatascience.com/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd">What&#8217;s wrong with CNNs and spectrograms for audio processing?</a><br><strong>Part 2</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-2-3-f9fab903b20a">Human-Like Machine Hearing With AI (2/3)</a></p><p>In image recognition and processing, <a href="https://neurdiness.wordpress.com/2018/05/17/deep-convolutional-neural-networks-as-models-of-the-visual-system-qa/">the inspiration from the complex and more spatially invariant cells of the visual system in CNNs</a> has also produced great improvements to our technologies. If you&#8217;re interested in applying image recognition technologies on audio spectrograms, check out my article<em> <a href="https://towardsdatascience.com/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd">&#8220;What&#8217;s wrong with CNNs and spectrograms for audio processing?&#8221;</a></em>.</p><p><strong>As long as human perceptual capacity exceeds that of machines, we stand to gain by understanding the principles of human systems.</strong> Humans are very skillful when it comes to perceptual tasks and the contrast between human understanding and the status quo of AI becomes particularly apparent in the area of machine hearing. Considering the benefits reaped from getting inspired by human systems in visual processing, I propose that we stand to gain from a similar process in machine hearing with neural networks.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EQj3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EQj3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 424w, https://substackcdn.com/image/fetch/$s_!EQj3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 848w, https://substackcdn.com/image/fetch/$s_!EQj3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 1272w, https://substackcdn.com/image/fetch/$s_!EQj3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EQj3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!EQj3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 424w, https://substackcdn.com/image/fetch/$s_!EQj3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 848w, https://substackcdn.com/image/fetch/$s_!EQj3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 1272w, https://substackcdn.com/image/fetch/$s_!EQj3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F764e3805-330f-4863-aafc-9cdc0fafd429_800x645.png 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption"><em>An overview of the framework which will be proposed during this article&nbsp;series.</em></figcaption></figure></div><p><strong>In this article series, I will detail a framework for real-time audio signal processing with AI which was developed in cooperation with <a href="http://www.au.dk/en/">Aarhus University</a> and intelligent loudspeaker manufacturer <a href="https://www.dynaudio.com/">Dynaudio A/S</a></strong>. Its inspiration is primarily drawn from cognitive science which attempts to combine perspectives of biology, neuroscience, psychology and philosophy to gain greater understanding of our cognitive faculties.</p><h4>Cognitive Sound Properties</h4><p>Perhaps the most abstract domain of sound is how we, as humans, perceive it. While a solution for a signal processing problem has to operate within the parameters of intensity, spectral and temporal properties on a low level, the end goal is most often a cognitive one: Transforming a signal in such a way that our perceptions of the sounds it contains are altered.</p><p>If one wishes to programatically change the gender of a recorded spoken voice for example, it is necessary to describe this problem in more meaningful terms before defining its lower level characteristics. The gender of a speaker can be conceived as a <em>cognitive property</em> which is constructed from many factors: General pitch and timbre of a voice, differences in pronunciation, differences in choice of words and language and a common understanding of how these properties relate to gender.</p><p>These parameters can be described in lower level features like intensity, spectral and temporal properties but only in more complex combinations do they form high-level representations. <strong>This forms a hierarchy of audio features from which the &#8220;</strong><em><strong>meaning&#8221; </strong></em><strong>of a sound can be derived.</strong> The cognitive property representing a human voice can be thought of as a combinatory pattern of temporal developments in a sound&#8217;s intensity, spectral and statistical properties.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u-RK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u-RK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!u-RK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!u-RK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!u-RK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u-RK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!u-RK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 424w, https://substackcdn.com/image/fetch/$s_!u-RK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 848w, https://substackcdn.com/image/fetch/$s_!u-RK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 1272w, https://substackcdn.com/image/fetch/$s_!u-RK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdedfd88c-0c3e-4a80-b118-69398b8d5431_800x800.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>A hierarchy of features that can be used to derive meaning from digital&nbsp;audio.</em></figcaption></figure></div><p>NNs are great at extracting abstracted representations of data and are therefore well suited for the task of detecting cognitive properties in sound. In order to build a system for this purpose, let&#8217;s examine how sound is represented in human auditory organs that we can use to inspire representation of sound for processing with NNs.</p><h4>Cochlear Representation</h4><p>Hearing in humans starts at the outer ear which firstly consists of the <em>pinna</em>. The pinna acts as a form of spectral preprocessing in which the incoming sound is modified depending on its direction in relation to the listener. Sound then travels through the opening in the pinna into the <em>ear canal</em> which further acts to modify spectral properties of incoming sound by resonating in a way that amplifies frequencies in the range ~1&#8211;6 kHz [1].</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W8Wy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W8Wy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W8Wy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W8Wy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W8Wy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W8Wy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!W8Wy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W8Wy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W8Wy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W8Wy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7897163-e98c-4bed-9f1a-bafdd9f29110_800x524.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An illustration of the human auditory&nbsp;system.</figcaption></figure></div><p>As sound waves reach the end of the ear canal, they excite the eardrum onto which the <em>ossicles </em>(the smallest bones in the body) are attached. These bones transmit the pressure from the ear canal to the fluid-filled <em>cochlea </em>in the inner ear [1].<strong> The cochlea is of great interest in guiding sound representation for NNs because this is the organ responsible for transducing acoustic vibrations into neural activity in humans&nbsp;.</strong></p><p>It is a coiled tube which is separated along its length by two membranes being the <em>Reissner&#8217;s membrane</em> and the <em>basilar membrane</em>. Along the length of the cochlea, there is a row of around 3,500 inner hair cells [1]. As pressures enter the cochlea, its two membranes are pushed down. The basilar membrane is narrow and stiff at its base but loose and wide at its apex so that each place along its length responds more intensely at a particular frequency.</p><p>To simplify, the basilar membrane can be thought of as a continuous array of bandpass filters which, along the length of the membrane, acts to separate sounds into their spectral components.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D1qg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D1qg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 424w, https://substackcdn.com/image/fetch/$s_!D1qg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 848w, https://substackcdn.com/image/fetch/$s_!D1qg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 1272w, https://substackcdn.com/image/fetch/$s_!D1qg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D1qg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!D1qg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 424w, https://substackcdn.com/image/fetch/$s_!D1qg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 848w, https://substackcdn.com/image/fetch/$s_!D1qg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 1272w, https://substackcdn.com/image/fetch/$s_!D1qg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7934d914-8dc7-414b-aca1-f6fa6eacff8c_640x362.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An illustration of the human&nbsp;cochlea.</figcaption></figure></div><p>This is the primary mechanism by which humans convert sound pressures into neural activity. Therefore, it is reasonable to assume that spectral representations of audio would be beneficial in modeling sound perception with AI. Since frequency responses along the basilar membrane vary exponentially [2], logarithmic frequency representations might prove most efficient. One such representation could be derived using a <strong>gammatone filterbank</strong>. These filters are commonly applied in modeling spectral filtering in the auditory system since they approximate the impulse response of human auditory filters derived from the measured auditory nerve fiber response to white noise stimuli called the <em>&#8220;revcor&#8221;</em> function [3].</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n8_v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n8_v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 424w, https://substackcdn.com/image/fetch/$s_!n8_v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 848w, https://substackcdn.com/image/fetch/$s_!n8_v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 1272w, https://substackcdn.com/image/fetch/$s_!n8_v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n8_v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!n8_v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 424w, https://substackcdn.com/image/fetch/$s_!n8_v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 848w, https://substackcdn.com/image/fetch/$s_!n8_v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 1272w, https://substackcdn.com/image/fetch/$s_!n8_v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9db40c90-d9d0-468d-b342-85e13d67e68d_800x343.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>A simplified comparison between human spectral transduction and a digital counterpart.</em></figcaption></figure></div><p>Since the cochlea has ~3500 inner hair cells and humans can detect gaps in sounds down to ~2&#8211;5 ms in length [1], a spectral resolution of 3500 gammatone filters separated into 2 ms windows seem optimal parameters for achieving human-like spectral representation in machines. In practical scenarios however, I assume that lesser resolutions could still achieve desirable effects in most analysis and processing tasks while being more viable from a computational standpoint.</p><p>A number of software libraries for auditory analysis are available online. A notable example is the <em><a href="https://github.com/detly/gammatone">Gammatone Filterbank Toolkit</a></em><a href="https://github.com/detly/gammatone"> by Jason Heeris</a>. It provides adjustable filters as well as tools for spectrogram-like analysis of audio signals with gammatone filters.</p><h4>Neural Coding</h4><p>As neural activity moves from the cochlea onto the auditory nerve and the ascending auditory pathways, a number of processes are applied in brainstem nuclei before it reaches the auditory cortex.</p><p>These processes form a <em>neural code</em> which represents an interface between stimulus and perception [4]. Much knowledge about the specific inner workings of these nuclei is still speculative or unknown, so I will detail these nuclei only at their higher levels of functioning.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-Fcm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Fcm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 424w, https://substackcdn.com/image/fetch/$s_!-Fcm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 848w, https://substackcdn.com/image/fetch/$s_!-Fcm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 1272w, https://substackcdn.com/image/fetch/$s_!-Fcm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Fcm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!-Fcm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 424w, https://substackcdn.com/image/fetch/$s_!-Fcm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 848w, https://substackcdn.com/image/fetch/$s_!-Fcm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 1272w, https://substackcdn.com/image/fetch/$s_!-Fcm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbf054e5-4efb-46fb-adec-f6e4e61ffce1_800x487.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>A simplified illustration of the ascending auditory pathway (for one ear) and its assumed functions.</em></figcaption></figure></div><p>Humans have a set of these nuclei for each ear that are interconnected, but for simplicity, I&#8217;ve illustrated the flow for only one ear. The <em>cochlear nucleus</em> is the first coding step for neural signals coming from the auditory nerve. It consists of a variety of neurons with different properties which serve to perform initial processing of sound features, some of which are directed to the <em>superior olive</em> which is associated with sound localization while others are directed to the <em>lateral lemniscus</em> and <em>inferior colliculus</em>, commonly associated with more advanced features [1].</p><p>J. J. Eggermont details this flow of information from the cochlear nucleus in <em>&#8220;Between sound and perception: reviewing the search for a neural code&#8221;</em> as follows: <em>&#8220;The ventral [cochlear nucleus] (VCN) extracts and enhances the frequency and timing information that is multiplexed in the firing patterns of the [auditory nerve] fibers, and distributes the results via two main pathways: the sound localization path and the sound identification path. The anterior part of the VCN (AVCN) mainly serves the sound localization aspects and its two types of bushy cells provide input to the superior olivary complex (SOC), where interaural time differences (ITDs) and level differences (ILDs) are mapped for each frequency separately&#8221;</em> [4].</p><p>The information carried by the sound identification pathway is a representation of complex spectra such as vowels. This representation is mainly created in the ventral cochlear nucleus by special types of units dubbed <em>&#8220;chopper&#8221; </em>(<em>stellate</em>) neurons [4]. The details of these auditory encodings are difficult to specify but<strong> they indicate to us that a form of &#8220;coding&#8221; of incoming frequency spectra could improve understanding of low level sound features</strong> as well as making sound impressions less expensive to process in NNs.</p><h4>Spectral Sound Embeddings</h4><p>We can apply the unsupervised <a href="https://deeplearning4j.org/deepautoencoder">autoencoder NN architecture</a> as an attempt to learn common properties associated with complex spectra. Like <a href="https://www.tensorflow.org/tutorials/word2vec">word embeddings</a>, its possible to find commonalities in frequency spectra that represent select features (or a more tightly condensed <em>meaning</em>) of sounds.</p><p>An autoencoder is trained to encode an input into a compressed representation that can be reconstructed back into a representation with a high similarity to the input. This means that the autoencoder&#8217;s target output is the input itself [5]. If an input can be reconstructed without great loss, the network has learnt to encode it in such a way that the compressed internal representation contains enough meaningful information. This internal representation is then what we refer to as the embedding. The encoding part of the autoencoder can be decoupled from the decoder to generate embeddings for other applications.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mDrq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mDrq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 424w, https://substackcdn.com/image/fetch/$s_!mDrq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 848w, https://substackcdn.com/image/fetch/$s_!mDrq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 1272w, https://substackcdn.com/image/fetch/$s_!mDrq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mDrq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!mDrq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 424w, https://substackcdn.com/image/fetch/$s_!mDrq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 848w, https://substackcdn.com/image/fetch/$s_!mDrq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 1272w, https://substackcdn.com/image/fetch/$s_!mDrq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F663fdca5-8d32-4ab7-982b-6ca4ded18510_800x502.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">A simplified illustration of an autoencoder architecture for spectral sound embeddings.</figcaption></figure></div><p>Embeddings also have the benefit that they are often of lower dimensionality than the original data. For instance, an autoencoder could compress a frequency spectrum with a total of 3500 values into a vector with a length of 500 values. Put simply, each value of such a vector could describe higher level factors of a spectrum such as vowel, harshness or harmonicity - These are only examples, as the meaning of statistically common factors derived by an autoencoder might often be difficult to label in plain language.</p><p>In the next article, we will expand upon this idea with added memory to produce embeddings for temporal developments of audio frequency spectra.</p><p>This wraps up the first part of my article series on audio processing with artificial intelligence. Next, we will discuss the essential concepts of sensory memory and temporal dependencies in sound.</p><p>Follow to stay updated and feel free to leave claps if you enjoyed the article!</p><h4>References</h4><p>[1] C. J. Plack, The Sense of Hearing, 2nd ed. Psychology Press, 2014.</p><p>[2] S. J. Elliott and C. A. Shera, &#8220;The cochlea as a smart structure,&#8221; Smart Mater. Struct., vol. 21, no. 6, p. 64001, Jun. 2012.</p><p>[3] A.M. Darling, &#8220;Properties and implementation of the gammatone filter: A tutorial&#8221;, Speech hearing and language, University College London, 1991.</p><p>[4] J. J. Eggermont, &#8220;Between sound and perception: reviewing the search for a neural code.,&#8221; Hear. Res., vol. 157, no. 1&#8211;2, pp. 1&#8211;42, Jul. 2001.</p><p>[5] T. P. Lillicrap et al., Learning Deep Architectures for AI, vol. 2, no. 1. 2015.</p>]]></content:encoded></item><item><title><![CDATA[What’s wrong with spectrograms and CNNs for audio processing?]]></title><description><![CDATA[CNNs do amazing things with images, but why do they not work as well for sound?]]></description><link>https://blog.42futures.com/p/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd</link><guid isPermaLink="false">https://blog.42futures.com/p/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Mon, 26 Mar 2018 02:12:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ffc279a2-0452-40cb-8999-dbefb55a664f_800x533.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CMDg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CMDg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CMDg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CMDg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CMDg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CMDg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!CMDg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CMDg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CMDg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CMDg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2e1116-9410-486a-a71e-a371340da34c_800x533.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">(Photo credit: <a href="https://unsplash.com/@jacc?utm_source=medium&amp;utm_medium=referral">Jack Hamilton</a>)</figcaption></figure></div><p>In recent years, great results have been achieved in generating and processing images with neural networks. This can partly be attributed to the great performance of deep CNNs to capture and transform high-level information in images. A notable example of this is the process of image style transfer using CNNs proposed by L. Gatys et. al. which can render semantic content of an image in a different style [1].</p><p>The process of neural style transfer is well explained by Y. Li et. al: <em>&#8220;this method used Gram matrices of the neural activations from different layers of a CNN to represent the artistic style of a image. Then it used an iterative optimization method to generate a new image from white noise by matching the neural activations with the content image and the Gram matrices with the style image&#8221; </em>[2].</p><p>In simpler terms, these results can be thought of as being achieved by generating images according to combinations of features from source content and style images at different levels of abstraction. As an example, this could be maintaining the high level structures and contours of the content image while incorporating colors and lower level texture features of the style image.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_P_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_P_G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 424w, https://substackcdn.com/image/fetch/$s_!_P_G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 848w, https://substackcdn.com/image/fetch/$s_!_P_G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 1272w, https://substackcdn.com/image/fetch/$s_!_P_G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_P_G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!_P_G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 424w, https://substackcdn.com/image/fetch/$s_!_P_G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 848w, https://substackcdn.com/image/fetch/$s_!_P_G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 1272w, https://substackcdn.com/image/fetch/$s_!_P_G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1da4590f-086b-4780-aa7f-18288f5cd393_800x307.png 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption"><em>An example of the transfer of style features (&#8220;B&#8221;) onto a content image (&#8220;A&#8221;) by L. Gatys et.&nbsp;al.</em></figcaption></figure></div><p>The performance of style transfer in the realm of visual processing has been quite impressive and lends itself to optimism for &#8220;smarter&#8221; audio processing algorithms if similar results can be achieved. Since spectrograms are two-dimensional representations of audio frequency spectra over time, attempts have been made in analyzing and processing them with CNNs. It has been shown, that it is possible to process spectrograms as images and perform neural style transfer with CNNs [3] but, so far, the results have not been nearly as compelling as they have been for visual images [4].</p><p>To overcome this challenge and to produce better results in neural audio processing we might then need to consider why style transfer with CNNs do not perform as well on spectrograms. <strong>Essentially, these techniques apply machine vision in order to do machine hearing.</strong> I believe this poses an essential problem which could be hindering the progress of AI-assisted technologies in audio processing. While the problem can undoubtedly be approached from many angles, it might be worthwhile exploring the differences between images and spectrograms and, as a consequence, some of the differences between seeing and hearing.</p><h3>Sounds are &#8220;transparent&#8221;</h3><p>One challenge posed in the comparison between visual images and spectrograms is the fact that visual objects and sound events do not accumulate in the same manner. To use a visual analogy, one could say that sounds are always &#8220;transparent&#8221; [4] whereas most visual objects are opaque.</p><p>When encountering a pixel of a certain color in an image, it can most often be assumed to belong to a single object. Discrete sound events do not separate into layers on a spectrogram: Instead, they all sum together into a distinct whole. That means that a particular observed frequency in a spectrogram cannot be assumed to belong to a single sound as the magnitude of that frequency could have been produced by any number of accumulated sounds or even by the complex interactions between sound waves such as phase cancellation. This makes it difficult to separate simultaneous sounds in spectrogram representations.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Niz5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Niz5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 424w, https://substackcdn.com/image/fetch/$s_!Niz5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 848w, https://substackcdn.com/image/fetch/$s_!Niz5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 1272w, https://substackcdn.com/image/fetch/$s_!Niz5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Niz5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!Niz5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 424w, https://substackcdn.com/image/fetch/$s_!Niz5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 848w, https://substackcdn.com/image/fetch/$s_!Niz5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 1272w, https://substackcdn.com/image/fetch/$s_!Niz5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61cf74ae-80d8-4d38-9cc4-446330cc49df_800x320.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>Three examples of difficult scenarios of spectrogram analysis. (Left): Two similar tones cause uneven phase cancellations across frequencies. (Middle): Two simultaneous voices with similar pitch are difficult to tell apart. (Right): Noisy and complex auditory scenes make it particularly difficult to distinguish sound&nbsp;events.</em></figcaption></figure></div><h3>The axes of spectrograms do not carry the same&nbsp;meaning</h3><p>CNNs for images use two-dimensional filters that share weights across the x and y dimensions [4]. As earlier described, this builds on the assumption that features of an image carry the same meaning regardless of their location. For this to be true, you should also assume that the x and y axes of the data have the same implications to the meaning of the content. For example, a face is still a face regardless of whether it is moved horizontally or vertically in an image.</p><p>In spectrograms, the two dimensions represent fundamentally different units, one being strength of frequency and the other being time. Moving a sound event horizontally offsets its position in time and it can be argued that a sound event means the same thing regardless of when it happens. However, moving a sound vertically might influence its meaning: <strong>Moving the frequencies of a male voice upwards could change its meaning from man to child or goblin</strong>, for example. Performing a frequency shifts of a sound event can also changes its spatial extent [4]. Therefore, the spatial invariance that 2D CNNs provide might not perform as well for this form of data.</p><h3>The spectral properties of sounds are non-local</h3><p>In images, similar neighboring pixels can often be assumed to belong to the same visual object but in sound, frequencies are most often non-locally distributed on the spectrogram [4]. Periodic sounds are typically comprised of a fundamental frequency and a number of harmonics which are spaced apart by relationships dictated by the source of the sound. It is the mixture of these harmonics that determines the timbre of the sound.</p><p>In the instance of a female vocal, the fundamental frequency at a moment in time might be 200Hz while the first harmonic is 400Hz, the next 600Hz and so on. <strong>These frequencies are not locally grouped but they move together according to a common relationship.</strong> This further complicates the task of finding local features in spectrograms using 2D convolutions as they are often unevenly spaced apart even though they move according to the same factors.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d35U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d35U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 424w, https://substackcdn.com/image/fetch/$s_!d35U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 848w, https://substackcdn.com/image/fetch/$s_!d35U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 1272w, https://substackcdn.com/image/fetch/$s_!d35U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d35U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!d35U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 424w, https://substackcdn.com/image/fetch/$s_!d35U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 848w, https://substackcdn.com/image/fetch/$s_!d35U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 1272w, https://substackcdn.com/image/fetch/$s_!d35U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbffa5c50-5352-45f2-9cbb-0a247b35164d_800x315.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><em>An illustration of the non-local distribution of frequencies in a female&nbsp;voice</em></figcaption></figure></div><h3>Sound is inherently serial</h3><p>When assessing a visual environment, we can &#8220;scan&#8221; our surroundings multiple times to locate each visual object in a scene. Since most objects are non-moving, light will reflect from them in a predictable manner and one can make a mental map of their placement in a physical scene. From a perceptual point of view then, the visual objects are assumed to continue to exist at their observed location, even when you look elsewhere.</p><p><strong>This is not true for sounds.</strong> Sound takes the physical form of pressure waves and, from the point of view of a listener, such waves exist only in their current state at one moment in time. Once the moment has passed, the wave has passed by, traveling away from the observer. This is why it makes sense to refer to these phenomena as sound <em>events </em>rather than <em>objects</em>. From a physical perspective, this means that listeners experience sound only a moment at a time. Where images can be regarded to contain larger amounts of static parallel information, sound, then, is highly serial.</p><p>A more fitting comparison is one between audio and video. Both these media can be conceptualized as depicting movements over time where dependencies across time are essential to the experienced meaning of the content. Since video is constructed from collections of images (<em>frames</em>), it contains much more parallel information.</p><p>One way to illustrate this is to &#8220;<em>freeze&#8221; </em>a moment of time in both media. Looking at a single frame of a video (often depicting ~1/25 seconds of light exposure) it is still often possible to gather a significant amount of meaning about the context, actions and scene of the video: Individual objects can be identified and, sometimes, actions and movements can be assessed. When <em>&#8220;freezing&#8221; </em>a single moment of audio (such as a corresponding aggregate of ~1/25 seconds) with spectral analysis however, assessments cannot be nearly as comprehensive. Some context about the overall tonal balance and characteristics of the signal can be gathered, but not nearly to the same degree as for video.</p><p>For example, it is not possible to identify separate sound events outside the context of time to see which spectral developments happen according to the same temporal patterns. The only thing that can be established for certain is the tonal balance of the heard sound(s) at that specific moment in time. An explanation for this comes back to the previously discussed physical form of sound as waves: <strong>Sounds do not exist as static objects which can be observed in parallel, they arrive as sequences of air pressure and meaning about these pressures must be established over time.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LujO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LujO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 424w, https://substackcdn.com/image/fetch/$s_!LujO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 848w, https://substackcdn.com/image/fetch/$s_!LujO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 1272w, https://substackcdn.com/image/fetch/$s_!LujO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LujO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86bf79fe-6457-4919-ae58-0813191066d7_800x320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!LujO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 424w, https://substackcdn.com/image/fetch/$s_!LujO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 848w, https://substackcdn.com/image/fetch/$s_!LujO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 1272w, https://substackcdn.com/image/fetch/$s_!LujO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86bf79fe-6457-4919-ae58-0813191066d7_800x320.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">~<em>1/25 second of video and audio respectively. (Left): A girl riding down a metal slide in a playground. (Right): A spectral representation of a traditional music performance from&nbsp;Senegal.</em></figcaption></figure></div><p>These reasons suggest that audio as a medium for conveying meaning is fundamentally serial and more temporally dependent than video which presents another reason why visual spectrogram representations of sounds fed into image processing networks without temporal awareness might not work optimally.</p><h3>A case for modeling the human experience</h3><p>Significant breakthroughs in AI technology have been achieved through modeling human systems. While artificial neural networks are mathematical models which are only loosely coupled with the way actual human neurons function, their application in solving complex and ambiguous real-world problems has been profound. Modeling the architectural depth of the brain in these neural networks has opened up broad possibilities in learning more meaningful representations of data. In image recognition and processing, the inspiration from the complex and more spatially invariant cells of the visual system in CNNs have also produced great improvements to the state of our technologies.</p><p>As argued by J. B. Allen in <em>&#8220;How Do Humans Process and Recognize Speech?&#8221;</em>, as long as human perceptual capacity exceeds that of machines, we stand to gain by understanding the principles of human systems [5]. <strong>Humans are generally very skillful when it comes to perceptual tasks and</strong> <strong>the contrast between human understanding and the status quo of AI becomes particularly apparent in the area of machine hearing</strong>. Considering the benefits reaped from getting inspired by human systems in visual processing (and the arguments presented that visual models do not perform as well for sound), I propose that we stand to gain from a similar process in machine hearing with neural networks.</p><p>This is part of a bigger machine hearing project. If you&#8217;ve missed out on the other articles, click below to get up to speed:</p><p><strong>Background</strong>: <a href="https://towardsdatascience.com/the-promise-of-ai-in-audio-processing-a7e4996eb2ca">The promise of AI in audio processing</a><br><strong>Part 1:</strong> <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-1-3-a5713af6e2f8">Human-Like Machine Hearing With AI (1/3)</a><br><strong>Part 2</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-2-3-f9fab903b20a">Human-Like Machine Hearing With AI (2/3)</a><br><strong>Part 3</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-3-3-fd6238426416">Human-Like Machine Hearing With AI (3/3)</a></p><h3>References:</h3><p>[1] L. A. Gatys, A. S. Ecker, and M. Bethge, &#8220;Image Style Transfer Using Convolutional Neural Networks,&#8221; in 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016, pp. 2414&#8211;2423.</p><p>[2] Y. Li, N. Wang, J. Liu, and X. Hou, &#8220;Demystifying Neural Style Transfer,&#8221; Jan. 2017.</p><p>[3] P. Verma and J. O. Smith, &#8220;Neural Style Transfer for Audio Spectrograms,&#8221; Jan. 2018.</p><p>[4] L. Wyse. 2017. Audio Spectrogram Representations for Processing with Convolutional Neural Networks. <strong>Proceedings of the First International Workshop on Deep Learning and Music joint with IJCNN. Anchorage, US. May, 2017.</strong> 1(1). pp 37&#8211;41. DOI: 10.13140/RG.2.2.22227.99364/1</p><p>[5] J. B. Allen, &#8220;How Do Humans Process and Recognize Speech?,&#8221; IEEE Trans. Speech Audio Process., vol. 2, no. 4, pp. 567&#8211;577, 1994.</p>]]></content:encoded></item><item><title><![CDATA[The promise of AI in audio processing]]></title><description><![CDATA[Developments in AI presents a big potential for audio signal processing, but to progress we might need to rethink audio representation.]]></description><link>https://blog.42futures.com/p/the-promise-of-ai-in-audio-processing-a7e4996eb2ca</link><guid isPermaLink="false">https://blog.42futures.com/p/the-promise-of-ai-in-audio-processing-a7e4996eb2ca</guid><dc:creator><![CDATA[Daniel Rothmann]]></dc:creator><pubDate>Tue, 26 Dec 2017 15:32:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1da5516b-61c7-418a-ae74-e9816dffd49a_800x329.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vJcg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vJcg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vJcg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vJcg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vJcg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vJcg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!vJcg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vJcg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vJcg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vJcg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95b9794-486d-4de9-ab9c-d4112f6030ff_800x329.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>2017 has been a good year for AI, deep learning in particular. We have seen a rise of AI technologies for image and video processing. Even though things tend to take a little while longer making it to the world of audio, here we have also seen impressive technological advances.</p><p>In this article, I will summarize some of these advances, outline further potentials of AI in audio processing as well as describe some of the possible pitfalls and challenges we might encounter in pursuing this cause.</p><h4>Towards smarter&nbsp;audio</h4><p>The kicker for my interest in AI use cases for audio processing was the publication of <a href="https://deepmind.com/blog/wavenet-generative-model-raw-audio/">Google Deepmind&#8217;s </a><em><a href="https://deepmind.com/blog/wavenet-generative-model-raw-audio/">&#8220;WaveNet&#8221;</a></em>&#8202;&#8212;&#8202;A deep learning model for generating audio recordings [1] which was released during the end of 2016. Using an adapted network architecture, a <em>dilated convolutional neural network</em>, Deepmind researchers succeeded in generating very convincing text-to-speech and some interesting music-like recordings trained from classical piano recordings.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xc6E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xc6E!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 424w, https://substackcdn.com/image/fetch/$s_!xc6E!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 848w, https://substackcdn.com/image/fetch/$s_!xc6E!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 1272w, https://substackcdn.com/image/fetch/$s_!xc6E!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xc6E!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&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_!xc6E!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 424w, https://substackcdn.com/image/fetch/$s_!xc6E!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 848w, https://substackcdn.com/image/fetch/$s_!xc6E!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 1272w, https://substackcdn.com/image/fetch/$s_!xc6E!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91c66c55-2245-4f16-9658-081d2344d7b6_570x262.gif 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption">An illustration of WaveNet&#8217;s dilated model for sample generation (photo credit: <a href="https://deepmind.com/blog/wavenet-generative-model-raw-audio/">Google Deepmind</a>)</figcaption></figure></div><p>In the commercial world, we have also seen more applications of machine learning in products&#8202;&#8212;&#8202;Take for example <a href="https://www.landr.com">LANDR</a>, an automated audio mastering service which relies on AI to set parameters for digital audio processing and refinement.</p><p>This year, pro audio software mogul <a href="https://www.izotope.com">iZotope</a> released <a href="https://www.izotope.com/en/products/mix/neutron.html">Neutron 2</a>, an audio mixing tool that features a <em>&#8220;track assistant&#8221;</em> which utilizes AI to detect instruments and suggest fitting presets to the user. In more direct processing of audio with AI, iZotope also featured a <a href="https://www.izotope.com/en/products/repair-and-edit/rx/features/dialogue-isolate.html">utility for isolating dialogue</a> in their audio restoration suite <a href="https://www.izotope.com/en/products/repair-and-edit/rx.html">RX 6</a>.</p><div class="captioned-image-container"><figure><div id="youtube2-a1HWQ2jz8mI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;a1HWQ2jz8mI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/a1HWQ2jz8mI?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><figcaption class="image-caption">A short demonstration of iZotope&#8217;s dialogue isolate feature</figcaption></figure></div><h4>Potentials of AI in digital signal processing</h4><p>We are still in the early days of AI application in audio processing. Deep learning methods allow us to approach signal processing problems from a new perspective which is still largely ignored in the audio industry. Up to this point, we have had our focus on formulaic treatment: Coming to a deep understanding of a problem and manually devising functions to solve it. However, the understanding of sound is a very complex task and problems that we, as humans, intuitively find quite easy often turn out to be very difficult to describe formulaically.</p><p>Take, for instance, source separation: You find yourself in a scenario where two people are speaking over each other. After the fact, in your mind, you can imagine either person speaking in isolation without much effort. But how do we describe a formula for separating these two voices? Well, it depends:</p><blockquote><p>Is there a unified way to describe how human voices sound? If yes, how are parameters of this description affected by sex, age, energy, personality? How does physical proximity to the listener and room acoustics impact this understanding? What about non-human noise that can occur during the recording? On which parameters can we discriminate one voice over another?</p></blockquote><p>As you can see, devising a formula for the full extent of this problem would require attention to a lot of parameters. Here, AI can provide a more pragmatic approach&#8202;&#8212;&#8202;By setting up the proper conditions for learning, we can statistically estimate the complexities of this function automatically. In fact, researchers at <a href="https://www.eriksholm.com/">Eriksholm</a> (a research center for the hearing aid manufacturer <a href="https://www.oticon.com/">Oticon</a>) recently proposed a method for achieving improved source separation in real-time applications using a convolutional recurrent neural network architecture [2].</p><p>As methods for processing audio with deep neural networks are improving, we can only begin to imagine the difficult problems we could solve&#8202;&#8212;&#8202;Here are a few of my imaginations for deep learning in real-time audio processing:</p><ul><li><p><strong>Selective noise canceling</strong>, removing only certain elements like car traffic</p></li><li><p><strong>Hi-fi audio reconstruction</strong>, from small and low-quality microphones</p></li><li><p><strong>Analog audio emulation</strong>, estimating the complex interactions between non-linear analog audio components</p></li><li><p><strong>Speech processing</strong>, changing speaker, dialect or language in recordings</p></li><li><p><strong>Improved spatial simulations</strong>, for reverb and binaural processing</p></li></ul><h4>Challenges in representation and architecture</h4><p>WaveNet was among the first successful attempts to generate audio on a raw sample level. The one big problem here is that CD quality audio is usually stored with 44100 samples per second and thus, generating <em>seconds</em> of sound with WaveNet takes <em>hours</em>. This excludes the method from having use in real-time applications. It&#8217;s just a lot of data to make sense of.</p><p>On the other hand, many current solutions for audio processing with neural networks utilize spectrogram representations and convolutional networks. In these solutions, the audio frequency spectrum is essentially represented visually as magnitudes over time on a 2D image and the convolutional network is used to scan and process that image [3]. Usually, results from these methods are not nearly as compelling as those we see in the visual field such as <em>CycleGAN</em> that can do some impressive style transfer for movies [4].</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Clsu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Clsu!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 424w, https://substackcdn.com/image/fetch/$s_!Clsu!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 848w, https://substackcdn.com/image/fetch/$s_!Clsu!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 1272w, https://substackcdn.com/image/fetch/$s_!Clsu!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Clsu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!Clsu!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 424w, https://substackcdn.com/image/fetch/$s_!Clsu!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 848w, https://substackcdn.com/image/fetch/$s_!Clsu!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 1272w, https://substackcdn.com/image/fetch/$s_!Clsu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8afacff-26a0-414c-8ae7-80122f4f5cc5_448x128.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">CycleGAN transforming horses into zebras (photo credit: <a href="https://github.com/junyanz/CycleGAN">CycleGAN</a>)</figcaption></figure></div><p>Movies and audio clips have something in common in the sense that they both depict movements over time. Considering innovations in image processing networks like CycleGAN, one would assume that such style transfer could be possible for audio as well.</p><p>But movies and audio clips are not the same things&#8202;&#8212;&#8202;If you freeze a frame of a movie, quite a lot of information can still be gathered about the actions in the frame. If you freeze a &#8220;frame&#8221; of audio, however, very little meaning can be gathered about what is actually being heard. This suggests that audio is fundamentally more temporally dependent than movies. In spectrograms, you can never assume that a pixel belongs to a single object either: Audio is always &#8220;transparent&#8221;, and therefore spectrograms display all audible sounds overlapping each other in the same frame [3].</p><blockquote><p>We are doing machine vision to do machine&nbsp;hearing.</p></blockquote><p>Convolutional neural networks are designed with inspiration from the human visual system, loosely based on how information flows into the visual cortex [5]. I believe this presents a problem worth paying consideration to. Essentially, we are taking audio, translating it to images and performing visual processing on that image before translating it back to audio. So, we are doing machine vision to do machine hearing. But, as we are intuitively aware, these two senses don&#8217;t function in the same way. Looking at the spectrogram below, how much meaning can you (with your smart human brain) actually gather about the contents of the audio? If you could listen to it, you would quickly get an intuitive understanding of what is happening. Maybe this is a problem that is hindering our progress in AI-assisted technologies for audio.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yFvg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yFvg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 424w, https://substackcdn.com/image/fetch/$s_!yFvg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 848w, https://substackcdn.com/image/fetch/$s_!yFvg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 1272w, https://substackcdn.com/image/fetch/$s_!yFvg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yFvg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!yFvg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 424w, https://substackcdn.com/image/fetch/$s_!yFvg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 848w, https://substackcdn.com/image/fetch/$s_!yFvg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 1272w, https://substackcdn.com/image/fetch/$s_!yFvg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb57a0ac7-4c35-41ae-9a1c-9a336fce4417_678x242.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">A five-second spectrogram. Can you tell what it is? (It&#8217;s a blues&nbsp;harp.)</figcaption></figure></div><p>Therefore I propose that to achieve better results with neural networks for audio processing, we should allocate energy to figuring out better representations and neural network architectures for audio specifically. One such representation could be the autocorrelogram, a three-dimensional representation of sound where time, frequency and periodicity is included [6]. It turns out that humans can separate sound sources by intuitively comparing the periodicity of sounds to find patterns of similarity. Pitch and rhythm are also results of temporal factors. Therefore more temporally focused representations, such as the autocorrelogram, might be useful.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!piKT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!piKT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 424w, https://substackcdn.com/image/fetch/$s_!piKT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 848w, https://substackcdn.com/image/fetch/$s_!piKT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 1272w, https://substackcdn.com/image/fetch/$s_!piKT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!piKT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!piKT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 424w, https://substackcdn.com/image/fetch/$s_!piKT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 848w, https://substackcdn.com/image/fetch/$s_!piKT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 1272w, https://substackcdn.com/image/fetch/$s_!piKT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb9e9351-08a4-4973-ade3-a1d7e9dc31d6_555x506.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An illustration of an autocorrelogram for sound (photo credit: <a href="http://staffwww.dcs.shef.ac.uk/people/N.Ma/resources/correlogram/">University of Sheffield</a>)</figcaption></figure></div><p>Furthermore, we could start thinking about architecturally modeling the neural pathways of the auditory system. When sound excites our eardrums and travels into the cochlea, it is transformed into magnitudes for different frequencies. Then it travels to the central auditory system for temporal pattern processing. Which modes of analysis do we utilize to gather meaning from audio in our central auditory system that can be modeled in an artificial neural network? Periodicity, maybe [6]. Statistical groupings of sound events, maybe [7]. Dilated time frames of analysis, maybe [1].</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nkLa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nkLa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 424w, https://substackcdn.com/image/fetch/$s_!nkLa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 848w, https://substackcdn.com/image/fetch/$s_!nkLa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 1272w, https://substackcdn.com/image/fetch/$s_!nkLa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nkLa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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_!nkLa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 424w, https://substackcdn.com/image/fetch/$s_!nkLa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 848w, https://substackcdn.com/image/fetch/$s_!nkLa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 1272w, https://substackcdn.com/image/fetch/$s_!nkLa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9d0c3b-1059-45f4-b081-9036ca2db098_495x297.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">An illustration of information flow in the auditory system (photo credit: <a href="https://www.isip.uni-luebeck.de/research/signal-processing/invariant-features.html">Universit&#228;t Zu&nbsp;L&#252;beck</a>)</figcaption></figure></div><h4>Conclusion</h4><p>Developments in AI presents a big potential for smarter audio signal processing. But to better understand sound in neural networks, we might need to part ways with perspectives that are inherently visual and consider new techniques based instead on the auditory system.</p><p>In this article, I have posed more questions than I have provided answers, hoping to kick-start your thought about sound in this context.</p><p>This is part of a bigger machine hearing project. If you&#8217;ve missed out on the other articles, click below to get up to speed:</p><p><strong>Criticism</strong>: <a href="https://towardsdatascience.com/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd">What&#8217;s wrong with CNNs and spectrograms for audio processing?</a><br><strong>Part 1:</strong> <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-1-3-a5713af6e2f8">Human-Like Machine Hearing With AI (1/3)</a><br><strong>Part 2</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-2-3-f9fab903b20a">Human-Like Machine Hearing With AI (2/3)</a><br><strong>Part 3</strong>: <a href="https://towardsdatascience.com/human-like-machine-hearing-with-ai-3-3-fd6238426416">Human-Like Machine Hearing With AI (3/3)</a></p><h4>Sources</h4><p>[1] <em>A. Oord, S. Dieleman, H. Zen, K. Simonyan, O. Vinyals, A. Graves, N. Kalchbrenner, A. Senior, K. Kavukcuoglu</em>: <strong>WaveNet: A Generative Model for Raw Audio</strong>, 2016</p><p>[2] <em>G. Naithani, T. Barker, G. Parascandolo, L. Bramsl&#248;w, N. Pontoppidan, T- Virtanan</em>: <strong>Low Latency Sound Source Separation Using Convolutional Recurrent Neural Networks</strong>, 2017</p><p>[3] <em>L. Wyse</em>: <strong>Audio spectrogram representations for processing with Convolutional Neural Networks</strong>, 2017</p><p>[4]<em> J. Zhu, T. Park, P. Isola, A. Efros</em>:<strong> Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks</strong>, 2017</p><p>[5] <em>Y. Bengio</em>: <strong>Learning Deep Architectures for AI </strong>(p. 44), 2009</p><p>[6]<em> M. Slaney, R. Lyon</em>: <strong>On the importance of time&#8202;&#8212;&#8202;A temporal representation of sound</strong>, 1993</p><p>[7] <em>E. Piazza, T. Sweeny, D. Wessel, M. Silver, D. Whitney</em>: <strong>Humans Use Summary Statistics to Perceive Auditory Sequences</strong>, 2013</p>]]></content:encoded></item></channel></rss>