<!DOCTYPE html>
<html lang="en">
<head>

    <title>Coffee on the Keyboard</title>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="HandheldFriendly" content="True" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    
    <link rel="preload" as="style" href="https://www.coffeeonthekeyboard.com/assets/built/screen.css?v=2914e678e0" />
    <link rel="preload" as="script" href="https://www.coffeeonthekeyboard.com/assets/built/casper.js?v=2914e678e0" />

    <link rel="stylesheet" type="text/css" href="https://www.coffeeonthekeyboard.com/assets/built/screen.css?v=2914e678e0" />

    <meta name="description" content="James writes stuff about programming, mostly">
    <link rel="canonical" href="https://www.coffeeonthekeyboard.com/">
    <meta name="referrer" content="no-referrer-when-downgrade">
    <link rel="next" href="https://www.coffeeonthekeyboard.com/page/2/">
    
    <meta property="og:site_name" content="Coffee on the Keyboard">
    <meta property="og:type" content="website">
    <meta property="og:title" content="Coffee on the Keyboard">
    <meta property="og:description" content="James writes stuff about programming, mostly">
    <meta property="og:url" content="https://www.coffeeonthekeyboard.com/">
    <meta name="twitter:card" content="summary">
    <meta name="twitter:title" content="Coffee on the Keyboard">
    <meta name="twitter:description" content="James writes stuff about programming, mostly">
    <meta name="twitter:url" content="https://www.coffeeonthekeyboard.com/">
    <meta name="twitter:site" content="@jamessocol">
    
    <script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "WebSite",
    "publisher": {
        "@type": "Organization",
        "name": "Coffee on the Keyboard",
        "url": "https://www.coffeeonthekeyboard.com/",
        "logo": {
            "@type": "ImageObject",
            "url": "https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/2016/01/js-magenta-128.png",
            "width": 60,
            "height": 60
        }
    },
    "url": "https://www.coffeeonthekeyboard.com/",
    "name": "Coffee on the Keyboard",
    "mainEntityOfPage": "https://www.coffeeonthekeyboard.com/",
    "description": "James writes stuff about programming, mostly"
}
    </script>

    <meta name="generator" content="Ghost 6.30">
    <link rel="alternate" type="application/rss+xml" title="Coffee on the Keyboard" href="https://www.coffeeonthekeyboard.com/rss/">
    <script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.68/umd/portal.min.js" data-i18n="true" data-ghost="https://www.coffeeonthekeyboard.com/" data-key="1f736f9889a87d1f7053eb8af7" data-api="https://coffeeonthekeyboard.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script><style id="gh-members-styles">.gh-post-upgrade-cta-content,
.gh-post-upgrade-cta {
    display: flex;
    flex-direction: column;
    align-items: center;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
    text-align: center;
    width: 100%;
    color: #ffffff;
    font-size: 16px;
}

.gh-post-upgrade-cta-content {
    border-radius: 8px;
    padding: 40px 4vw;
}

.gh-post-upgrade-cta h2 {
    color: #ffffff;
    font-size: 28px;
    letter-spacing: -0.2px;
    margin: 0;
    padding: 0;
}

.gh-post-upgrade-cta p {
    margin: 20px 0 0;
    padding: 0;
}

.gh-post-upgrade-cta small {
    font-size: 16px;
    letter-spacing: -0.2px;
}

.gh-post-upgrade-cta a {
    color: #ffffff;
    cursor: pointer;
    font-weight: 500;
    box-shadow: none;
    text-decoration: underline;
}

.gh-post-upgrade-cta a:hover {
    color: #ffffff;
    opacity: 0.8;
    box-shadow: none;
    text-decoration: underline;
}

.gh-post-upgrade-cta a.gh-btn {
    display: block;
    background: #ffffff;
    text-decoration: none;
    margin: 28px 0 0;
    padding: 8px 18px;
    border-radius: 4px;
    font-size: 16px;
    font-weight: 600;
}

.gh-post-upgrade-cta a.gh-btn:hover {
    opacity: 0.92;
}</style>
    <script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="1f736f9889a87d1f7053eb8af7" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://coffeeonthekeyboard.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
    
    <link href="https://www.coffeeonthekeyboard.com/webmentions/receive/" rel="webmention">
    <script defer src="/public/cards.min.js?v=2914e678e0"></script><style>:root {--ghost-accent-color: #15171A;}</style>
    <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=2914e678e0">

</head>
<body class="home-template is-head-left-logo has-cover">
<div class="viewport">

    <header id="gh-head" class="gh-head outer">
        <div class="gh-head-inner inner">
            <div class="gh-head-brand">
                <a class="gh-head-logo" href="https://www.coffeeonthekeyboard.com">
                        <img src="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/2016/01/js-magenta-128.png" alt="Coffee on the Keyboard">
                </a>
                <button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg></button>
                <button class="gh-burger" aria-label="Main Menu"></button>
            </div>

            <nav class="gh-head-menu">
                <ul class="nav">
    <li class="nav-home nav-current"><a href="https://www.coffeeonthekeyboard.com/">Home</a></li>
    <li class="nav-jamessocol-com"><a href="https://jamessocol.com/">jamessocol.com</a></li>
</ul>

            </nav>

            <div class="gh-head-actions">
                    <button class="gh-search gh-icon-btn" aria-label="Search this site" data-ghost-search><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="20" height="20"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg></button>
                    <div class="gh-head-members">
                                <a class="gh-head-link" href="#/portal/signin" data-portal="signin">Sign in</a>
                                <a class="gh-head-button" href="#/portal/signup" data-portal="signup">Subscribe</a>
                    </div>
            </div>
        </div>
    </header>

    <div class="site-content">
        
<div class="site-header-content outer">


        <div class="site-header-inner inner">
                    <img class="site-logo" src="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/2016/01/js-magenta-128.png" alt="Coffee on the Keyboard">
                <p class="site-description">James writes stuff about programming, mostly</p>
        </div>

</div>

<main id="site-main" class="site-main outer">
<div class="inner posts">

    <div class="post-feed">
            
<article class="post-card post tag-continuous-deployment tag-delivery tag-depreciation tag-zero-downtime post-card-large">

    <a class="post-card-image-link" href="/theres-no-such-thing-as-simultaneous/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1741796127172-fde1495823ba?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxzcGVlZCUyMG9mJTIwbGlnaHR8ZW58MHx8fHwxNzc0NzkxNDgwfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1741796127172-fde1495823ba?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxzcGVlZCUyMG9mJTIwbGlnaHR8ZW58MHx8fHwxNzc0NzkxNDgwfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1741796127172-fde1495823ba?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxzcGVlZCUyMG9mJTIwbGlnaHR8ZW58MHx8fHwxNzc0NzkxNDgwfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1741796127172-fde1495823ba?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxzcGVlZCUyMG9mJTIwbGlnaHR8ZW58MHx8fHwxNzc0NzkxNDgwfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1741796127172-fde1495823ba?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEzfHxzcGVlZCUyMG9mJTIwbGlnaHR8ZW58MHx8fHwxNzc0NzkxNDgwfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Digital image, streaks of blue light, reminiscent of the view from a Star Trek ship at warp speed."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/theres-no-such-thing-as-simultaneous/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">continuous deployment</span>
                </div>
                <h2 class="post-card-title">
                    There&#x27;s no such thing as simultaneous
                </h2>
            </header>
                <div class="post-card-excerpt">A thought experiment:

Imagine you have two computers sitting next to each other, about one foot apart, each displaying a clock. The clock has nanosecond precision and you, a superhuman watching two supermonitors, are able to see that the nanoseconds are in sync. As you sit there, looking at the</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2026-03-29">29 Mar 2026</time>
                <span class="post-card-meta-length">4 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post dynamic">

    <a class="post-card-image-link" href="/introducing-spiffe-authz-proxy/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1615130104765-c140bd3c2c45?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fGF1dGhvcml6YXRpb258ZW58MHx8fHwxNzY4OTE3NDQ1fDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1615130104765-c140bd3c2c45?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fGF1dGhvcml6YXRpb258ZW58MHx8fHwxNzY4OTE3NDQ1fDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1615130104765-c140bd3c2c45?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fGF1dGhvcml6YXRpb258ZW58MHx8fHwxNzY4OTE3NDQ1fDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1615130104765-c140bd3c2c45?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fGF1dGhvcml6YXRpb258ZW58MHx8fHwxNzY4OTE3NDQ1fDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1615130104765-c140bd3c2c45?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fGF1dGhvcml6YXRpb258ZW58MHx8fHwxNzY4OTE3NDQ1fDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of a blue sign on a white door saying &quot;Restricted Area; Authorized Personnel Only&quot;"
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/introducing-spiffe-authz-proxy/">
            <header class="post-card-header">
                <div class="post-card-tags">
                </div>
                <h2 class="post-card-title">
                    Introducing SPIFFE AuthZ Proxy
                </h2>
            </header>
                <div class="post-card-excerpt">I made a tool to learn more about the SPIFFE and Spire libraries and APIs. And to make it faster and easier to adopt SPIFFE-based MTLS Authentication (AuthN) and Authorization (AuthZ) into older HTTP server applications, especially those built in languages or frameworks where handling short-lived certificates could be a</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2026-01-20">20 Jan 2026</time>
                <span class="post-card-meta-length">1 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-llm tag-ai tag-genai no-image dynamic">


    <div class="post-card-content">

        <a class="post-card-content-link" href="/llms-are-not-neutral-tools-using-them-harms-people-today/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">llm</span>
                </div>
                <h2 class="post-card-title">
                    LLMs are not neutral tools, using them harms people today
                </h2>
            </header>
                <div class="post-card-excerpt">I realize by saying this publicly I might be putting my own career and future opportunities at risk. I am saying it, anyway, because it is important to say.

I am a vim user. Not even NeoVim, just vim. So I like to think I have a good sense of</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2026-01-15">15 Jan 2026</time>
                <span class="post-card-meta-length">1 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-teams tag-risk tag-product">

    <a class="post-card-image-link" href="/using-risk-taxonomies-to-speed-up-development-and-avoid-churn/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1606503153255-59d8b8b82176?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxyaXNrfGVufDB8fHx8MTc2Njg1NjgzOHww&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1606503153255-59d8b8b82176?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxyaXNrfGVufDB8fHx8MTc2Njg1NjgzOHww&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1606503153255-59d8b8b82176?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxyaXNrfGVufDB8fHx8MTc2Njg1NjgzOHww&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1606503153255-59d8b8b82176?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxyaXNrfGVufDB8fHx8MTc2Njg1NjgzOHww&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1606503153255-59d8b8b82176?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEyfHxyaXNrfGVufDB8fHx8MTc2Njg1NjgzOHww&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Up close / macro photo of the board game Risk with armies on all continents."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/using-risk-taxonomies-to-speed-up-development-and-avoid-churn/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">teams</span>
                </div>
                <h2 class="post-card-title">
                    Using Risk Taxonomies to Speed Up Development and Avoid Churn
                </h2>
            </header>
                <div class="post-card-excerpt">We&#39;ve all been there: the project is nearly complete, there&#39;s a deadline, and someone comes to a status meeting with a problem. A big problem. Something that puts the whole project at risk and means we have to delay, and maybe even rethink our approach.

And</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2026-01-09">09 Jan 2026</time>
                <span class="post-card-meta-length">3 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-design tag-staff tag-mentoring tag-team">

    <a class="post-card-image-link" href="/learn-to-never-have-a-good-idea/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1675266873434-5ba73c38ce6f?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fGZhaWx8ZW58MHx8fHwxNzYwNzAzMzAzfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1675266873434-5ba73c38ce6f?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fGZhaWx8ZW58MHx8fHwxNzYwNzAzMzAzfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1675266873434-5ba73c38ce6f?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fGZhaWx8ZW58MHx8fHwxNzYwNzAzMzAzfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1675266873434-5ba73c38ce6f?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fGZhaWx8ZW58MHx8fHwxNzYwNzAzMzAzfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1675266873434-5ba73c38ce6f?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fGZhaWx8ZW58MHx8fHwxNzYwNzAzMzAzfDA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of a programmer looking at a macbook, head in is hands in frustration"
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/learn-to-never-have-a-good-idea/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">Design</span>
                </div>
                <h2 class="post-card-title">
                    Learn to never have a good idea
                </h2>
            </header>
                <div class="post-card-excerpt">At StaffPlus this week, I was talking with some other senior technology folks about the risks that come with the weight of our opinions (&quot;never think out loud, people will think it&#39;s an actual plan&quot;) and the sense of pressure to get it right when talking</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2025-10-18">18 Oct 2025</time>
                <span class="post-card-meta-length">1 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-leadership tag-safety tag-teams tag-seniority">

    <a class="post-card-image-link" href="/discomfort-needs-safety/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1580115465903-0e4a824a4e9a?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNhZmV0eXxlbnwwfHx8fDE3NTU4NjgwMjF8MA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1580115465903-0e4a824a4e9a?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNhZmV0eXxlbnwwfHx8fDE3NTU4NjgwMjF8MA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1580115465903-0e4a824a4e9a?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNhZmV0eXxlbnwwfHx8fDE3NTU4NjgwMjF8MA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1580115465903-0e4a824a4e9a?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNhZmV0eXxlbnwwfHx8fDE3NTU4NjgwMjF8MA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1580115465903-0e4a824a4e9a?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDR8fHNhZmV0eXxlbnwwfHx8fDE3NTU4NjgwMjF8MA&amp;ixlib&#x3D;rb-4.1.0&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of an inverted red cross and heart symbol on a white-painted metal plate."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/discomfort-needs-safety/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">leadership</span>
                </div>
                <h2 class="post-card-title">
                    Discomfort Needs Safety
                </h2>
            </header>
                <div class="post-card-excerpt">Growth requires discomfort. Whether that&#39;s growing pains as a child, or uncomfortable conversations and feedback, we have to confront and address an existing, comfortable reality, and explore something beyond it. By definition, going out of our comfort zone is, well, uncomfortable. So if you want growth, you need</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2025-08-22">22 Aug 2025</time>
                <span class="post-card-meta-length">2 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-architecture tag-code tag-design tag-future-proofing tag-zero-cost">

    <a class="post-card-image-link" href="/zero-cost-future-proofing-meaningful-namespaces/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1577538928305-3807c3993047?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNhbGV8ZW58MHx8fHwxNzQxNTUwOTU1fDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1577538928305-3807c3993047?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNhbGV8ZW58MHx8fHwxNzQxNTUwOTU1fDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1577538928305-3807c3993047?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNhbGV8ZW58MHx8fHwxNzQxNTUwOTU1fDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1577538928305-3807c3993047?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNhbGV8ZW58MHx8fHwxNzQxNTUwOTU1fDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1577538928305-3807c3993047?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNhbGV8ZW58MHx8fHwxNzQxNTUwOTU1fDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of metal letters on a shelf with neon lights inside spelling out &quot;SALE&quot;"
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/zero-cost-future-proofing-meaningful-namespaces/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">architecture</span>
                </div>
                <h2 class="post-card-title">
                    Zero-cost Future Proofing: Meaningful Namespaces
                </h2>
            </header>
                <div class="post-card-excerpt">Sandi Metz famously said &quot;duplication is far cheaper than the wrong abstraction,&quot; and my experience has been that following that advice has usually worked out well. You can&#39;t future-proof well until you know what you need to future-proof against. A trade-off that makes thing A easier</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2025-05-09">09 May 2025</time>
                <span class="post-card-meta-length">3 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-impact tag-seniority tag-communication tag-goals">

    <a class="post-card-image-link" href="/have-impact-by-doing-the-right-work/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1622880838130-cce9f7080107?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHNlZXNhd3xlbnwwfHx8fDE3Mzc5MDMyNDJ8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1622880838130-cce9f7080107?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHNlZXNhd3xlbnwwfHx8fDE3Mzc5MDMyNDJ8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1622880838130-cce9f7080107?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHNlZXNhd3xlbnwwfHx8fDE3Mzc5MDMyNDJ8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1622880838130-cce9f7080107?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHNlZXNhd3xlbnwwfHx8fDE3Mzc5MDMyNDJ8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1622880838130-cce9f7080107?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHNlZXNhd3xlbnwwfHx8fDE3Mzc5MDMyNDJ8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of a statue of a see-saw installed in a park. The riders&#x27; sizes are comically different."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/have-impact-by-doing-the-right-work/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">impact</span>
                </div>
                <h2 class="post-card-title">
                    Have More Impact by Doing the Right Work
                </h2>
            </header>
                <div class="post-card-excerpt">Writing code—no matter how much, how fast, or how challenging—is not the same thing as having impact on a business.

As engineers, we&#39;re rarely taught how to think about and describe the work we do in terms of its impact or effects. We&#39;re left</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2025-01-27">27 Jan 2025</time>
                <span class="post-card-meta-length">5 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-architecture tag-layers tag-principles">

    <a class="post-card-image-link" href="/data-sinks-and-logic-floats/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1718214709541-f67a46021cdf?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0cmF0YXxlbnwwfHx8fDE3Mjc5MzMzNjl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1718214709541-f67a46021cdf?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0cmF0YXxlbnwwfHx8fDE3Mjc5MzMzNjl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1718214709541-f67a46021cdf?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0cmF0YXxlbnwwfHx8fDE3Mjc5MzMzNjl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1718214709541-f67a46021cdf?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0cmF0YXxlbnwwfHx8fDE3Mjc5MzMzNjl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1718214709541-f67a46021cdf?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDh8fHN0cmF0YXxlbnwwfHx8fDE3Mjc5MzMzNjl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of mountains showing rock strata."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/data-sinks-and-logic-floats/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">architecture</span>
                </div>
                <h2 class="post-card-title">
                    Data Sinks and Logic Floats
                </h2>
            </header>
                <div class="post-card-excerpt">In effective layered architectures, data sinks to the bottom, and logic floats to the top. The more narrowly-scoped the logic, the higher it floats. The more permanent the data, the deeper it sinks.</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2024-10-03">03 Oct 2024</time>
                <span class="post-card-meta-length">3 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-safety-ii tag-human-factors tag-ergonomics">

    <a class="post-card-image-link" href="/advanced-blamelessness-is-owning-mistakes-without-fear/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1617791160536-598cf32026fb?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxnYWxheHklMjBicmFpbnxlbnwwfHx8fDE3MTk2ODI4NjV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1617791160536-598cf32026fb?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxnYWxheHklMjBicmFpbnxlbnwwfHx8fDE3MTk2ODI4NjV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1617791160536-598cf32026fb?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxnYWxheHklMjBicmFpbnxlbnwwfHx8fDE3MTk2ODI4NjV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1617791160536-598cf32026fb?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxnYWxheHklMjBicmFpbnxlbnwwfHx8fDE3MTk2ODI4NjV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1617791160536-598cf32026fb?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDE2fHxnYWxheHklMjBicmFpbnxlbnwwfHx8fDE3MTk2ODI4NjV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="3D rendered image of a brain in bisexual lighting."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/advanced-blamelessness-is-owning-mistakes-without-fear/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">safety-ii</span>
                </div>
                <h2 class="post-card-title">
                    Advanced Blamelessness is Owning Mistakes without Fear
                </h2>
            </header>
                <div class="post-card-excerpt">Blame happens when we stop our investigation with operator error.

Then James restarted the server, which broke everything.

The first step towards a blameless culture is to stop blaming people for things going wrong. (Assuming no malicious actors.)

Then I restarted the server, which I should&#39;ve known was</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2024-06-30">30 Jun 2024</time>
                <span class="post-card-meta-length">1 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-culture tag-communication">

    <a class="post-card-image-link" href="/what-do-you-mean-by-bad-software/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1617440168937-c6497eaa8db5?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhZHxlbnwwfHx8fDE3MTk2NzQ4Nzd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1617440168937-c6497eaa8db5?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhZHxlbnwwfHx8fDE3MTk2NzQ4Nzd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1617440168937-c6497eaa8db5?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhZHxlbnwwfHx8fDE3MTk2NzQ4Nzd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1617440168937-c6497eaa8db5?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhZHxlbnwwfHx8fDE3MTk2NzQ4Nzd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1617440168937-c6497eaa8db5?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGJhZHxlbnwwfHx8fDE3MTk2NzQ4Nzd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of 3 brown eggs in a carton with faces drawn on. One sad, one disapproving, one in the back laughing."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/what-do-you-mean-by-bad-software/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">culture</span>
                </div>
                <h2 class="post-card-title">
                    What do you mean by &quot;bad&quot; software?
                </h2>
            </header>
                <div class="post-card-excerpt">(Before I get started, a moment to appreciate this header image and whatever was the genesis of it.)

Engineers will often describe software as &quot;bad&quot;—often with words like &quot;terrible&quot; or &quot;shitty.&quot; This invective is hurled at languages like PHP and JavaScript, at frameworks</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2024-06-29">29 Jun 2024</time>
                <span class="post-card-meta-length">2 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-teams tag-remote tag-distributed tag-kitchens">

    <a class="post-card-image-link" href="/distributed-teams-need-face-time/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1522071820081-009f0129c71c?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlYW18ZW58MHx8fHwxNzExNTY2NDczfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1522071820081-009f0129c71c?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlYW18ZW58MHx8fHwxNzExNTY2NDczfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1522071820081-009f0129c71c?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlYW18ZW58MHx8fHwxNzExNTY2NDczfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1522071820081-009f0129c71c?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlYW18ZW58MHx8fHwxNzExNTY2NDczfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1522071820081-009f0129c71c?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDN8fHRlYW18ZW58MHx8fHwxNzExNTY2NDczfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of five people sitting around a table with laptops. Some have headphones."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/distributed-teams-need-face-time/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">teams</span>
                </div>
                <h2 class="post-card-title">
                    Distributed Teams Need Face Time
                </h2>
            </header>
                <div class="post-card-excerpt">There&#39;s a genre of post I&#39;ve seen on LinkedIn and the fediverse recently that goes something like &quot;I worked with people in person again and forgot how great it felt!&quot; In the warming discourse about remote work and Return To Office (RTO) policies, I</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2024-03-28">28 Mar 2024</time>
                <span class="post-card-meta-length">5 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-ip tag-intellectual-property">

    <a class="post-card-image-link" href="/theres-a-difference-between-publicly-available-and-free/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1596405367208-63505402f113?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEwfHx0ZWxldmlzaW9ufGVufDB8fHx8MTcxMTQ4NjQyMnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1596405367208-63505402f113?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEwfHx0ZWxldmlzaW9ufGVufDB8fHx8MTcxMTQ4NjQyMnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1596405367208-63505402f113?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEwfHx0ZWxldmlzaW9ufGVufDB8fHx8MTcxMTQ4NjQyMnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1596405367208-63505402f113?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEwfHx0ZWxldmlzaW9ufGVufDB8fHx8MTcxMTQ4NjQyMnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1596405367208-63505402f113?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDEwfHx0ZWxldmlzaW9ufGVufDB8fHx8MTcxMTQ4NjQyMnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of an old TV (rabbit ears, channel knobs, etc) with a grainy black-and-white image on the screen."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/theres-a-difference-between-publicly-available-and-free/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">ip</span>
                </div>
                <h2 class="post-card-title">
                    There&#x27;s a Difference between &quot;Publicly Available&quot; and &quot;Free as in Speech&quot;
                </h2>
            </header>
                <div class="post-card-excerpt">A couple weeks ago, the Wall Street Journal published 10-minute interview with Mira Murati, CTO of OpenAI, in which Murati said that their new &quot;Sora&quot; video generator model was trained on &quot;publicly available or licensed data&quot; (emphasis added by Ed Zitron). Ed wrote a longer piece</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2024-03-26">26 Mar 2024</time>
                <span class="post-card-meta-length">6 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-stuff-i-read no-image">


    <div class="post-card-content">

        <a class="post-card-content-link" href="/stuff-ive-read-march-1-2024/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">stuff i read</span>
                </div>
                <h2 class="post-card-title">
                    Stuff I&#x27;ve Been Reading - March 1, 2024
                </h2>
            </header>
                <div class="post-card-excerpt">This is a collection of some of the articles, blog posts, podcasts, etc, that I&#39;ve read in the past couple of weeks. I&#39;m hoping to make this more of a weekly post on Fridays. We&#39;ll see!

I&#39;m immediately going to break the</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2024-03-01">01 Mar 2024</time>
                <span class="post-card-meta-length">1 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-planning tag-tech-debt tag-depreciation tag-sustaining-engineering">

    <a class="post-card-image-link" href="/debt-depreciation-and-sustaining-engineering-work/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1580894908361-967195033215?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI5fHxlbmdpbmVlcmluZ3xlbnwwfHx8fDE2OTk5NzIxNDl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1580894908361-967195033215?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI5fHxlbmdpbmVlcmluZ3xlbnwwfHx8fDE2OTk5NzIxNDl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1580894908361-967195033215?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI5fHxlbmdpbmVlcmluZ3xlbnwwfHx8fDE2OTk5NzIxNDl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1580894908361-967195033215?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI5fHxlbmdpbmVlcmluZ3xlbnwwfHx8fDE2OTk5NzIxNDl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1580894908361-967195033215?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI5fHxlbmdpbmVlcmluZ3xlbnwwfHx8fDE2OTk5NzIxNDl8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="A software engineer, right, looking at a 3-monitor setup while working."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/debt-depreciation-and-sustaining-engineering-work/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">planning</span>
                </div>
                <h2 class="post-card-title">
                    Debt, Depreciation, and Sustaining Engineering Work
                </h2>
            </header>
                <div class="post-card-excerpt">Calling rearchitecture &quot;tech debt&quot; is a dangerous lie: it misrepresents the level of effort and retroactively makes our decisions into mistakes.</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-11-14">14 Nov 2023</time>
                <span class="post-card-meta-length">4 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-architecture tag-refactoring tag-service">

    <a class="post-card-image-link" href="/starring-our-monolith-in-the-role-of/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1566206715730-07f09ba183c8?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25vbGl0aHxlbnwwfHx8fDE2OTg2ODQwNDd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1566206715730-07f09ba183c8?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25vbGl0aHxlbnwwfHx8fDE2OTg2ODQwNDd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1566206715730-07f09ba183c8?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25vbGl0aHxlbnwwfHx8fDE2OTg2ODQwNDd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1566206715730-07f09ba183c8?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25vbGl0aHxlbnwwfHx8fDE2OTg2ODQwNDd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1566206715730-07f09ba183c8?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI4fHxtb25vbGl0aHxlbnwwfHx8fDE2OTg2ODQwNDd8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Top-down photograph of a large, thin rock at the seashore casting a long shadow."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/starring-our-monolith-in-the-role-of/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">architecture</span>
                </div>
                <h2 class="post-card-title">
                    Starring our Monolith in the Role of...
                </h2>
            </header>
                <div class="post-card-excerpt">Stop me if you&#39;ve heard this one before.

As a small, early stage start-up, we built an application in [Rails / Django / Express / Gin] because we were able to lean on the framework and ecosystem for a lot of the boring stuff, and focus on our unique value. Now,</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-11-04">04 Nov 2023</time>
                <span class="post-card-meta-length">8 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-code tag-refactoring tag-api tag-design tag-continuous-deployment tag-three-legged">

    <a class="post-card-image-link" href="/using-api-boundaries-to-prepare-for-change/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1585665108443-3c7ab04a2810?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxjbG9zZWQlMjBwYXRofGVufDB8fHx8MTY5NjUyMzY2Nnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1585665108443-3c7ab04a2810?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxjbG9zZWQlMjBwYXRofGVufDB8fHx8MTY5NjUyMzY2Nnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1585665108443-3c7ab04a2810?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxjbG9zZWQlMjBwYXRofGVufDB8fHx8MTY5NjUyMzY2Nnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1585665108443-3c7ab04a2810?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxjbG9zZWQlMjBwYXRofGVufDB8fHx8MTY5NjUyMzY2Nnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1585665108443-3c7ab04a2810?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDI1fHxjbG9zZWQlMjBwYXRofGVufDB8fHx8MTY5NjUyMzY2Nnww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of a path to an ocean beach with a temporary barrier that says &quot;beach closed&quot;"
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/using-api-boundaries-to-prepare-for-change/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">Code</span>
                </div>
                <h2 class="post-card-title">
                    Introducing API Boundaries to Prepare for Bigger Changes
                </h2>
            </header>
                <div class="post-card-excerpt">Alternatively: API Boundaries for Fun and Profit

I routinely misquote Kent Beck, who said &quot;for each desired change, make the change easy (warning: this may be hard), then make the easy change.&quot; He said this on Twitter (RIP) so I won&#39;t be linking to it, but</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-10-23">23 Oct 2023</time>
                <span class="post-card-meta-length">13 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-continuous-deployment tag-programming tag-feature-flags tag-testing tag-quality">

    <a class="post-card-image-link" href="/feature-flag-when-you-are-not-confident/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1636300958911-f7f84151f998?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBhcGVsJTIwcGljYWRvfGVufDB8fHx8MTY5MzkyNTU0N3ww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1636300958911-f7f84151f998?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBhcGVsJTIwcGljYWRvfGVufDB8fHx8MTY5MzkyNTU0N3ww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1636300958911-f7f84151f998?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBhcGVsJTIwcGljYWRvfGVufDB8fHx8MTY5MzkyNTU0N3ww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1636300958911-f7f84151f998?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBhcGVsJTIwcGljYWRvfGVufDB8fHx8MTY5MzkyNTU0N3ww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1636300958911-f7f84151f998?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDF8fHBhcGVsJTIwcGljYWRvfGVufDB8fHx8MTY5MzkyNTU0N3ww&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of colorful papel picado banners strung between two buildings with a partly cloudy sky behind."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/feature-flag-when-you-are-not-confident/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">continuous deployment</span>
                </div>
                <h2 class="post-card-title">
                    When to use Feature Flags:  Extra-Ordinary Unconfidence
                </h2>
            </header>
                <div class="post-card-excerpt">Feature flags are a sine qua non for effective Continuous Deployment (CD)—and yet, they aren&#39;t always necessary. Nearly every sprint I&#39;ve observed for the past 10 years has included the question &quot;should this be feature-flagged?&quot; at least once. Such a common question deserves</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-10-05">05 Oct 2023</time>
                <span class="post-card-meta-length">5 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-code tag-documentation tag-team tag-encapsulation tag-libraries tag-api tag-interface">

    <a class="post-card-image-link" href="/code-is-knowledge/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1580894732930-0babd100d356?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDV8fHRlYWNoZXJ8ZW58MHx8fHwxNjk2MjU1NzAzfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1580894732930-0babd100d356?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDV8fHRlYWNoZXJ8ZW58MHx8fHwxNjk2MjU1NzAzfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1580894732930-0babd100d356?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDV8fHRlYWNoZXJ8ZW58MHx8fHwxNjk2MjU1NzAzfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1580894732930-0babd100d356?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDV8fHRlYWNoZXJ8ZW58MHx8fHwxNjk2MjU1NzAzfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1580894732930-0babd100d356?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDV8fHRlYWNoZXJ8ZW58MHx8fHwxNjk2MjU1NzAzfDA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Photo of a woman who has drawn on a whiteboard speaking to another woman, foreground, facing away from the camera."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/code-is-knowledge/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">Code</span>
                </div>
                <h2 class="post-card-title">
                    Code is Knowledge
                </h2>
            </header>
                <div class="post-card-excerpt">In the mid-2000s (so, in ancient history) a friend of mine went to an interview at a big tech company and was asked to write the JPEG compression algorithm on a whiteboard. He didn&#39;t know that algorithm off the top of his head, which he admitted, and then</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-10-02">02 Oct 2023</time>
                <span class="post-card-meta-length">8 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-programming tag-learning tag-time tag-code">

    <a class="post-card-image-link" href="/using-timers-to-learn/">

        <img class="post-card-image"
            srcset="https://images.unsplash.com/photo-1431499012454-31a9601150c9?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHN0b3B3YXRjaHxlbnwwfHx8fDE2OTQxMDExODV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;300 300w,
                    https://images.unsplash.com/photo-1431499012454-31a9601150c9?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHN0b3B3YXRjaHxlbnwwfHx8fDE2OTQxMDExODV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600 600w,
                    https://images.unsplash.com/photo-1431499012454-31a9601150c9?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHN0b3B3YXRjaHxlbnwwfHx8fDE2OTQxMDExODV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;1000 1000w,
                    https://images.unsplash.com/photo-1431499012454-31a9601150c9?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHN0b3B3YXRjaHxlbnwwfHx8fDE2OTQxMDExODV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;2000 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://images.unsplash.com/photo-1431499012454-31a9601150c9?crop&#x3D;entropy&amp;cs&#x3D;tinysrgb&amp;fit&#x3D;max&amp;fm&#x3D;jpg&amp;ixid&#x3D;M3wxMTc3M3wwfDF8c2VhcmNofDJ8fHN0b3B3YXRjaHxlbnwwfHx8fDE2OTQxMDExODV8MA&amp;ixlib&#x3D;rb-4.0.3&amp;q&#x3D;80&amp;w&#x3D;600"
            alt="Using Timers to Learn"
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/using-timers-to-learn/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">programming</span>
                </div>
                <h2 class="post-card-title">
                    Using Timers to Learn
                </h2>
            </header>
                <div class="post-card-excerpt">When I&#39;m trying to learn a new language or environment, one of the first things that I try to do is implement a timer: code that can be used to instrument other code and print out how long it took to run.


A long time ago, early on</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-09-07">07 Sep 2023</time>
                <span class="post-card-meta-length">5 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-go tag-programming tag-interface tag-di tag-code tag-testing no-image">


    <div class="post-card-content">

        <a class="post-card-content-link" href="/go-interfaces-as-requirements-not-capabilities/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">go</span>
                </div>
                <h2 class="post-card-title">
                    Go Interfaces as Requirements, not Capabilities
                </h2>
            </header>
                <div class="post-card-excerpt">This is a hard-won lesson that&#39;s taken me many years to learn, and I have seen others follow a similar path, so I&#39;m writing it down in hopes that maybe some people will find a shortcut.

Go&#39;s type system is, in my experience, fairly</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-08-31">31 Aug 2023</time>
                <span class="post-card-meta-length">4 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-design tag-code tag-changes tag-continuous-deployment tag-three-legged">

    <a class="post-card-image-link" href="/changing-the-meaning-breaking-semantic-changes/">

        <img class="post-card-image"
            srcset="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w300/2023/08/dictionary.jpg 300w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/dictionary.jpg 600w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w1000/2023/08/dictionary.jpg 1000w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w2000/2023/08/dictionary.jpg 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/dictionary.jpg"
            alt="A zoomed out photo of a dictionary open to a random page. The text is mostly blurred."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/changing-the-meaning-breaking-semantic-changes/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">Design</span>
                </div>
                <h2 class="post-card-title">
                    Changing the Meaning: Breaking Semantic Changes
                </h2>
            </header>
                <div class="post-card-excerpt">The subtlest kind of breaking change is the kind that doesn&#39;t affect a value&#39;s type but instead affects what that value means. These changes can be hard to notice when you&#39;re making them, and even harder to debug when they happen. They can lead</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-08-29">29 Aug 2023</time>
                <span class="post-card-meta-length">8 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-design tag-projects tag-planning tag-teams tag-continuous-deployment">

    <a class="post-card-image-link" href="/three-models-of-value/">

        <img class="post-card-image"
            srcset="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w300/2023/08/graphs-all.png 300w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/graphs-all.png 600w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w1000/2023/08/graphs-all.png 1000w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w2000/2023/08/graphs-all.png 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/graphs-all.png"
            alt="A graph in the positive quadrant showing y&#x3D;x, y&#x3D;x^p where p&gt;1, and y&#x3D;x^p where p&lt;1."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/three-models-of-value/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">Design</span>
                </div>
                <h2 class="post-card-title">
                    Three Models of Value
                </h2>
            </header>
                <div class="post-card-excerpt">In product development, we often think of &quot;value&quot; in large, discrete units: the value of project A vs project B; the value of a feature; the value of a refactor or architecture change. When we&#39;re deploying continuously, we have an opportunity to replace this mental model</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-08-28">28 Aug 2023</time>
                <span class="post-card-meta-length">6 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-database tag-code tag-design tag-constraints">

    <a class="post-card-image-link" href="/constrain-your-data-access/">

        <img class="post-card-image"
            srcset="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w300/2023/08/rails.jpg 300w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/rails.jpg 600w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w1000/2023/08/rails.jpg 1000w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w2000/2023/08/rails.jpg 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/rails.jpg"
            alt="A photo of railway tracks."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/constrain-your-data-access/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">Database</span>
                </div>
                <h2 class="post-card-title">
                    Constrain Your Data Access for Fun and Scale
                </h2>
            </header>
                <div class="post-card-excerpt">ActiveRecord-style ORMs can be huge time-savers, but also blur boundaries within a system, which leads to bad assumptions and habits</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-08-23">23 Aug 2023</time>
                <span class="post-card-meta-length">6 min read</span>
        </footer>

    </div>

</article>
            
<article class="post-card post tag-data tag-database tag-models tag-design tag-planning">

    <a class="post-card-image-link" href="/conceptual-logical-and-physical-data-models/">

        <img class="post-card-image"
            srcset="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w300/2023/08/boxes-and-arrows.jpg 300w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/boxes-and-arrows.jpg 600w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w1000/2023/08/boxes-and-arrows.jpg 1000w,
                    https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w2000/2023/08/boxes-and-arrows.jpg 2000w"
            sizes="(max-width: 1000px) 400px, 800px"
            src="https://storage.ghost.io/c/54/2d/542d598c-5727-4e42-ae0f-196cbcfa777d/content/images/size/w600/2023/08/boxes-and-arrows.jpg"
            alt="A finger pointing to one of several empty boxes in a diagram on a chalk board."
            loading="lazy"
        />


    </a>

    <div class="post-card-content">

        <a class="post-card-content-link" href="/conceptual-logical-and-physical-data-models/">
            <header class="post-card-header">
                <div class="post-card-tags">
                        <span class="post-card-primary-tag">data</span>
                </div>
                <h2 class="post-card-title">
                    Conceptual, Logical and Physical Data Models
                </h2>
            </header>
                <div class="post-card-excerpt">Conceptual, logical, and physical data models has proven to be one of the most valuable things I&#39;ve learned recently</div>
        </a>

        <footer class="post-card-meta">
            <time class="post-card-meta-date" datetime="2023-08-21">21 Aug 2023</time>
                <span class="post-card-meta-length">5 min read</span>
        </footer>

    </div>

</article>
    </div>

    <nav class="pagination">
    <span class="page-number">Page 1 of 11</span>
        <a class="older-posts" href="/page/2/">Older Posts <span aria-hidden="true">&rarr;</span></a>
</nav>


</div>
</main>

    </div>

    <footer class="site-footer outer">
        <div class="inner">
            <section class="copyright"><a href="https://www.coffeeonthekeyboard.com">Coffee on the Keyboard</a> &copy; 2026</section>
            <nav class="site-footer-nav">
                
            </nav>
            <div class="gh-powered-by"><a href="https://ghost.org/" target="_blank" rel="noopener">Powered by Ghost</a></div>
        </div>
    </footer>

</div>


<script
    src="https://code.jquery.com/jquery-3.5.1.min.js"
    integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
    crossorigin="anonymous">
</script>
<script src="https://www.coffeeonthekeyboard.com/assets/built/casper.js?v=2914e678e0"></script>
<script>
$(document).ready(function () {
    // Mobile Menu Trigger
    $('.gh-burger').click(function () {
        $('body').toggleClass('gh-head-open');
    });
    // FitVids - Makes video embeds responsive
    $(".gh-content").fitVids();
});
</script>



</body>
</html>
