<?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[Weekend Engineering]]></title><description><![CDATA[My struggle, your reading]]></description><link>https://blog.alaindichiappari.dev</link><image><url>https://blog.alaindichiappari.dev/img/substack.png</url><title>Weekend Engineering</title><link>https://blog.alaindichiappari.dev</link></image><generator>Substack</generator><lastBuildDate>Sat, 09 May 2026 10:07:34 GMT</lastBuildDate><atom:link href="https://blog.alaindichiappari.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Weekend Engineering]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[weekendengineering@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[weekendengineering@substack.com]]></itunes:email><itunes:name><![CDATA[Alain Di Chiappari]]></itunes:name></itunes:owner><itunes:author><![CDATA[Alain Di Chiappari]]></itunes:author><googleplay:owner><![CDATA[weekendengineering@substack.com]]></googleplay:owner><googleplay:email><![CDATA[weekendengineering@substack.com]]></googleplay:email><googleplay:author><![CDATA[Alain Di Chiappari]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Everything must be high-value added work. But.]]></title><description><![CDATA[I used to have very long sessions of focused, uninterrupted &#8220;work&#8221;.]]></description><link>https://blog.alaindichiappari.dev/p/everything-must-be-high-value-added</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/everything-must-be-high-value-added</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sun, 05 Apr 2026 06:56:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MeVe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F08c78fee-254a-48cc-8c89-93b7faf14205_680x544.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I used to have very long sessions of focused, uninterrupted &#8220;work&#8221;. Programming mostly, but not necessarily, I have always thought that with enough time and effort I can get passionate about (almost) anything, and it happened many times; I still happen to have quite deep knowledge about some topics for absolutely no apparent reason out of pure curiosity or self-induced rabbit hole state.</p><p>I remember early morning becoming afternoons and early nights with the least amount of breaks for physiological needs.</p><p>My entire setup is still meant for and built around that meditative state, and keeps evolving upon these roots. (N)Vim, tmux, carefully tweaked keymaps and configurations, (recently introduced) split keyboard layers. Everything is in place for a specific reason: delegate as much as possible to the ancestral parts of my brain dedicated to muscle memory and coordination so I can focus on the singular thing I&#8217;m doing.</p><p>But something is dramatically changing, everywhere. And despite part of it is self-induced, most of it is more and more structural in how we work and socially evolving.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4GXs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4GXs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 424w, https://substackcdn.com/image/fetch/$s_!4GXs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 848w, https://substackcdn.com/image/fetch/$s_!4GXs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!4GXs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4GXs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png" width="1186" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1186,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:206030,&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.alaindichiappari.dev/i/193233229?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.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_!4GXs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 424w, https://substackcdn.com/image/fetch/$s_!4GXs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 848w, https://substackcdn.com/image/fetch/$s_!4GXs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!4GXs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a6498aa-bad2-4b00-8739-7ca1f4a79e68_1186x1080.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>I remember how my work, and my free time, was flowing in that sense. I had waves of focus, creativity, chaos, concern, release; all of these emotional states work well together in a work session when they dynamically balance each other to produce an artifact, a thought, a brilliant new assumption you were previously ignoring, or whatever else. Truly mastering these emotions is also part of the ability of a skilled worker, in any field. Mastering fear and worry for a professional climber IS part of their skills. Mastering the stress coming from a <a href="https://en.wikipedia.org/wiki/Heisenbug">Heisenbug</a> isn&#8217;t different, the more mature you are as a software engineer, the more you know how to deal with your time, including breaks and, in general, the rest of your work and life to sustain it long-term.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CJPN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CJPN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 424w, https://substackcdn.com/image/fetch/$s_!CJPN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 848w, https://substackcdn.com/image/fetch/$s_!CJPN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 1272w, https://substackcdn.com/image/fetch/$s_!CJPN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CJPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp" width="460" height="436.51408450704224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:539,&quot;width&quot;:568,&quot;resizeWidth&quot;:460,&quot;bytes&quot;:18330,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.alaindichiappari.dev/i/193233229?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CJPN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 424w, https://substackcdn.com/image/fetch/$s_!CJPN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 848w, https://substackcdn.com/image/fetch/$s_!CJPN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 1272w, https://substackcdn.com/image/fetch/$s_!CJPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca16d238-bac5-45b2-a1fa-bd655a7372f4_568x539.webp 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><p>I&#8217;ve recently started questioning if the way we&#8217;ve been working since the most powerful AI models came out is compatible with the <em>standard</em> working models. I&#8217;m not just talking about software engineering, it wouldn&#8217;t make much sense. Our profession, especially now, is getting closer and closer to other knowledge worker who solve problem at a higher level and their work is getting impacted in a similar fashion.</p><p>I have myself noticed with surprise how much of the low added-value work I got rid of. And I&#8217;m happy about it when it is really low-value; for the same reason I love vim macros: there&#8217;s no reason you should manually format in the same way one thousands lines of text if you can automate it.</p><p>What is happening here is different though, these are roughly the stages we&#8217;ve seen (so far). I&#8217;ll be using software but other fields can relate:</p><p>1. Write your code, AI is going to help you autocompleting a few things, boilerplating and suggesting additions or changes.</p><p>2. Write most of your code, take the critical parts of it and ask AI in the browser for suggestions, tests, validation and brainstorm with it. You can brainstorm with AI at any point of the flow, before, during, after.</p><p>3. Chat in your editor of choice with AI, it produce part/most of the code, depending on your trust and confidence. You (probably) review it and accept/discard the changes.</p><p>4. Spin an agent that does most of the work for you, you follow along (maybe), review and accept/discard/iterate over it.</p><p>5. Loop an agent over specifications of what you need, leave it more or less privileges to do anything it needs, depending on how much you segregated the environment or you trust humanity and their ability to prompt-inject you out of existence.</p><p>6. Orchestrate swarms of skilled agents to do the work you asked them to do, pretending you review the code. Ship it straight to production, your company is happy until they get hacked because of the many critical vulnerabilities &#8220;you&#8221; have introduced.</p><p>While all of this is happening in the background, you answer people on slack (or configure an agent to prepare and send you reports with summaries and answer for you to the less critical ones), skim-read a couple of important document you want to have an idea about, support a colleague with a critical bug on the pipelines, and do a back-and-forth on the Gemini and Claude browser sessions about the new project you&#8217;re leading for the next quarter.</p><p>&#8220;All and only the most high value-added work will remain for you&#8221; they said.</p><p>The problem is that the ups and (forced) downs I used to have were vital, especially the downs, the moment you relax some parts of the brain and focus yourself in creating your craft, in forming an idea, in shaping a diagram. They were vital for my brain to better process information, to give it space to clean up garbage and to be creative <em>incidentally</em>.</p><p>It wasn&#8217;t vital for my mental health for the sake of it: who cares? You should care for sure, but companies don&#8217;t usually work that way. Mental health is a concern for them if the byproducts and outcomes of a degrading worker&#8217;s creativity produces measurable damage, especially if the worker is hard or expensive to replace. Frameworks, procedures, anti-silos initiatives, bus-factor reducing policies are in place just for that.</p><p>Companies, in my opinion, should selfishly start thinking about this. When technology increases productivity through increasing the output it is beneficial for everyone IF AND ONLY IF the output is deterministically stable and its verification is either trivial or increases less than the output itself.</p><p>But this is not happening. The fundamentally, and by design, indeterministic nature of AI models is clearly what&#8217;s needed for them to be brilliant and able to do incredible things fast. But it&#8217;s also the condemn they gifted us along with it. We (still) don&#8217;t have the privilege to have huge output with minimal verification. Automated tests are not guardrails, if tests are all written by AI. LLM-as-a-Judge is not a guardrail as it brings with it non-determinism as a feature.</p><p>I think we&#8217;ll soon need to interrogate ourselves, as individuals first, and society later. What&#8217;s the trade-off we want to accept: low quality with high output or high quality, less output and more sustainability work?</p>]]></content:encoded></item><item><title><![CDATA[Convincing Is Not Persuading]]></title><description><![CDATA[Many engineers (me included) I met have a drawer full of proposals that never went anywhere.]]></description><link>https://blog.alaindichiappari.dev/p/convincing-is-not-persuading</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/convincing-is-not-persuading</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sun, 22 Mar 2026 07:18:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Rw6r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many engineers (me included) I met have a drawer full of proposals that never went anywhere. Technically airtight. Benchmarked. Diagrammed. Presented to a room of intelligent people who nodded politely and went a different direction.</p><p>You walk away muttering the same thing every technically correct person has muttered since the beginning of organized work: &#8220;They just don&#8217;t get it&#8221;.</p><p>They got it. They just weren&#8217;t moved.</p><h2>Convincing vs Persuading</h2><p>Perelman spent decades dismantling this blind spot. In his <em>The new rhetoric: a treatise on argumentation</em>, he drew a line that most of the intellectual tradition had been smudging since Descartes: the line between <em>convincing</em> and <em>persuading</em>.</p><p>Convincing is an operation on logic. You assemble premises, you chain them together with valid inferences, and you arrive at a conclusion that any rational agent should accept. The target is what he called the &#8220;universal audience&#8221;, an idealized audience of every reasonable mind that ever existed or could exist. If your argument is valid, it should work on all of them. A mathematical proof convinces. A benchmark convinces. A failing test suite convinces.</p><p>Persuading is a different animal entirely. Persuading targets a <em>particular</em> audience: these people, in this room, with these fears, these incentives, these memories of the last migration that went sideways. Persuading doesn&#8217;t ask &#8220;is this logically sound?&#8221;. It asks &#8220;will this move <em>them</em> to act?&#8221;.</p><p>Convincing addresses reason. Persuading addresses the full human. And the gap between the two is where most technical proposals go to die.</p><p>You can convince every person in the room that your microservices architecture is superior to the monolith. You can lay the evidence flat on the table like a surgeon displaying X-rays. And they will still vote for the monolith, because the last team that attempted a migration was disbanded, because the VP of Engineering ships their bonus on a Q3 deadline, because the tech lead built the monolith and his pride is load-bearing infrastructure.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rw6r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rw6r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 424w, https://substackcdn.com/image/fetch/$s_!Rw6r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 848w, https://substackcdn.com/image/fetch/$s_!Rw6r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 1272w, https://substackcdn.com/image/fetch/$s_!Rw6r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rw6r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp" width="1456" height="997" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:997,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:798978,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.alaindichiappari.dev/i/191733344?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rw6r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 424w, https://substackcdn.com/image/fetch/$s_!Rw6r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 848w, https://substackcdn.com/image/fetch/$s_!Rw6r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 1272w, https://substackcdn.com/image/fetch/$s_!Rw6r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ddf511-ce4b-4fe8-9027-7756344314fa_1920x1315.webp 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 Drunken Alcibiades Interrupting the Symposium (1648) by Pietro Testa</figcaption></figure></div><h4>Geometric vs Subtle Minds</h4><p>Pascal used to distinguish between <em>geometric</em> and <em>subtle</em> minds (sensibilities). The geometric mind works through axioms and deductions, step by step, like a compiler. The subtle mind grasps a situation holistically, reading context, feeling the weight of unspoken constraints, sensing what a room will and won&#8217;t tolerate.</p><p>This is clearly a simplification, but engineers are usually trained almost exclusively in the geometric mind. The entire discipline is built on the assumption that correctness is sufficient, that if you can prove something works better, the proof carries its own momentum. Unfortunately in reality it doesn&#8217;t. Correctness is necessary but it is not sufficient. It should be the foundation, not the building.</p><p>This is why the best technical decision-makers I&#8217;ve ever worked with aren&#8217;t necessarily the smartest or most technically proficient people in the room. They&#8217;re the ones who learned, often painfully, that an argument aimed at &#8220;every rational person&#8221; lands on no one in particular. They stopped presenting to the universal audience and started reading the particular one.</p><p>Think about the last RFC/ADR/One-Pager you wrote.</p><p>You laid out the problem statement, described the current architecture and its failure modes, proposed a solution, backed by evidence. You anticipated objections and addressed them. In your opinion it was clean, thorough, well-reasoned.</p><p>Once presented you probably had some of the following people in your audience. The SRE guy who&#8217;s drowning in incidents and sees any architectural change as another surface area for things to break. The product manager who translates every engineering proposal into &#8220;how many sprints does this cost me&#8221;. The junior engineer who doesn&#8217;t understand the current system well enough to evaluate a replacement.</p><p>Probably your RFC even convinced them. But it didn&#8217;t persuade them. And you confused the two, so when the proposal stalled, you assumed the problem was comprehension. You added more diagrams. You wrote a longer appendix. You scheduled another meeting to walk through it again.</p><p>You were just polishing a handle of a door no one wanted to open.</p><h2>Rhetoric is required</h2><p>This terrain was mapped millennia ago. The three dimensions of rhetoric are since then well-known: the <strong>logical structure</strong> of the argument, the <strong>credibility</strong> and character of the speaker, and the <strong>emotional state</strong> of the audience.</p><p><strong>Convincing</strong> lives almost entirely in the logical structure. <br><strong>Persuading</strong> requires all three mixed together and calibrated to context.</p><p>In software engineering, we worship logic and treat the other two as contamination. We act as though caring about who is making the argument, or how the audience feels about it, is a form of intellectual corruption. It&#8217;s not. It&#8217;s the recognition that human beings are not compilers. They don&#8217;t parse your argument in isolation from everything else they&#8217;re carrying that day.</p><p>What drives decision-making has little to do with logical validity. Not because logic doesn&#8217;t matter, but because logic operates on a different layer of the stack. You need the logic underneath if you want to bring a solid proposal: <strong>that is your job</strong>. <br>But it&#8217;s not the interface. The interface is trust, timing, and the careful art of making someone feel that acting on your proposal serves what they already care about. This is not manipulation, which would require you not actually having the honest conviction underneath. The two must work together: you need a sound argument and the skill to land it.</p><p><strong>Conviction without persuasion is impotence. Persuasion without conviction is fraud.</strong></p><p>This doesn&#8217;t only cut one way. A VP of Engineering who decrees a change has the authority to make it happen. The org chart says so. The decision is made, communicated, documented.</p><p>Then nothing moves or results are way worse than expected.</p><p>Engineers complied without committing. They did the minimum the process demands and none of what the change actually requires.<br>Authority without credibility is just a mandate with no engine behind it. The VP convinced no one, they didn&#8217;t need to: they have the title. But they also didn&#8217;t persuade, because persuasion requires much more than the reporting line alone can provide.</p><p>Positional power gets compliance. Persuasion gets commitment. The gap between those two is where rewrites stall, migrations rot, and strategic initiatives quietly become shelfware.</p><p>Engineers and leaders who actually move things aren&#8217;t the ones who are right the most often. They&#8217;re the ones who learned that being right is the starting line, not the finish.</p><div><hr></div><p>If you liked this post, consider subscribing to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fconvincing-is-not-persuading&amp;t=Convincing%20Is%20Not%20Persuading">sharing it on Hacker News</a>.</p>]]></content:encoded></item><item><title><![CDATA[No you can't build it in a day]]></title><description><![CDATA[The Mythical Man-Month: Programming Systems Product]]></description><link>https://blog.alaindichiappari.dev/p/no-you-cant-build-it-in-a-day</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/no-you-cant-build-it-in-a-day</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sat, 07 Mar 2026 05:38:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Xhlz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Don&#8217;t you have that friend who just discovered that a chatbot can generate a landing page in forty seconds? &#8220;I could build that in a day&#8221;. They look at a product and, because they can picture the core logic, they believe they&#8217;ve understood the work. They haven&#8217;t. Or better, they&#8217;ve understood one-ninth of it.</p><p>Fred Brooks explained this in 1975 in his <em>The Mythical Man-Month</em>. I read it recently, and for a good part it&#8217;s clear he&#8217;s picturing a prehistoric world of software engineering. But at its core, many of those intuitions are more than relevant today.</p><p><a href="https://newsletter.pragmaticengineer.com/p/the-third-golden-age-of-software">Two golden ages of software engineering have passed since then</a>, but the underlying concepts remain, one of which is the misconception of what a real product running in production actually is.</p><h2>Programming Systems Product</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xhlz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xhlz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 424w, https://substackcdn.com/image/fetch/$s_!Xhlz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 848w, https://substackcdn.com/image/fetch/$s_!Xhlz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 1272w, https://substackcdn.com/image/fetch/$s_!Xhlz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xhlz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png" width="1449" height="891" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:891,&quot;width&quot;:1449,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124217,&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.alaindichiappari.dev/i/189846548?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.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_!Xhlz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 424w, https://substackcdn.com/image/fetch/$s_!Xhlz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 848w, https://substackcdn.com/image/fetch/$s_!Xhlz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.png 1272w, https://substackcdn.com/image/fetch/$s_!Xhlz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0f59f19-ddb1-4629-9ea0-4ae0b0b697fc_1449x891.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><h4>Program</h4><p>He draws a simple diagram with four quadrants. In the top-left corner sits the <strong>Program</strong>, a more or less complex application that &#8220;runs on one machine, for one person, solving one problem&#8221;. This is the part that, more than anything else, <em>automatic programming</em> has sped up a lot. Today I&#8217;d rewrite that sentence to give AI more credit: what you can possibly ship in a day (depending on the case) is much more than something a single user can run on their machine. In any case, that&#8217;s the thing you &#8220;build in a day&#8221;.</p><h4>Programming Product</h4><p>With a multiplication of the effort (he approximates it at 3x, clearly a simplification, and today the ratio is even different) you can transform your program into a <strong>Product</strong> through <em>generalization, testing, documentation, and (a lot of) maintenance</em>. <br>Regardless of the research you&#8217;ve done ahead of time, your users will need a feature you haven&#8217;t thought about, an SSO provider you haven&#8217;t implemented because of the additional complexity, they prefer CSV export instead of JSON, and so on. <br>The number of bugs and edge cases they&#8217;re able to find running your product in every possible absurd condition is incredible: old devices, niche browsers, network conditions, unexpected behaviors. <br>A note on <strong>documentation</strong>: who are the users of your product? You are required to document not only for your end users (including landing pages, wizards, hover text, external links, tutorials) but for yourself in the form of runbooks and today living documentation for coding agents. If the project also has an open-source nature, or you have colleagues, you&#8217;re better off documenting how to collaborate, what the architecture of the codebase is, and so on. If you&#8217;re building a B2B product, I can assure you that you need to document a lot of stuff that nobody will read, but often needed for some sort of compliance.</p><h4>Programming System</h4><p>Through another multiplication of the effort you can get to a <strong>Programming System</strong>. Especially when software lives inside a company, or you start getting serious with what you&#8217;re building, it rarely runs in isolation. It connects to other tools, services, and systems, and that web of connections changes everything dramatically.<br>The moment your program starts talking to other programs, complexity multiplies. Inputs and outputs need to be carefully managed, integration testing becomes essential, and things like monitoring and scaling turn into real challenges instead of afterthoughts. <br>This shift from a standalone program to a piece of a larger system carries a price tag similar to going from a script to a product. Plugging something properly into an ecosystem takes far more effort than building the thing itself.<br>If you start to have departments (it can just be yourself wearing multiple hats) you&#8217;ll discover the number of tools for all sorts of bureaucracy that you need to, in one way or another, integrate into your workflow just to keep the lights on.</p><h4>Programming Systems Product</h4><p>With all that said, finally, in the bottom-right corner sits the <strong>Programming Systems Product</strong>, which has the same core logic as your original product but generalized for strangers, tested until unbreakable, documented for people who will never meet you, and integrated into a living system of other components that all share resources and fail in creative ways.</p><p>The distance between the two corners is not incremental. It is a multiplier. &#8220;Three&#8221; times the effort to turn your script into something anyone can use. &#8220;Three&#8221; times again to make it coexist with everything else.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!paQn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!paQn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 424w, https://substackcdn.com/image/fetch/$s_!paQn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 848w, https://substackcdn.com/image/fetch/$s_!paQn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!paQn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!paQn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg" width="445" height="525.0755494505495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/beff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1718,&quot;width&quot;:1456,&quot;resizeWidth&quot;:445,&quot;bytes&quot;:1065648,&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://blog.alaindichiappari.dev/i/189846548?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.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_!paQn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 424w, https://substackcdn.com/image/fetch/$s_!paQn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 848w, https://substackcdn.com/image/fetch/$s_!paQn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!paQn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeff7a80-924e-4b79-b861-f0f9b96da536_1820x2148.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>AI</h2><p>Brooks&#8217;s multipliers assumed deterministic software. In 2026, some of the components you&#8217;re probably integrating are non-deterministic, and that changes the nature of the work at every level.</p><p>When your program enters a modern ecosystem, <strong>you aren&#8217;t just managing state</strong>. You are managing orchestration and observability across a distributed, often &#8220;black-box&#8221; network. Standard error logging doesn&#8217;t cut it anymore. If a logic error occurs somewhere in a chain of five different models or services, you need to trace it semantically, not just structurally. Worse, outputs can drift silently over time, breaking downstream services in ways that no traditional test suite would catch.</p><p>And when the software itself is built primarily by agents, the Product quadrant introduces a new kind of problem: volume. Automatic programming creates code faster than human engineers can review it line by line. The &#8220;source of truth&#8221; starts to drift between the developer&#8217;s intent, the prompt used to generate the logic, and the resulting code. Without deliberate effort to keep these aligned, the agent gradually loses its mental map of the project. New additions begin to break existing features in unpredictable ways. Call it context rot: a form of technical debt that doesn&#8217;t come from laziness or shortcuts, but from the sheer speed at which code is now produced.</p><p>This also means that in 2026, a Product isn&#8217;t just documented for humans. It is <strong>documented for coding agents</strong>. You need high-density context maps and runbooks that agents can consume to fix bugs or navigate the architecture autonomously. If your system isn&#8217;t &#8220;<em>agent-readable</em>&#8221;, it is already legacy.</p><p><a href="https://blog.alaindichiappari.dev/p/software-engineering-is-back">Today tools are real</a>. You can generate a working prototype faster than ever, and the gap between &#8220;I have an idea&#8221; and &#8220;I have a demo&#8221; has collapsed to hours. That part is genuine progress.</p><p>But the gap between &#8220;I have a demo&#8221; and &#8220;I have a product&#8221; hasn&#8217;t moved. If anything, it&#8217;s wider, because the demo now arrives so fast that people have even less patience for what comes after. The prototype feels like the finish line. It is the starting gun.</p><p>Especially because you&#8217;re not the only one to have gained that power.</p><h2>Distribution</h2><p>Something Brooks couldn&#8217;t even imagine at the time, but that we&#8217;re very aware of today, is <strong>Distribution</strong>.</p><p>Today, distribution is the final, invisible multiplier. The world is drowning in high(er)-quality noise. You are no longer competing against the difficulty of the syntax, you are competing against the infinite supply of &#8220;good enough&#8221; software generated by everyone else with a prompt.</p><p>Think about what that means concretely. Ten years ago, if you built a decent project management tool, your competition was the handful of teams with the engineering resources to do the same. Today your competition is anyone with an idea and a weekend. The barrier was syntax, now the barrier is attention. And attention doesn&#8217;t scale the way servers do. You can&#8217;t throw more compute at it. You can&#8217;t automate it away. Getting a stranger to care about your product long enough to try it, that is a problem that resists every shortcut the last two years have given us.</p><p>In this landscape, technical elegance matters zero (despite the fact I think it&#8217;s absolutely <strong>crucial</strong>) if you cannot bridge the gap to the user. Distribution is no longer a department that handles the &#8220;launch&#8221;. It is an architectural constraint. In an era of low-cost production, the only remaining scarcity is <strong>human attention</strong>, and solving for that is more complex, more expensive, and far more volatile than any legacy codebase.</p><p>The &#8220;built in a day&#8221; fallacy hasn&#8217;t disappeared. It has simply shifted its coordinates. AI has commoditized the first quadrant, turning the &#8220;Program&#8221; into a disposable artifact. But the remaining work of hardening, integrating, and distributing remains as resistant to shortcuts as it was in 1975.</p><p>The challenge of software engineering has evolved from &#8220;How do we build this?&#8221; to &#8220;How do we make this survive the noise?&#8221;.</p><div><hr></div><p>If you liked this post, consider <a href="https://blog.alaindichiappari.dev/subscribe">subscribing</a> to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fno-you-cant-build-it-in-a-day&amp;t=No%20you%20can't%20build%20it%20in%20a%20day">sharing it on Hacker News</a>.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/p/no-you-cant-build-it-in-a-day?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/p/no-you-cant-build-it-in-a-day?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.alaindichiappari.dev/p/no-you-cant-build-it-in-a-day?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Your fingers are snitching on you]]></title><description><![CDATA[Keystroke dynamics: the oldest biometric I had never heard of]]></description><link>https://blog.alaindichiappari.dev/p/your-fingers-are-snitching-on-you</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/your-fingers-are-snitching-on-you</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sat, 21 Feb 2026 04:06:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bcu2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every time you touch a keyboard, you leave a fingerprint. Not on the keys, but in the rhythm. And this isn&#8217;t new. It&#8217;s 160 years old.</p><p>Telegraph operators in the 1860s could identify each other across hundreds of miles by the cadence of their tapping alone. They called it &#8220;the fist&#8221;. Military intelligence in World War II used the same principle to distinguish allied transmissions from enemy deceptions. No encryption. No codebook. Just the involuntary rhythm of a human hand.</p><p>Now think about what you do every single day. Emails. Slack messages. Login forms. Search bars. You hammer out thousands of keystrokes, and buried inside that noise is a biometric signature as unique as the way you walk or the way you sign your name.</p><p>The field is called <strong>keystroke dynamics</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_!bcu2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bcu2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bcu2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bcu2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bcu2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bcu2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg" width="617" height="700" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:700,&quot;width&quot;:617,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:227577,&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://blog.alaindichiappari.dev/i/188013681?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.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_!bcu2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bcu2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bcu2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bcu2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c796068-bee1-4989-90a8-1ef3e3623661_617x700.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>The Anatomy of a Keyprint</h2><p>When you type a word three things happen that you will never consciously notice. First, there&#8217;s a <strong>dwell time</strong>: how long your finger presses down on each key, measured in fractions of a millisecond. Second, there&#8217;s a <strong>flight time</strong>: the gap between releasing one key and striking the next. Third, there&#8217;s a <strong>latency</strong>: the full arc from first press to second release.</p><p>Stack these measurements across every pair of keys you type, every digraph, every trigraph, and you get a timing profile. A rhythm. A signature written not in ink, but in the micro-hesitations of your nervous system.</p><p>This is not something you can fake. You didn&#8217;t learn it or chose it. Your motor cortex and your muscle memory built it over years, and it runs underneath your conscious awareness like a second heartbeat.</p><h2>Old Tools, New Forge</h2><p>Early researchers in the 1980s (Gaines, Umphress, Williams) proved the concept with crude statistical models. Euclidean distance. Manhattan distance. Measure the gap between a stored profile and a live sample. If the numbers are close enough, you&#8217;re in.</p><p>The problem was the same problem that plagues every craft when it&#8217;s young: the tools were blunt. Statistical models couldn&#8217;t handle the chaos of free-form typing. They needed you to type the same password, the same way, over and over. Fixed text. Controlled conditions. A laboratory exercise pretending to be a real-world system.</p><p>Then machine learning arrived. SVMs (Support Vector Machines) delivered under 1% average error rate on 500 keystrokes of free text. Decision Trees pushed past 93% AUC (Area Under the Curve, a measure of classification performance) with just a few keystrokes. Traditional ML was solid, but ultimately limited by hand-crafted features and fixed-length inputs.</p><p>The real interesting stuff started with deep learning. Recurrent networks could finally model what typing actually is: a sequence, a temporal stream with dependencies stretching across dozens of keystrokes. <a href="https://en.wikipedia.org/wiki/Convolutional_neural_network">CNN</a>+<a href="https://en.wikipedia.org/wiki/Recurrent_neural_network">RNN</a> hybrids drove the Equal Error Rate (where false accepts equal false rejects) down to 2.67% on the Buffalo/Clarkson datasets using just 30 keystrokes. RNNs scaled to 168K subjects and still held 2.2% EER on desktop data. Then Transformers arrived and pushed it further, 3.25% EER on mobile with as few as 30 keystrokes across 60K users. Deep learning didn&#8217;t just improve keystroke biometrics; it made them viable at scale.</p><p>And then came the Transformers.</p><p><a href="https://arxiv.org/abs/2212.13075">TypeFormer</a>, a self-attention architecture built specifically for keystroke sequences, achieved an Equal Error Rate of 3.25% on the Aalto Mobile database using just 30-100 keystrokes. The previous Transformer-based result on the same dataset sat at 3.84% EER with a fixed 50-keystroke window. Meanwhile, the best RNN approach hit 9.2% EER, though on a different mix of datasets, so it's not a clean apples-to-apples comparison. Still, TypeFormer didn't just edge out the competition: it set a new bar for keystroke biometrics with fewer keystrokes and a flexible input range.</p><h2>Authentication</h2><p>There are three ways to deploy keystroke biometrics as a supporting authentication mechanism.</p><p><strong>Fixed-text authentication</strong> asks you to type a known string (a password, a PIN etc). It&#8217;s easy to build, easy to profile, and easy to understand.</p><p><strong>Free-text authentication</strong> watches you type anything like an email, a document, a chat message, and verifies your identity from the rhythm alone. Historically, it needed 500 or more characters to work. Modern deep learning does it in 40 to 60 keystrokes. About two sentences.</p><p><strong>Continuous authentication</strong> is worth more attention than it gets. It runs quietly in the background, monitoring patterns like keystroke rhythm throughout a session. If the pattern shifts (say, someone else sits down at your keyboard) it triggers a security notification or simply locks the door, prompting for a second layer of authentication. The system already knows you left. It knew before you did. This aims to shift security at the intrinsic architecture level, like the difference between a lock on the front door and a house that knows who&#8217;s inside every room at every moment.</p><p>This is clearly at the research level and we know that every system has attack surfaces, this one is no different.</p><p>Injection attacks are real. Researchers have built rogue USB implants that sit inside a keyboard and replay a victim&#8217;s timing pattern with 93 to 96% accuracy on fixed-text systems. Humanoid robots have shown the ability to significantly degrade the performance of these detectors in white-box scenarios by imitating human gestures with high precision. Attackers can sample inter-keystroke intervals from empirical human distributions and forge passable imitations.</p><p>The defense? Liveness detection. Systems that look for micro-jitters: the tiny, involuntary tremors in human motor control that no replay attack or robotic actuator can perfectly replicate. Randomized challenge prompts. Multi-modal fusion, combining keystroke rhythm with mouse dynamics, device motion, even gait patterns, to create an identity surface so complex that forging one channel means nothing if the other three don&#8217;t match.</p><p>Anyway, every organization that relies on a single authentication factor is building on a foundation with exactly one crack needed to fail. Keystroke dynamics clearly doesn&#8217;t replace those layers alone.</p><h2>Tracking</h2><p>The marketing attribution landscape is shifting toward privacy-centric &#8220;cookieless&#8221; strategies that prioritize first-party data and server-side tracking.</p><p><strong>Server-side tracking</strong> has emerged as a critical alternative, moving data processing from the user&#8217;s browser to a brand-controlled server to bypass ad blockers and browser-level restrictions like Apple&#8217;s Intelligent Tracking Prevention (ITP). Identity resolution solutions, such as Unified ID 2.0 (UID2), provide another durable path by using hashed and salted email or phone data to recognize users across different platforms.</p><p>It is important to note that while keystroke dynamics can technically &#8220;fingerprint&#8221; a user, it remains a biometric signal distinct from these commercial frameworks. Marketers are increasingly utilizing machine learning for behavioral and conversion modeling to fill data gaps, alongside Google&#8217;s Privacy Sandbox APIs, including the Topics API for interest-based targeting. However, current research does not link keystroke dynamics to the implementation of UID2 or the Privacy Sandbox, as these standards prioritize aggregated or deterministic data rather than individual behavioral biometrics. These frameworks often blend deterministic attribution, which relies on exact matches like login credentials, with probabilistic models that use statistical signals to estimate the impact of anonymous user journeys.</p><h2>And more</h2><p>Changes in typing speed, inter-key delay, and error frequency are emerging as passive digital biomarkers for Mild Cognitive Impairment. Your keyboard can detect neurological decline before you notice it yourself. Older users exhibit measurably slower, more variable typing patterns, and tracking those patterns over months or years creates a longitudinal health record that requires no clinic visit, no blood draw, no conscious effort from the patient. Your keyboard becomes a diagnostic instrument, not because someone engineered it to be one, but because the signal was always there. We just never measured it.</p><p>In education, platforms like Coursera use keystroke dynamics to verify that the student registered for a course is the one taking the exam. No webcam. No surveillance theater. Just rhythm.</p><p>In forensics, an anonymous account means nothing if the typing pattern behind it matches a known profile. Age, gender, linguistic background, all encoded in the timing between keys and how long you press them.</p><h2>Privacy</h2><p>Under GDPR and the UK Data Protection Act, biometric data used for identification is classified as special category data. You need explicit, informed consent. You need a Data Protection Impact Assessment. And you absolutely cannot store raw keystroke logs.</p><p>The correct approach is template conversion, transforming timing data into anonymized mathematical representations that cannot be reversed to reveal what was typed. Data minimization isn&#8217;t optional. It&#8217;s the law.</p><p>This is the razor&#8217;s edge. The same technology that can protect a user&#8217;s identity can, if mishandled, become the most invasive surveillance tool ever deployed on a consumer device. The difference is entirely in the architecture of the system, what you store, what you discard, and whether the human on the other end of the keyboard ever gave you permission.</p><p>You could be already broadcasting a biometric signal every time you type. Every email. Every search query. Every password. The rhythm is uniquely yours, shaped by your neurology, your muscle memory, your years of habit.</p><p>The question isn&#8217;t whether this signal exists. It does. It has since the telegraph.</p><p>The question is who&#8217;s listening. And whether the systems being built around it are designed as fortresses, or as traps.</p><div><hr></div><p>BTW: I turned this rabbit hole into <strong><a href="https://github.com/alainrk/shufflekeys">ShuffleKeys</a></strong>, a fully open-source keystroke dynamics obfuscator. If any of this got you thinking, contributions and beta testers are very welcome!</p><p><a href="https://github.com/alainrk/shufflekeys">ShuffleKeys - OS Keystroke Dynamics Obfuscator on Github</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qC8w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qC8w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 424w, https://substackcdn.com/image/fetch/$s_!qC8w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 848w, https://substackcdn.com/image/fetch/$s_!qC8w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 1272w, https://substackcdn.com/image/fetch/$s_!qC8w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qC8w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png" width="1019" height="664" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:664,&quot;width&quot;:1019,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:137836,&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.alaindichiappari.dev/i/188013681?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.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_!qC8w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 424w, https://substackcdn.com/image/fetch/$s_!qC8w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 848w, https://substackcdn.com/image/fetch/$s_!qC8w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.png 1272w, https://substackcdn.com/image/fetch/$s_!qC8w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5080f269-6dc5-44ee-a3b2-84da30f82379_1019x664.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><div><hr></div><p>If you liked this post, consider <a href="https://blog.alaindichiappari.dev/subscribe">subscribing</a> to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fyour-fingers-are-snitching-on-you&amp;t=Your%20fingers%20are%20snitching%20on%20you">sharing it on Hacker News</a>.</p><div><hr></div><h4><strong>Refs</strong></h4><ul><li><p><em><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC3835878/">A Survey of Keystroke Dynamics Biometrics - PMC</a></em></p></li><li><p><em><a href="https://www.researchgate.net/publication/222569284_Keystroke_dynamics_as_a_biometric_for_authentication">Keystroke dynamics as a biometric for authentication - ResearchGate</a></em></p></li><li><p><em><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10220835/">Efficient Convolutional Neural Network-Based Keystroke Dynamics for Boosting User Authentication - PMC</a></em></p></li><li><p><em><a href="https://cs634biometrics.weebly.com/keystroke-biometric.html">Keystroke Biometric</a></em></p></li><li><p><em><a href="https://www.aratek.co/news/keystroke-dynamics-as-behavioral-biometrics">What&#8217;s Your Type? Keystroke Dynamics as Behavioral Biometrics</a></em></p></li><li><p><em><a href="http://www.genetic-programming.org/hc2009/5-Shahzad/Shahzad-Paper-RAID-2009.pdf">Keystroke-based User Identification on Smart Phones - Genetic-Programming.org</a></em></p></li><li><p><em><a href="https://petsymposium.org/2011/papers/hotpets11-final8Chairunnanda.pdf">Privacy: Gone with the Typing! Identifying Web Users by Their Typing Patterns</a></em></p></li><li><p><em><a href="https://www.ijcaonline.org/archives/volume144/number9/patil-2016-ijca-910432.pdf">Keystroke Dynamics for User Authentication and Identification by using Typing Rhythm - IJCA</a></em></p></li><li><p><em><a href="https://www.biometric-solutions.com/keystroke-dynamics.html">Keystroke Dynamics - Biometrics Solutions</a></em></p></li><li><p><em><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC11207587/">The Improved Biometric Identification of Keystroke Dynamics Based ...</a></em></p></li><li><p><em><a href="https://pdfs.semanticscholar.org/8acd/45b414d8d7d2c21c541a57ff00919e404719.pdf">Some Remarks on Keystroke Dynamics - Semantic Scholar</a></em></p></li><li><p><em><a href="https://par.nsf.gov/servlets/purl/10213237">Fast Free-text Authentication via Instance-based Keystroke Dynamics</a></em></p></li><li><p><em><a href="https://www.mdpi.com/2076-3417/13/20/11478">Authentication by Keystroke Dynamics: The Influence of Typing Language - MDPI</a></em></p></li><li><p><em><a href="https://www.ijcaonline.org/archives/volume186/number63/dutta-2025-ijca-924454.pdf">A Comprehensive Review of Keystroke Dynamics and Human Gait Analysis in Biometric Authentication - IJCA</a></em></p></li><li><p><em><a href="https://blog.typingdna.com/typingdna-on-mobile-browser-and-native-best-practices/">TypingDNA on Mobile Phones: Best Practices for Browser and Native Integrations</a></em></p></li><li><p><em><a href="https://openriver.winona.edu/cgi/viewcontent.cgi?article=1311&amp;context=rca">Using Keystroke Dynamics Behavioral Biometrics to Identify Users - OpenRiver</a></em></p></li><li><p><em><a href="https://arxiv.org/pdf/0910.0817">A Survey of Biometric keystroke Dynamics: Approaches, Security and Challenges - arXiv</a></em></p></li><li><p><em><a href="https://arxiv.org/html/2303.04605v3">Keystroke Dynamics: Concepts, Techniques, and Applications - arXiv</a></em></p></li><li><p><em><a href="https://www.mdpi.com/2079-9292/12/13/2894">A Deep-Learning-Based Approach to Keystroke-Injection Payload Generation - MDPI</a></em></p></li><li><p><em><a href="https://plurilock.com/deep-dive/keystroke-dynamics/#:~:text=Keystroke%20Dynamics%2C%20however%2C%20provides%20continuous">Keystroke Dynamics - Plurilock (Continuous Authentication)</a></em></p></li><li><p><em><a href="https://www.researchgate.net/publication/327192620_Keystroke_Dynamics_for_Continuous_Authentication">Keystroke Dynamics for Continuous Authentication - ResearchGate</a></em></p></li><li><p><em><a href="https://www.typingdna.com/authentication-api.html">Authentication API - Keystroke Dynamics for Your App - TypingDNA</a></em></p></li><li><p><em><a href="https://mhealth.jmir.org/2025/1/e80094">Exploring Age-Related Patterns in Smartphone Keystroke Dynamics - JMIR</a></em></p></li><li><p><em><a href="https://www.ntnu.no/ojs/index.php/nikt/article/download/6247/5574/23753">Continuous Age Detection using Keystroke Dynamics - NTNU</a></em></p></li><li><p><em><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12709153/">Exploring Age-Related Patterns in Smartphone Keystroke Dynamics - PMC</a></em></p></li><li><p><em><a href="https://proctor360.com/blog/biometric-authentication-exams-privacy-concerns">Biometric Authentication in Exams: 6 Key Privacy Concerns &amp; Solutions - Proctor360</a></em></p></li><li><p><em><a href="https://eprints.bournemouth.ac.uk/36304/1/1.%20User_Attribution_through_Keystroke_Dynamics-Based_Author_Age_Estimation_%28final%29.pdf">User attribution through keystroke dynamics-based author age estimation - Bournemouth University</a></em></p></li><li><p><em><a href="https://www.mdpi.com/2079-9292/10/7/835">Age and Gender as Cyber Attribution Features in Keystroke Dynamic-Based User Classification - MDPI</a></em></p></li><li><p><em><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC9460698/">User Authentication Method Based on Keystroke Dynamics and Mouse Dynamics - PMC</a></em></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Luddism 2026]]></title><description><![CDATA[Software Engineering is back: Answering the Room]]></description><link>https://blog.alaindichiappari.dev/p/luddism-2026</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/luddism-2026</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sat, 14 Feb 2026 04:42:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TQuP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few days ago I published a clearly <a href="https://blog.alaindichiappari.dev/p/software-engineering-is-back">provocative post</a> on something I've been noticing: how much coding agents can replace most of the frameworks and tooling I would use in my workflow, especially when the benefit is so low that the bloat doesn't justify their introduction.</p><p>I didn&#8217;t expect it to travel as far as it did, with nearly 600 comments on <a href="https://news.ycombinator.com/item?id=46923543">Hacker News</a>. I want to genuinely thank everyone who, whether they agreed or not, discussed it, shared it, and reached out to me because they felt I raised a point worth engaging with.</p><p>Anyway, I knew it would sting, and some reactions<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> confirmed not only what I thought, but also what I wrote: most people are still decorating the old house. Many are scared, in a denial phase that brings the discussion to a detrimental state for everyone.</p><p>I'll try here to cluster and answer the most common takes.</p><h2><strong>Framework Defenders</strong></h2><p>Of course frameworks have their place. The point was different: we're talking about blindly accepting design decisions without considering the trade-offs that always exist. We often do this from the start, when the solution space isn't clear yet. Starting to develop a simple web application with Next.js just because it's easy enough and deployable in a click on Vercel is a terrible idea if done by default, just because that's what YouTube influencer X told you.</p><p>&#8220;Frameworks provide correctness and battle-tested security&#8221;. Sure. Nobody is arguing against that when you really need it and it&#8217;s part of your design decisions. I&#8217;m arguing against defaulting to someone else&#8217;s blueprint when you now have the tools to draw your own, especially when the problem doesn&#8217;t warrant it.</p><p>The argument that AI performs better with frameworks because they provide "vocabulary" is telling. You're saying the machine needs the crutch too. That's not a defense of frameworks. That's an accusation of how we've trained ourselves (and now our tools) to think inside someone else's box, regardless of the context.</p><p>SQL injection protection is not an argument for adopting an entire web framework. It&#8217;s an argument for <strong>adopting</strong> a single, purpose-built sanitization layer. Not ten thousand lines of someone else&#8217;s opinions about how your application should breathe.</p><p>The middle path people get it. Build or buy what you need. Nothing more. Nothing less.</p><h2><strong>&#8220;But I love writing code&#8221;</strong></h2><p>So do I. In twenty years I have hand-built thousands of projects of any kind. This keeps being true even now, when the most powerful LLMs are available. Writing code is relaxing. It&#8217;s satisfying. It&#8217;s craft for the sake of craft, and I have never stopped doing it.</p><p>But that&#8217;s not what we&#8217;re talking about.</p><p>Loving to write code and questioning whether you should write every line by hand for every project are two completely different conversations. A carpenter can love hand-cut joinery and still use a table saw when building a deck. The love of the craft is not an argument against better tools. It&#8217;s an argument for knowing when the craft matters and when the deadline does.</p><p>Confusing what you enjoy with what a project demands is not passion. It&#8217;s lack of pragmatism. And pragmatism is not the enemy of craftsmanship. It&#8217;s what separates the craftsman from the hobbyist. The hobbyist would write code because it feels good. The craftsman writes code when it&#8217;s the right call, and lets the machine handle the rest so they can focus on the part that actually requires a human brain.</p><p>Nobody is asking you to stop writing code. Do, literally, what you want. I&#8217;m asking you to stop pretending that enjoying something makes it the right tool for every job.</p><h2><strong>Productivity Skeptics</strong></h2><p>The ones claiming &#8220;1.2x at best&#8221;: If your speed hasn&#8217;t changed, you&#8217;re using the forge to heat your coffee. I&#8217;ve recently heard university professors claiming they can&#8217;t find useful ways to use LLMs, and that most of the time the results are wrong. If you think buying a kitchen teaches you to cook, you'll be disappointed.</p><p>The 10x claim is also nonsense for most. Here&#8217;s the truth nobody wants to quantify honestly: the multiplier is not uniform. It&#8217;s asymmetric. The thinking time stays the same, if not more. It should. If your thinking time decreased, you&#8217;re not engineering, you&#8217;re gambling. What collapses is the translation time, the brutal, exhausting distance between a clear idea and working code. That distance used to be days. Now it&#8217;s hours. Sometimes minutes.</p><p>If you were already fast at typing and slow at thinking, yes, you&#8217;ll see 1.2x. The tool replaced your least valuable skill. If you were slow at typing and sharp at thinking, you just got some of your life back, or increased the value you can get.</p><h2><strong>&#8220;Rude Awakening&#8221; Prophets</strong></h2><p>You&#8217;re right. Partially.</p><p><strong>Vibe coding</strong> <em>will</em> produce disasters. Companies <strong>are already shipping</strong> systems nobody understands. I see it. And when those systems break, not if, when, there will be no one in the building who can find the fracture. This is not a prediction. This is a <strong>certainty</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_!TQuP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TQuP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TQuP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TQuP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TQuP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TQuP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg" width="675" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:675,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48658,&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://blog.alaindichiappari.dev/i/187301558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.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_!TQuP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TQuP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TQuP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TQuP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.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><p>But this is not an argument against Automatic Programming (again, <a href="https://antirez.com/news/159">thanks to Antirez for coining the term</a>). This is an argument against <em>ignorance</em>. The stochasticity argument is more interesting, and of course must have a place. Yes, a model is not a compiler. A compiler is a contract. <strong>A model is a collaborator</strong>. We don&#8217;t trust a collaborator blindly. We review. We test. We verify. If we&#8217;re not doing that, the problem is not the tool. The problem is us.</p><p>From <em>Robert Martin&#8217;s Clean Code 2nd Edition</em>:</p><blockquote><p>On the other hand, I am the final arbiter of the code that gets produced.<br>It remains incumbent upon me to do the work to ensure that I can evaluate what it produces.<br>Doing that work will usually involve writing and cleaning the code that I ask it to improve so that I can properly judge the outcome. The trade-off is very similar to using an autopilot in an airplane. The autopilot can vastly reduce the workload. But under no circumstances should it be implicitly trusted. Rather, the pilot must continuously oversee its operation. By the same token, no pilot should ever fly without possessing the necessary flying skills that they continuously maintain and refine. So it is with us. We must stay in practice, and keep our skills high, because we must be able to competently oversee the automation that reduces our workload.</p></blockquote><h2><strong>Career Worriers</strong></h2><p>There is fear, and uncertainty, I understand. The question isn&#8217;t whether the landscape is changing, it clearly is. The question is what we do with that knowledge.</p><p>The pilot model is the closest analogy I&#8217;ve seen.</p><p>The junior dev crisis is real and it&#8217;s already here. But the solution can&#8217;t be to slow down the tools. The solution is to fix how we teach. We don&#8217;t teach new pilots by making them build an engine from scratch. We teach them aerodynamics, systems thinking, failure modes. Then we put them in the seat with supervision.</p><p>The craft of understanding <em>why</em> code works is not going away. It&#8217;s becoming more important, not less. Because when the agent writes something wrong, and it will, the person in the seat needs to know why it&#8217;s wrong before the ground gets close.</p><p>We also have to consider the new skills that are forming, and will form, because of Automatic Programming. The ability to architect systems at a higher level of abstraction. The skill of &#8216;prompt engineering&#8217; is, now more than ever, really just clear thinking made explicit. The judgment to know when to trust the machine and when to rewrite from scratch. These aren't lesser skills. They're different skills, and some of them require sharper thinking than what came before.</p><p>Skill polarization is not a bug. It&#8217;s how every tool revolution has worked since the first human picked up a sharper rock. The question is whether you&#8217;re sharpening your rock or admiring someone else&#8217;s.</p><h2><strong>The &#8220;Last 10%&#8221; Realists</strong></h2><p>Yes. The last ten percent is where the craft lives. It always has been. A prototype is not a product. A sketch is not a building. Anyone who ships a 90% AI-generated system and calls it done deserves the 3am phone call they&#8217;re going to get.</p><p>Here&#8217;s what you&#8217;re missing: that last ten percent used to come <em>after</em> months of the first ninety. Now it comes after days. You&#8217;re not saving ten percent of the effort. You&#8217;re reclaiming ninety percent of your <em>time</em> to spend on the part that actually matters. The hard part. The part that requires a human who has laid the bricks before and knows which ones crack under pressure.</p><p>But this is the 10% of the <strong>building</strong> part. If you've worked in this industry at all, you know where the biggest part of Software Engineering really lives. And it's not building.</p><div><hr></div><p>If you liked this post, consider subscribing to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fluddism-2026&amp;t=Luddism%202026">sharing it on Hacker News</a>.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Insulters: I&#8217;m flattered you took the time to type with both hands.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Software Engineering is back]]></title><description><![CDATA[Coding agents have replaced every framework I used]]></description><link>https://blog.alaindichiappari.dev/p/software-engineering-is-back</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/software-engineering-is-back</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sat, 07 Feb 2026 05:30:11 GMT</pubDate><content:encoded><![CDATA[<p>I don&#8217;t post a lot. But when I do, it&#8217;s because I think few people are saying out loud what I&#8217;m noticing.</p><p>I&#8217;ve been building a product from the ground up. Not the &#8220;I spun up a Next.js template&#8221; kind of ground up. I mean from network configuration to product design to pricing decisions. Truly end to end. And I&#8217;ve been doing it using frontier models and coding agents for hours and hours every single day, both on this project and in my full time work. I&#8217;ve been trying to stay away from the chaos and the hype, filtering hard for what is actually valuable.</p><p>Since December 2025, things have dramatically changed for the better. Many have noticed. Few are drawing the right conclusions.</p><h2>Automated Programming</h2><p>Antirez likes to call it &#8220;automated programming&#8221;, and I really like that framing. It captures the essence far better than the shallow, almost dismissive label of &#8220;vibe coding&#8221;. Automation was at the core of most of the work and cultural revolutions of human history. The printing press, the loom, the assembly line. This one doesn&#8217;t differ much.</p><p>Most of my work is still there. I still have to deeply think about every important aspect of what I want to build. The architecture, the trade offs, the product decisions, the edge cases that will bite you at 3am. What&#8217;s gone is the tearing, exhausting manual labour of typing every single line of code.</p><p>At this point in time, models and tools, when put in a clean and maniacally well set up environment, can truly make the difference. I can be the architect without the wearing act of laying every single brick and spreading the mortar. I can design the dress without the act of cutting and sewing each individual piece of fabric. But I can do all of this with the experience on my back of having laid the bricks, spread the mortar, cut and sewn for twenty years. If I don&#8217;t like something, I can go in, understand it and fix it as I please, instructing once and for all my setup to do what I want next time.</p><p>Automated programming especially allows me to quickly build the tools I need so fast that every blacksmith that ever existed on this earth would envy me deeply. Finally able to really focus on the things they have in mind. Finally dedicating more time of their craft to the art they conceive, not the sweat of the forge.</p><h2>Epiphany</h2><p>It&#8217;s been months now that I have this thought crystallized in my mind. It is so clear to me that I genuinely don&#8217;t understand why everyone is not screaming it to the world.</p><p>We can finally get rid of all that middle work. That adapting layer of garbage we blindly accepted during these years. A huge amount of frameworks and libraries and tooling that has completely polluted software engineering, especially in web, mobile and desktop development. Layers upon layers of abstractions that abstract nothing meaningful, that solve problems we shouldn&#8217;t have had in the first place, that create ten new problems for every one they claim to fix.</p><p>Think about what happened. We, as an industry, looked at the genuine complexity of building software and instead of sharpening our thinking, we bought someone else&#8217;s thinking off the shelf. We wrapped everything in frameworks like wrapping a broken leg in silk. It looks nice. The leg is still broken.</p><h2>The three problems frameworks solve (or claim to)</h2><p>In my mind, besides the self declared objectives, frameworks solve three problems. Two explicit and one obvious but never declared.</p><p><strong>&#8220;Simplification&#8221;.</strong> Software engineers are scared of designing things themselves. They would rather accept someone else&#8217;s structure, despite having to force fit it into their product, rather than taking the time to start from the goal and work backwards to create the perfect suit for their idea. Like an architect blindly accepting another architect&#8217;s blueprints and applying them regardless of the context, the needs, the terrain, the new technological possibilities. We decided to remove complexity not by sharpening our mental models around the products we build, but by buying a one size fits all design and applying it everywhere. That is not simplification. That is intellectual surrender.</p><p><strong>Automation.</strong> This is the only point I can actually, more or less, understand and buy. Boilerplate is boring work. I hate it. And I especially hate using libraries that I then need to study, keep updated, be aware of vulnerabilities for, just for the purpose of removing the creation of duplicated but necessary code. Think about ORMs, CRUD management, code generation, API documentation and so on. The grunt work that nobody wants to do but everybody needs done. Fair enough. But hold that thought, because this is exactly the point where everything changes.</p><p><strong>Labour cost.</strong> This is the quiet one. The one nobody puts on the conference slide. For companies, it is much better having Google, Meta, Vercel deciding for you how you build product and ship code. Adopt their framework. Pay the cost of lock in. Be enchanted by their cloud managed solution to host, deploy, store your stuff. And you unlock a feature that has nothing to do with engineering: you no longer need to hire a software engineer. You hire a React Developer. No need to train. Plug and play. Easy to replace. A cog in a machine designed by someone else, maintaining a system architected by someone else, solving problems defined by someone else. This is not engineering. This is operating.</p><h2>Software Engineering Is Back</h2><p>In my opinion Software engineering, the true one, is back again.</p><p>I am not speaking out of my lungs only. I&#8217;ve been developing this way almost flawlessly for over two years at this point. But the true revolution happened clearly last year, and since December 2025 this is obvious to anyone paying attention. From now on it will be even more so.</p><p>We have the chance again to get rid of useless complexity and keep working on the true and welcome complexity of our ideas, our features, our products. The complexity that matters. The complexity that is actually yours.</p><p>Automation and boilerplating have never been so cheap to overcome. I&#8217;ve been basically never writing twice the same line of code. I&#8217;m instantly building small tools I need, purpose built, exactly shaped around the problem at hand. I don&#8217;t need any fancy monorepo manager. A simple Makefile covers 100% of my needs for 99% of my use cases. When things will get very complicated, and if they get very complicated, I&#8217;ll think about it. But only then. Not a second before. This is engineering. You solve the problem you have, not the problem someone on a conference stage told you that you&#8217;ll eventually have.</p><p>Agents are really well prepared when it comes to basic tools. Tools that have been around not for months, but literally for decades. Bash was born in 1989, just preceding me by two months. The most mediocre model running at this time knows bash better than any person in the world. Bash is the universal adapter. It is not a coincidence that coding agents are shifting from complex and expensive MCP configurations to a simple agent loop with bash as a way to interact, literally, with the world. The oldest tool turned out to be the most future proof. There&#8217;s a lesson in there if you care to listen.</p><h2>Think about it</h2><p>Really think about it.</p><p>Why do you ever need, for most of the use cases you can think of, a useless, expensive, flawed, often vulnerable framework, and the parade of libraries that comes with it, that you probably use for only 10% of its capabilities? With all the costs associated with it. From the &#8220;least&#8221; expensive: operational costs like keeping everything updated because they once again found a critical vulnerability in your Next.js version. To the most expensive one: the cost to your Design Choices. The invisible cost. The one you pay every day without even realizing it, because you&#8217;ve been paying it so long you forgot what freedom felt like.</p><p>If you keep accepting this trade off, you are not only losing the biggest opportunity we&#8217;ve seen in software engineering in decades. You are probably not recognizing your own laziness in once again buying whatever the hyperscalers have decided for you. You&#8217;re letting Google and Meta and Vercel be your architect, your designer, your thinker. And in exchange, you get to be their operator.</p><p>The tools are here. The models are here. The revolution already happened and most people are still decorating the old house.</p><p>Stop wrapping broken legs in silk. Start building things that are yours.</p><p></p><div><hr></div><p><em>Edit 14th Feb 2026</em></p><p>I didn&#8217;t expect this article to travel as far as it did, with nearly 600 comments on Hacker News, so I&#8217;ve published a follow-up answering the most common takes:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;ef7644f4-aa06-42e3-81ea-3331592d6ed3&quot;,&quot;caption&quot;:&quot;A few days ago I published a clearly provocative post on something I've been noticing: how much coding agents can replace most of the frameworks and tooling I would use in my workflow, especially when the benefit is so low that the bloat doesn't justify their introduction.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Luddism 2026&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:102872794,&quot;name&quot;:&quot;Alain&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F08c78fee-254a-48cc-8c89-93b7faf14205_680x544.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-02-14T04:42:29.951Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!TQuP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffe9eb3-56f7-40c3-84f7-2137bf0af6de_675x499.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.alaindichiappari.dev/p/luddism-2026&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:187301558,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:1067044,&quot;publication_name&quot;:&quot;Weekend Engineering&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[Beyond Snippets: Where Are AI's Software Masterpieces?]]></title><description><![CDATA[Stay pragmatic: neither fear nor follow the vibe coding hype]]></description><link>https://blog.alaindichiappari.dev/p/beyond-snippets-where-are-ais-software</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/beyond-snippets-where-are-ais-software</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Wed, 26 Mar 2025 05:30:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Plrr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.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_!Plrr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Plrr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 424w, https://substackcdn.com/image/fetch/$s_!Plrr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 848w, https://substackcdn.com/image/fetch/$s_!Plrr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!Plrr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Plrr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png" width="1456" height="1003" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1003,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130005,&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.alaindichiappari.dev/i/159805052?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.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_!Plrr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 424w, https://substackcdn.com/image/fetch/$s_!Plrr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 848w, https://substackcdn.com/image/fetch/$s_!Plrr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!Plrr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F707470cc-a7ce-47f8-a3dd-c1c9e4d76aaf_1480x1020.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>Year 2025, surrounded by AI models that can <strong>supposedly</strong> do <strong>anything</strong>.</p><p><a href="https://finance.yahoo.com/news/ai-write-code-zuckerberg-says-164519848.html?guccounter=1&amp;guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&amp;guce_referrer_sig=AQAAAGYQ1Q4aHEmDGRqfVQJ9owALI_gI0WexReFHwEf3td2BhH5LyAzSoJ7W5_Uc2kcRmxV409PMiQv_noCkvr_6mSBngulinhXG7JKsMReC-oFLbJdo3pgqwKLprDvNK2T4FDEEp_-EzLYlLDt2fUeNWwkiJ7FsIJLwVVb6M1KfvnSU">Zuckerberg</a>, <a href="https://www.businessinsider.com/anthropic-ceo-ai-90-percent-code-3-to-6-months-2025-3">Amodei</a>, <a href="https://www.reddit.com/r/Futurology/comments/1i002w7/klarna_ceo_says_he_feels_gloomy_because_ai_is/">Siemiatkowski</a> and many others are jumping on the near-future prediction bandwagon about AI replacing humans, with software creation especially included.</p><p>Redis, Postgres, Vercel, Supabase, Go, Zig, Ghostty, <a href="https://survey.stackoverflow.co/2024/technology/#most-popular-technologies">go find the software, tool, tech company you like</a> - these are all remarkable creations that many of us use daily, directly or indirectly. Some we love, some we tolerate, but each represents not just code, but entire ecosystems built through human collaboration: communication, negotiation, documentation, and years of iteration and refinement.</p><h2>Prototype</h2><p>I've tested many of these low/no-code AI instruments (or used as such) like Lovable, Bolt and (somehow) Cursor across different disposable projects in recent months. To be clear: I'm not discussing the intentional use of AI as collaborative tools. These excel as programming partners for discussing ideas and pair programming, particularly in domains where I already have expertise (which helps avoid hallucinations), or for generating boilerplate code and templates.</p><p>The real problems emerge when we venture into what Andrej Karpathy has dubbed <em>vibe-coding</em>, whatever that actually means beyond surrendering control after a few iterations.</p><p>On LinkedIn I've witnessed product managers, hobbyists, and non-technical folks having a grand old time cranking out their fantastic MVPs, right until they notice their free credits have evaporated or their credit cards maxed out. Suddenly they're faced with mountains of generated garbage they're technically incapable of fixing themselves. And the machine can't fix it either.</p><p>They've reached what I call <strong>the AI Foot-Shooting Point</strong>. That special moment when the LLM has created so many stacked layers of absolutely useless, interdependent code that it's impossible for even the most advanced models to navigate the spaghettification of the digital mess they've created. </p><p>Don't get me wrong, it's fantastic that this new way of prototyping exists. I'm actually happy if software engineers at their jobs stop doing this themselves and getting stressed during that first phase of experimentation, leaving the fast iteration bootstrap process to someone else instead. But don&#8217;t forget that, especially at this stage, this stuff is absolute garbage under the hood, it is what it is: a prototype. That's why your iterations stop working at some point and you need to call in some experts to rewrite everything for you. Don't forget to pay them enough to clean up that mess.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fKXI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fKXI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fKXI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fKXI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fKXI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fKXI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg" width="544" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:544,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48053,&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://blog.alaindichiappari.dev/i/159805052?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.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_!fKXI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fKXI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fKXI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fKXI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41d02681-4e44-4b71-b482-8e8858bf5d00_544x460.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>Case Study</h2><p>I&#8217;ve tested this myself in a few projects, I&#8217;ll describe here one as an example. I set out to build something deliberately simple: a fair-compensation salary matching SaaS service, using a very common stack (NextJS/Supabase/Vercel/Postgres/Stripe) - technologies with abundant resources and documentation online.</p><p>I used the most powerful models available. For the first 10-15 iterations, everything went remarkably smoothly with minimal interventions. Even here, though, I noticed the interventions I did make would have been exceptionally difficult, if not impossible, for a non-technical person without spending hours figuring out what to do. Tasks like migrating a database schema, managing data types and formats, and other "simple" problems that would baffle a novice.</p><p>Then things started breaking down on seemingly trivial tasks. For example, I wanted a form field to display only when the user role was "Company" and not "Candidate". The request was straightforward. In the simplest case, without touching any backend logic, it could have just hidden the textarea on the frontend based on the role stored in the session.</p><p>But no. The same AI capable of state-of-the-art complex Math struggled on such a simple task, and with each attempted fix, something else broke. Eventually, I gave up and investigated it myself. What I discovered was a development horror story: tons of dead code left for no apparent reason. Even the best models fine-tuned specifically for complex coding displayed a massive bias and competence toward addition rather than deletion, cleanup, and refactoring. Why?</p><h2>Refactor Inability: Motorcycle Gloves for Playing Guitar</h2><p>This additive bias likely stems from how code appears in training data. Most publicly available code represents the "state of the art" for that particular code snippet or repository, not the iterative process that led there. The models may occasionally train on diffs containing exemplar refactors, but they miss the context of <em>why</em> those refactors happened.</p><p>Real software development isn't linear. Sometimes you duplicate code to ship a feature, then apply DRY principles later. Sometimes you complicate things to meet a deadline, then apply KISS to simplify when you have breathing room. Sometimes it's August, everyone's on vacation, and you finally have time for that massive refactor where you apply all your knowledge, intentions, and creativity to sculpt the codebase like an artist.</p><p>AI simply can't do this (yet?), and it's painfully obvious. The models excel at leetcode-style problems and can provide fantastic snippets for bounded, well-defined tasks. In those moments, you can genuinely feel them channeling the best of human knowledge and creativity.</p><p>But as complexity grows, they deteriorate dramatically, caught in a positive feedback loop where they compound their own mistakes without recognition. They lack hesitation or shame in layering garbage solutions to appease you while you rush to build yet another IMDb &amp; AI-powered Movies recommendation tool that nobody asked for (and that probably Netflix already does better as part of their paid service).</p><h2>So What?</h2><p>AI tools could excel at scaffolding projects and generating boilerplate, but struggle with production essentials like proper complexity management, error handling, security, and optimization when things are done at a slightly larger scale than MVP or single feature without human intervention. Despite making developers more productive, the gap between hype and reality remains stark. </p><p>The industry suggests AI will replace engineers imminently, but at the moment it can't reliably implement basic features without breaking others. Production software requires extensive testing, edge case handling, and architectural decisions that demand domain expertise AI lacks. </p><p>Until we see significant, infrastructurally stable software built primarily by AI, I remain skeptical of the most ambitious claims.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2VyK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2VyK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 424w, https://substackcdn.com/image/fetch/$s_!2VyK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 848w, https://substackcdn.com/image/fetch/$s_!2VyK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 1272w, https://substackcdn.com/image/fetch/$s_!2VyK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2VyK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png" width="268" height="255.136" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1071,&quot;width&quot;:1125,&quot;resizeWidth&quot;:268,&quot;bytes&quot;:113420,&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.alaindichiappari.dev/i/159805052?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.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_!2VyK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 424w, https://substackcdn.com/image/fetch/$s_!2VyK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 848w, https://substackcdn.com/image/fetch/$s_!2VyK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.png 1272w, https://substackcdn.com/image/fetch/$s_!2VyK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90b5f033-b657-46a7-91ea-5ae70c019d54_1125x1071.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>So here we are in 2025, surrounded by evangelists preaching the gospel of our imminent obsolescence while their billion-dollar companies still employ armies of human developers to build anything that actually works. </p><p>The revolution is perpetually one parameter update away, I'll keep watching the hype train barrel forward on VC fuel while the rest of us quietly fix the AI-generated spaghetti code left behind.</p>]]></content:encoded></item><item><title><![CDATA[The Dev Metrics Game]]></title><description><![CDATA[And the playbook to win]]></description><link>https://blog.alaindichiappari.dev/p/the-dev-metrics-game</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/the-dev-metrics-game</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Fri, 14 Mar 2025 05:00:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yBc8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.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://www.decisionproblem.com/paperclips/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yBc8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 424w, https://substackcdn.com/image/fetch/$s_!yBc8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 848w, https://substackcdn.com/image/fetch/$s_!yBc8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 1272w, https://substackcdn.com/image/fetch/$s_!yBc8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yBc8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png" width="577" height="433.61170848267625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:629,&quot;width&quot;:837,&quot;resizeWidth&quot;:577,&quot;bytes&quot;:315365,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://www.decisionproblem.com/paperclips/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.alaindichiappari.dev/i/158972667?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.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_!yBc8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 424w, https://substackcdn.com/image/fetch/$s_!yBc8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 848w, https://substackcdn.com/image/fetch/$s_!yBc8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.png 1272w, https://substackcdn.com/image/fetch/$s_!yBc8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65812a7c-a2a2-468f-aca1-228f1a640d0b_837x629.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">https://www.decisionproblem.com/paperclips/</figcaption></figure></div><blockquote><p><em>&#8220;Fatta la legge, trovato l'inganno&#8221;<br></em>Italian saying for &#8220;<em>Made the law, found the loophole</em>&#8221;</p></blockquote><p>Let me tell you about the time a tech lead I know increased their deployment frequency by 300% in a single quarter. Management was thrilled. Investors were impressed. A promotion followed swiftly.</p><p>The secret? Needless to say: breaking every feature into microscopic pull requests, each deploying separately. One-line changes became heroic deployment statistics. The actual value delivered? Roughly the same, if not less, considering the overhead. <strong>But the metrics? Oh, the metrics looked beautiful.</strong> </p><p>If your organization has jumped on the "measure developer productivity" bandwagon <strong>blindly</strong>, congratulations! You've been handed a game to play.</p><h3>PR Count &amp; Commit Frequency</h3><p><em>"Best/Senior engineers correlate with higher commit/PR counts"</em> the prophet said.</p><p>Do they, though? The best engineers many of us have met spend most of their time:</p><ul><li><p>Mentoring and pairing with juniors and other colleagues through complex problems</p></li><li><p>Researching solutions that won't explode in production</p></li><li><p>Writing documentation no one reads until 2AM during an incident</p></li><li><p>Reviewing PRs to prevent the next generation of tech debt</p></li></ul><p>None of these activities generate the amount of PRs or commits your leadership want to see. But fine, if you want commits:</p><ol><li><p>Never rebase-squash them</p></li><li><p>Make multiple small formatting changes</p></li><li><p>Break logical changes into separate commits</p></li><li><p>Commit every time you take a coffee break</p></li><li><p>Write unnecessary comments, then remove them in separate commits</p></li></ol><h3>Deployment Frequency</h3><p>Want to look like a deployment hero?</p><ol><li><p>Split features into nano-deployments</p></li><li><p>Deploy the same code with minor tweaks</p></li><li><p>Create a script that makes trivial changes and auto-deploys them</p></li><li><p>Plan to break monoliths into microservices, it&#8217;ll inflate deployment stats</p></li></ol><h3>PR Review Depth</h3><p>I&#8217;ve seen this the first time on <a href="https://linearb.helpdocs.io/article/v9s73q7d93-review-depth-metric">LinearB</a>. Supposedly measuring how thoroughly reviews are conducted by tracking comments or time spent. Some organizations desperate to improve code quality have embraced this absurdity with open arms. So:</p><ol><li><p>Add nitpicky comments about spacing and variable names</p></li><li><p>Ask unnecessary questions you already know the answers to</p></li><li><p>Break reviews into multiple sessions to inflate time-tracking stats</p></li><li><p>Schedule review meetings that could have been comments, then do both</p></li><li><p>The altruistic move: Write deliberately questionable code in your own PRs so colleagues have to leave more comments</p></li></ol><h3>Velocity Points</h3><p>Meant to help with planning, it quickly devolves into the most gameable metric in agile development.</p><ol><li><p>Gradually inflate point values for similar tasks quarter by quarter</p></li><li><p>Deliberately underestimate in the first few sprints, then "improve" dramatically</p></li><li><p>Hide complex work inside deceptively simple tickets</p></li><li><p>Split one 8-point ticket into eight 1-point subtasks (bonus: deployment frequency improves too!)</p></li><li><p>Negotiate aggressively during estimation meetings to lower points, then overdeliver</p></li><li><p>Master move: Create an "estimation recalibration" meeting every few months to reset baselines when your inflation becomes too obvious</p></li></ol><h3>MTTR (Mean Time To Restore/Recovery)</h3><p>Having incidents? Time to play:</p><ol><li><p>Declare incidents "resolved" the moment service is partially restored</p></li><li><p>Apply bandage fixes to stop the bleeding, mark as resolved, then reopen as a "new" incident when it inevitably breaks again</p></li><li><p>Redefine what constitutes an "incident" mid-quarter</p></li><li><p>Simply don't log minor incidents at all</p></li></ol><p>(On a more serious note: <a href="https://blog.alaindichiappari.dev/p/rethinking-mttr">Rethinking MTTR</a>)</p><h3>CFR (Change Failure Rate)</h3><p>Management wants this number low, but actually improving it would require thoughtful processes and investment in infrastructure. Who has time for that?</p><ol><li><p>Deploy trivial changes to inflate your total deployment count (denominator magic!) especially after a period with higher CFR</p></li><li><p>Roll multiple risky changes into one deployment &#8211; one failure for the price of five!</p></li><li><p>The senior play: Introduce a "pre-production validation" stage where failures happen but aren't tracked</p></li></ol><h2>The Deeper Problem</h2><p>The fundamental flaw in developer metrics is context. Context is not just missing; it's actively avoided because it complicates the neat narrative of "numbers go up = good."</p><p><em>"But we need metrics to improve!"</em></p><p>Fair enough. If you're starting from a terrible place, measuring can help. The problem emerges when you reach a good state. What then?</p><p>Let's say your DORA metrics all reach "elite" status. What happens next? Do you keep optimizing deployment frequency until you're deploying every millisecond? Do you reduce MTTR to negative values, somehow fixing issues before they occur?</p><p>There's a natural ceiling to these metrics, and once you approach it, the only way to "improve" is to game them. And engineers, being the optimization-obsessed creatures we are, can't help but fixate on improving these numbers, especially when they're directly tied to promotions and performance reviews.</p><p>It's like using a speedometer as a target rather than a measurement. <em>"I must drive faster each quarter to show improvement!"</em> No, it is an operational indicator, not a goal in itself.</p><p>Alternatives have been proposed. The SPACE framework, DX Core 4&#8482; (yes: &#8482;, think about it for a second), and others attempt to address these issues by measuring the entire development chain with multiple factors like satisfaction and wellbeing. But if management remains obsessed with improvements on action metrics, those metrics will be incorporated too, and we've come full circle.</p><h2>The Inevitable Innovation Slowdown</h2><p>Here's another inconvenient truth: Sometimes improving requires getting worse first.</p><p>Implementing a new architecture? Expect every metric to tank temporarily. Refactoring a critical system? Your velocity will drop. Training the team on new practices? Productivity will suffer before it improves.</p><p>But if leadership is obsessively watching those metrics dashboards, they'll panic at the first sign of numbers trending down. Innovation requires patience that quarterly metric reviews don't allow.</p><div><hr></div><p>I'm not suggesting we abandon any metrics entirely. I'm suggesting we recognize them for what they are: imperfect proxies that provide hints, not definitive judgments of value creation.</p><p>Some humble suggestions:</p><ul><li><p>Use metrics as conversation starters, not conversation enders</p></li><li><p>Recognize that context matters more than absolute numbers</p></li><li><p>Accept that experts value often shows up in other people's or business metrics indirectly</p></li><li><p>Understand that not everything valuable can be measured</p></li><li><p>Be suspicious when metrics improve too quickly</p></li></ul><p>Or you could ignore all this and continue the metrics game. After all, you now have a playbook to win it.</p><div><hr></div><p>If you liked this post, consider <a href="https://blog.alaindichiappari.dev/subscribe">subscribing</a> to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fthe-dev-metrics-game&amp;t=The%20Dev%20Metrics%20Game%20(and%20the%20playbook%20to%20win)">sharing it on Hacker News</a>.</p>]]></content:encoded></item><item><title><![CDATA[On the Joy of Hacking]]></title><description><![CDATA[Praise for Software as Art and the loneliness that comes with it]]></description><link>https://blog.alaindichiappari.dev/p/on-the-joy-of-hacking</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/on-the-joy-of-hacking</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Thu, 20 Feb 2025 06:04:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/VWROG90noLY" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As always, I write here only when I'm experiencing brain overflow and something inside me needs to spill onto the page.</p><p><a href="https://antirez.com/">Salvatore Sanfilippo</a>, creator of <a href="https://en.wikipedia.org/wiki/Redis">Redis</a>, came out with a <a href="https://www.youtube.com/watch?v=VWROG90noLY&amp;ab_channel=SalvatoreSanfilippo">YouTube video called "</a><em><a href="https://www.youtube.com/watch?v=VWROG90noLY&amp;ab_channel=SalvatoreSanfilippo">I work alone</a></em><a href="https://www.youtube.com/watch?v=VWROG90noLY&amp;ab_channel=SalvatoreSanfilippo">"</a>, where, to use his own words, he talks about: "<em>I'm a bad person and I experience software development as a solitary experience. But this approach has many advantages, which I defend in this video</em>".</p><div id="youtube2-VWROG90noLY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;VWROG90noLY&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/VWROG90noLY?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><div><hr></div><p>Most companies sell product software or services that are just spreadsheets on steroids. This is fine, as everyone seems to benefit from them: founders, executives, employees, customers, and the economy in general.</p><p>This is true in many other fields. There are millions of variants of biscuits; many staple foods are even produced by the same white-label companies and sold by different firms with different packaging and advertising as completely different products. We don't buy or use things just to satisfy basic needs - there's status, boredom, and many other reasons.</p><p>This dual nature of software, as both a commercial product and a form of creative expression, creates an inevitable tension, especially in talented people. While most business software is indeed a product for consumption, there exists another realm where code transcends mere utility. <br>This is where software becomes art, where each algorithm, function, design decision, architectural detail, brings the distinct signature of its creator.</p><p>But this pursuit of software craftsmanship often leads to a peculiar kind of loneliness. When you've tasted the freedom of creating something truly yours, something that reflects your unique vision and technical aesthetics, it becomes harder to find satisfaction in the conventional corporate approach to software development.</p><p>Take Redis, for example. While it's now a crucial piece of infrastructure used by countless companies, it began as Salvatore's personal vision of what his creation should be. Its elegance and simplicity weren't designed by committee - they emerged from one person's deep understanding and artistic sensibility.</p><p>This is the paradox many passionate software engineers face. The deep qualities that make us somehow good at our craft, our attention to detail, our desire for elegance, our need for creative control, can make us difficult teammates in traditional corporate environments. If you've ever considered yourself an artist of software, even once, you may have felt the struggle of working in an industry where code is merely a means to an end. Needless to say, AI (<em>in its brainless copilot-version usage, more on this topic will come soon</em>) accelerates this disconnection, where the &lt;Tab&gt; key has become the most pressed one on the keyboard. Fire and forget - even less of this production chain is yours, containing mostly your manual labor. Intellectual and artistic abilities are slowly shifting to other areas, where different skills and capabilities are needed - often politics, communication, stakeholder management, and the ability to navigate complex organizational dynamics take precedence over technical craftsmanship and creative vision.</p><p>The loneliness comes not from being alone - many of us work in teams - but from the emotional distance between how we see our craft and how it's typically practiced in industry. When you've experienced the joy of building something that's truly yours, something that reflects your technical taste and creative vision, it's hard to go back to building solely through the stifling mechanisms of corporate workplaces.</p><p>Yet, as Salvatore suggests, there could be a middle path. Even within corporate constraints, we can get some space for personal expression. We can take ownership of specific components or modules, infusing them with our creative vision while still serving the larger business goals. I remain quite cynical about this point, but I admit (as I found them in the past) there are places where this is possible, operating either outside of or even in compliance with market necessities.</p><p>Anyway, I personally think that the most innovative software projects start as personal endeavors, driven by individual vision rather than market research or committee decisions. Like any art form, the most compelling software often comes from a place of personal passion and singular vision, even if that makes the journey a bit lonelier. I keep telling people who are passionate about software to cultivate their personal projects, where they can truly express their creative instincts without constraints. You'll probably never get rich or famous, and these projects might not even be particularly useful to others. But they serve as your playground and sanctuary for true mastery and experimentation, where the purity of software craftsmanship still exists.</p><div><hr></div><p>As expressed by Salvatore in his closure:</p><blockquote><p><em>I encourage you, even in a corporate environment, to sometimes take on a project that's completely your own. </em></p><p><em>Tell your boss, tell your colleagues: &#8220;Don't worry about this stuff, I'll handle it, I'll take care of it. Get the fuck out, and let me do things how I want to do them. I'll do them better than if we had ten people deciding because I'll be in love with that project. It will mean something to me because it's an expression of my project-oriented, engineering, creative, and inspirational spirit&#8221;.</em></p><p><em>Give it a try, it's beautiful to work this way. But be careful, because if you get carried away with this approach, it will be difficult to return to the absurd, boring, illogical normalcy of projects done by committee while everyone yawns and nobody really cares.</em></p></blockquote><p>I also want to include here the original, verbatim, version for my Italian audience.</p><blockquote><p><em>Vi invito a volte anche in ambito aziendale a fare un progetto che sia completamente vostro. </em></p><p><em>Ditelo al vostro capo, ditelo ai vostri colleghi: &#8220;Non vi preoccupate di sta roba qua, ci penso io, me la vedo io. Toglietevi dai coglioni e faccio le cose come voglio fare io. Le far&#242; meglio di come le avrei fatte se decidiamo in dieci perch&#233; sar&#242; innamorato di quel progetto. Conter&#224; qualcosa per me perch&#233; &#232; un'emanazione del mio spirito progettuale, ingegneristico, creativo, di ispirazione&#8221;.</em></p><p><em>Provateci, &#232; bello fare cos&#236;. Poi per&#242; attenzione che se vi fate prendere la mano da questo sistema sar&#224; difficile ritornare nella normalit&#224; assurda, noiosa, illogica del progetto fatto a tavolino mentre tutti sbadigliano e non gliene frega niente a nessuno.</em></p></blockquote><div><hr></div><p>If you liked this post, consider subscribing to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fon-the-joy-of-hacking&amp;t=On%20the%20joy%20of%20Hacking">sharing it on Hacker News</a>.</p>]]></content:encoded></item><item><title><![CDATA[Rethinking MTTR]]></title><description><![CDATA[Is elevating DORA (& friends) metrics to business indicators a trap?]]></description><link>https://blog.alaindichiappari.dev/p/rethinking-mttr</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/rethinking-mttr</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sat, 08 Feb 2025 05:38:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wX85!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.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_!wX85!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wX85!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 424w, https://substackcdn.com/image/fetch/$s_!wX85!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 848w, https://substackcdn.com/image/fetch/$s_!wX85!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 1272w, https://substackcdn.com/image/fetch/$s_!wX85!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wX85!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.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;:2178257,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wX85!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 424w, https://substackcdn.com/image/fetch/$s_!wX85!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 848w, https://substackcdn.com/image/fetch/$s_!wX85!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.png 1272w, https://substackcdn.com/image/fetch/$s_!wX85!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6f5314b-ec1d-46de-8f6a-10b5c1ae2682_2844x2064.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>I've spent the last few years working with various metrics, including DORA, and particularly with <strong>MTTR</strong>. Here stands a first layer of confusion as it can be meant as <em>Mean Time To Recovery/Restore/Resolve</em>, and sometimes even <em>Respond,</em> but we'll stick to the widely accepted one: <strong>Recovery</strong>, meaning: impacted users are, in one way or another, interacting with the system again successfully. </p><p>While these metrics are usually adopted as business KPIs, I believe we need to reconsider their role and keep them as operational metrics only.</p><p>Here's my thought.</p><p><strong>A Statistical Significance Problem</strong></p><p>MTTR's statistical significance is remarkably low. When we look at incident data, we often see a non-normal distribution of recovery times. Some incidents take minutes to resolve, while others might take days, independently of their impact and severity. Moreover, most companies, especially small and medium-sized businesses, don't experience enough incidents to achieve statistical significance in their measurements. And if they do have a high volume of incidents, that itself should be their primary concern rather than optimizing their MTTR.</p><p>Also, not all incidents are created equal. Usually, MTTR treats all incidents the same way: a one-day minor incident affecting a single user carries the same weight as a one-hour major outage affecting millions of users. This leads to misleading metrics that don't reflect the real impact on our services.</p><p>This wide variance and apple-to-oranges comparison makes it difficult to draw meaningful conclusions from the mean value alone.</p><p><strong>The Real-World Disconnection</strong></p><p>As mentioned, MTTR isn&#8217;t usually implemented in companies considering incident severity and impact. A quick recovery from a minor issue improves your MTTR more than a well-handled major incident that naturally takes longer to resolve. This creates perverse incentives where teams might be tempted to categorize incidents as multiple smaller issues rather than one larger one.</p><p>Also, the quality of the remediation isn&#8217;t taken into consideration. Recovery, intended as <em>Mitigation</em> so that users journey are completed again on the systems, is just part of the equation. It could be considered acceptable to mitigate the availability sacrificing latency, but is it for days? Or weeks? The benefit of proper recovery, or better, the fixing the root cause is not included in the MTTR.</p><p><strong>The Actionability Problem</strong></p><p>Here's a crucial question: If your MTTR goes up, what specific actions should you take? There's no clear answer beyond "investigate the context". Similarly, if MTTR goes down, does it necessarily mean your service is more reliable? Not really. This lack of clear actionability makes it problematic as a target metric.</p><p>Consider a scenario where your team has gotten remarkably good at applying quick fixes to recurring issues. Your MTTR looks stellar on paper &#8211; dropping from hours to minutes &#8211; but you're masking a more insidious problem: architectural flaws that keep causing the same failures. You're optimizing for speed of repair rather than addressing root causes, essentially rewarding firefighting over fire prevention.</p><p>The metric can also create <strong>perverse incentives</strong>. Teams might rush through fixes to maintain a low MTTR, potentially introducing new vulnerabilities or technical debt in the process. Or worse, they might start classifying incidents differently. Breaking up what should be one large incident into several smaller ones, or prematurely marking issues as resolved only to see them resurface hours later. The metric becomes a game to be played rather than a true measure of service reliability.</p><p>Even more troubling is how MTTR obscures the customer impact dimension. A five-minute outage affecting your entire user base could be far more damaging than a two-hour incident affecting a small subset of users, yet MTTR treats them identically. This disconnect between metric and business value makes it dangerous to use MTTR as a primary indicator of operational excellence or team performance.</p><p><strong>The Google Paradox</strong></p><p>Allow me to use this silly but simple paradox: Google, who invented the SRE concept, has been working on incident management for years. If MTTR were a <strong>consistently improvable metric</strong> (and this is what business usually looks for), Google's MTTR should be near zero by now. But it isn't, because new features, systems, and complexity constantly introduce new types of incidents, as is normal, so why put pressure on the entire engineering department for something that is non-gaussian distributed, non-continuously improvable by nature, and that is not actionable? </p><p>If we still want to keep these metrics, just leave them as just another indicator for the authorized personnel.</p><p><strong>The Business Metrics Trap (and a proposal)</strong></p><p>I won't go deep into this large and widely discussed topic around why using DORA metrics as business indicators on the quality of Engineering creates problematic incentives, but it's clear that when promotions or OKRs depend, for example, on MTTR, teams might: split larger incidents into smaller ones, rush recoveries without proper root cause analysis, manipulate incident definitions to improve metrics, and so on.</p><p>Instead of fixating on MTTR, we should focus on:</p><ul><li><p>Service Level Objectives (SLOs) that directly measure User Experience and especially User Journeys. Spoiler: It's more difficult, requires more time and shared effort beyond Engineering to negotiate what's important.</p></li><li><p>Reliability metrics that matter to specific services, prioritized by the <a href="https://en.wikipedia.org/wiki/Pareto_principle">Pareto principle</a>.</p></li><li><p>Service availability measurements and engineers&#8217; perceived stability (more on this soon).</p></li></ul><p>These metrics provide more actionable insights and better align with business goals.</p><p><strong>Measuring Success in a different way</strong></p><p>We can better measure reliability improvements using different approaches, such as frameworks that are already adopted by business like the Kirkpatrick model.</p><p>We could, for example, every quarter or semester:</p><ul><li><p>Survey incident managers and on-call people about perceived reliability trends.</p></li><li><p>Gather detailed feedback about specific services and pain points.</p></li><li><p>Convert qualitative feedback into quantifiable metrics to track trends across categories that align with our systems and needs.</p></li><li><p>Track these metrics over time to demonstrate improvements and take targeted actions in context.</p></li></ul><div><hr></div><p>To conclude, while MTTR and other DORA metrics (<em>may</em>) have their merits as operational indicators, their elevation to business KPIs deserves reconsideration. The non-normal distribution of recovery times, the lack of severity weighting, and the potential for creating misaligned incentives suggest we need a more nuanced approach. </p><p>Instead, organizations would benefit from focusing on comprehensive SLOs that genuinely reflect user journeys, developing context-specific reliability metrics, and implementing qualitative feedback systems like quarterly surveys of incident responders.</p><p>By shifting our focus from abstract, potentially gameable metrics to meaningful measurements that capture real service reliability and user impact, we can foster genuine improvements in our systems. The path forward lies in understanding that reliability isn't just about recovery speed, it's about building resilient systems, making informed decisions based on service-specific needs, and maintaining a holistic view of system health that considers both quantitative and qualitative indicators.</p><div><hr></div><p>Resources:</p><ul><li><p><a href="https://tidyfirst.substack.com/p/humans-data">Kent Beck on developer productivity</a></p><ul><li><p><a href="https://newsletter.getdx.com/p/developer-productivity-metrics-the?utm_source=post-email-title&amp;publication_id=996688&amp;post_id=156463799&amp;utm_campaign=email-post-title&amp;isFreemail=true&amp;r=1p8x5m&amp;triedRedirect=true&amp;utm_medium=email">&#8230;and the answer of Abi Noda</a></p></li></ul></li><li><p><a href="https://www.reddit.com/r/sre/comments/1ebwwpf/if_youre_still_measuring_mttr_why/">Reddit discussion</a></p></li><li><p><a href="https://www.youtube.com/watch?v=xaGFWEO8f_c">Interesting discussion on MTTR, CFR and SLOs</a> </p></li></ul>]]></content:encoded></item><item><title><![CDATA[Sabotage 101: Company Culture Meltdown]]></title><description><![CDATA[Playbook for destroying company and engineering culture]]></description><link>https://blog.alaindichiappari.dev/p/sabotage-101-company-culture-meltdown</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/sabotage-101-company-culture-meltdown</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Thu, 07 Mar 2024 05:13:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bd300bd0-6cc7-4ffb-8e16-e406afcafe6b_544x437.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It doesn&#8217;t matter if you are an executive pushed by shareholders&#8217; anxiety, a director facing tough decisions, or a manager tasked with reshaping their team. You have to do your part and turn everything upside down, even if it means destroying the current culture in favor of a greater benefit, such as company profitability, your superiors&#8217; profitability, or, if you&#8217;re lucky enough, your own profitability.</p><p>In these cases, you can't just wing it. There are a few concepts to reconsider in a new light and a dedicated playbook to follow step-by-step.</p><h3>1. Values are Trends</h3><p>One of the most pervasive myths in the corporate world is the notion of company values. Don&#8217;t be scared, these are supposed to be guiding principles, but the reality is they are just superficial declarations to fill the "Who We Are" page of your company's website and every job description published on LinkedIn.</p><p>They're shaped according to current trends rather than genuine convictions, as with anything else, it&#8217;s the market that demands it. A few companies in the industry try to adopt unique or authentic values, but honestly, that is a waste of time and doesn&#8217;t pay you back. Why bother striving for originality when conformity seems to be the path for survival?</p><p>Consider the evolution of workplace values over the decades:</p><p><strong>1970s/80s</strong>: Casual dress codes and lip service to women's rights, though women were predominantly relegated to lower-tier positions within companies. The rise of open-plan offices symbolized a supposed commitment to collaboration.</p><p><strong>1990s</strong>: In times of economic uncertainty, corporate communication emphasized job security, loyalty, and the illusion of upward mobility within the organization.</p><p><strong>2000s/2010s</strong>: The emergence of the startup culture brought incredible perks such as ping-pong tables, on-site massages, gourmet meals, and trendy office spaces, all in the name of fostering collaboration and open communication.</p><p><strong>2020s</strong>: The pandemic prompted a collective reckoning with personal wellbeing and a sort of social awakening. Concepts like remote and hybrid work arrangements gained prominence, alongside a newfound emphasis on diversity, equity, and inclusion. There's no need to really commit; just need to green/pink/whatever-washing.</p><p>These are mere marketing tactics, and you have to start adopting them. It's all about going through the motions. Hold a token DEI session during the quarterly All-Hands meeting. Toss in a work-from-home day to show off your "hybrid" work model. And of course, don't forget to swap out the company logo for a rainbow version every June. You know the drill, it's part of the playbook.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3qsc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3qsc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 424w, https://substackcdn.com/image/fetch/$s_!3qsc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 848w, https://substackcdn.com/image/fetch/$s_!3qsc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!3qsc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3qsc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139279,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3qsc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 424w, https://substackcdn.com/image/fetch/$s_!3qsc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 848w, https://substackcdn.com/image/fetch/$s_!3qsc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.png 1272w, https://substackcdn.com/image/fetch/$s_!3qsc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F501c40d0-d603-421e-a5ca-bfa2f8445f0c_2238x1186.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>2. Bother them</h3><p>This might seem quite vague, but the concept is actually very simple. Workers should never feel calm and safe at work. You always need to give them small daily shocks, disturbances, and unpleasant inputs. You have to set a higher bar for stress and anxiety in the workplace.</p><p>Let me give you a few examples to help you understand what I am talking about:</p><ul><li><p>Invite employees to a mostly pointless face-to-face meeting, giving them one or two weeks' notice. Needless to say, the shorter the notice and the longer the journey (e.g. another country or continent), the better. Occasionally, it's necessary to disrupt their personal lives for a few days, causing issues for their families. This is an ideal way to filter out individualists and keep as many workaholics as possible. Over time, they will increasingly focus on the only thing left in their lives: their job.</p></li><li><p>Every decision must be prepared with an <strong>anxiety hype</strong>. There is no need to simply announce to people what you have decided. It&#8217;s much better to follow what every AAA game studio and film company has been doing during the last few years, for example:</p><ul><li><p>Announce in a public channel or by email that something important is going to change.</p></li><li><p>Schedule a meeting titled with &#8220;IMPORTANT&#8221; with no further details in the description, or just something allusive but also ambiguous.</p></li><li><p>Don&#8217;t answer any questions about what&#8217;s happening, and don&#8217;t give any details to the lower levels. They have a closer relationship with workers, and there is the risk they might reveal something.</p></li></ul></li><li><p>Waste some of their time. Create dedicated daily/weekly meetings for each core service, project, process, even better if managed by a TPM/PM/APM who controls and leads every single decision, implementing a proper micromanagement.</p></li><li><p>Set strategic and recurring meetings at annoying hours. These are very important to eliminate any sense of flexibility they might have. A standup at 8:30-9 AM to disrupt the school run of a parent, or preventing commuters from getting a slightly later train to avoid peak hours. Scheduling a recurring retrospective meeting at lunchtime or 5:30 PM are also great ideas.</p></li><li><p>The default setting for the company calendar should be kept as private. Employees should not be aware in advance of what management is discussing, or even that a meeting is taking place and who is participating. As a bonus, occasionally invite an employee to an ongoing meeting, with a vaguely plausible reason.</p></li><li><p>Only discuss planning and important matters at the highest level possible. At most, you should reach out to their team lead, staff engineer, or engineering manager, depending on your organizational structure.</p></li></ul><h3>3. Transparency</h3><p>Speaking of values, transparency has never been a thing so far. Unfortunately, as we said, the current trend puts some emphasis on it. Your role is to provide some sort of transparency on business facts and demand the same from employees. Of course, you just need to pretend on your side. The purpose is to preserve in your staff the bare minimum sense of trust, especially when you can&#8217;t completely control them in an office as it was before.</p><p>A few concrete actions:</p><ul><li><p>Hold sporadic town hall meetings where superficial issues are discussed, but real concerns are brushed aside or ignored. The most important thing is to give them the impression that decisions have been made between the last and the current session, after gaining their feedback.</p></li><li><p>Share only convenient news (positive or negative, depending on the period) or partial information while concealing critical details on current developments.</p></li><li><p>Organize events where executives make brief appearances or give scripted speeches without engaging in meaningful dialogue or addressing employee questions. Be sure that if there is a Q&amp;A session, to open the Slido/Dory/Mentimeter as close as possible to the meeting and not leave it open during the meeting itself, so there is enough time to prepare the blowing smoke answers. Needless to say, disable the possibility for anonymous questions. If too many complaints arise (it will happen), just make sure to have VPs/Directors conduct similar sub-org meetings where Q&amp;A is live, allowing them to show a smaller audience the humanity of the company. <em>Divide et impera</em> is key to handling uprising.</p></li><li><p>Establish ethics hotlines for reporting misconduct, mobbing, overtime work, and harassment, put HR in front of employees, and let them play with the brick wall. Sometimes this is also required by local laws, so you have to do it anyway.</p></li></ul><h3>4. Engineering</h3><p>This topic needs a separate chapter. Software engineers tend to be anarchic, often individualistic, and it&#8217;s difficult to impose nonsense and incoherence on them. You hired them precisely for that reason.</p><p>Your engineering culture has also been shaped by the ingress filter you established in your selection process. There is a clear trade-off: the smartest engineers are often the most problematic when it comes to making hard decisions, while the more accommodating ones aren&#8217;t as performant during stable periods. Even though not always possible, to achieve the best results, you are better off implementing the following measures using the boiling frog technique, letting them adapt to small changes over time.</p><p><strong>Reorg</strong>: Keep doing reorgs. Something doesn&#8217;t work? Reorg. Lack of strategy? Reorg. Don't let engineers get too close to their teammates or too comfortable in their roles and areas of expertise, as they could become bottlenecks or be hard to replace later on. In general, reorganizations offer executives so many benefits that they would need a whole book to cover the subject.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cWfM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cWfM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cWfM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cWfM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cWfM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cWfM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg" width="900" height="280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:280,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70441,&quot;alt&quot;:&quot;&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;: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_!cWfM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cWfM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cWfM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cWfM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6e288b5-c858-4640-afef-57e0adaf5872_900x280.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><p><strong>Feedback illusion</strong>: Occasionally, make them feel like their feedback is valued by pretending to listen to their ideas. Carry out engineering surveys now and then, and hold unproductive skip-level meetings every six months to maintain the illusion.<strong><br><br>Ownership</strong>: Shared ownership could be a headache for management. From your perspective, it might work for some low-maintenance tasks, but for new developments and cutting-edge projects, ownership should lie with the aforementioned *PM. It's much better to have control over a small group of puppets, rather than empowering your teams and allowing them to plan and design their own projects. Engineers often complain about quality, but that's not really something we should prioritize. The business must be profitable, and engineering just needs to serve its purpose being standardized enough so that we can replace workers if needed. As a side note, Java/.NET/React, and any industry-standard language or framework, perfectly serve this exact objective.</p><p><strong>Gradually shift back to a blameful culture</strong>: Blameless culture stepped in a few years ago. It was so easy to identify a specific person for an incident. Now things have gotten more complicated. There must be a process that identifies a root cause, and then there are some actions to take. Engineers love that. But at the higher levels, you don&#8217;t. <br>People need to assign human responsibility. For many law systems, fault is individual, and even when an automatic process is involved, down the line one or more physical individuals have to pay in some form or another. We can&#8217;t accept that an algorithm or an AI model killed a person driving a car, and the same is here.<br>There is no need to remove their beloved blameless processes, just attach the final ownership of a product or service to a single person so that they will have full responsibility, whatever happens.</p><p><strong>Embrace Silos</strong>: In recent years, "silo" has almost become a swearword, along with "technical debt." The reality is that silos can be beneficial from a management perspective. They allow for better identification of who is working on what, and reduce the possibility of leaks of corporate secrets. Segregation is key. IT team is your best ally here, just go and request separate and granular access for repositories, services, and contributions. Communication channels in Slack/Discord/Teams should be kept private, there's no need for people to pry into others' conversations. Knowledge sharing is something engineers love to talk about, but they simply want to stick their noses into others&#8217; affairs in the name of collaboration.</p><div><hr></div><p>Entropy is the natural direction of the universe, and sabotaging culture is certainly easier than creating it, but a proper work still requires some dedication.</p><blockquote><p><a href="https://www.linkedin.com/posts/rupertbreheny_google-layoffs-bigtech-activity-7160242469396238336-HJoL">Culture eats strategy for breakfast.</a></p></blockquote><blockquote><p>&#8220;<a href="https://ln.hixie.ch/?start=1700627373&amp;count=1">Decisions went from being made for the benefit of users, to the benefit of the company, to the benefit of whoever was making the decision.</a>&#8221;</p></blockquote><div><hr></div><p>If you liked this post, consider subscribing to receive new posts, or <a href="https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fblog.alaindichiappari.dev%2Fp%2Fsabotage-101-company-culture-meltdown&amp;t=Sabotage%20101%3A%20Company%20Culture%20Meltdown">sharing it on Hacker News.</a></p>]]></content:encoded></item><item><title><![CDATA[Death by configuration parameters - Where to place complexity?]]></title><description><![CDATA["A Philosophy of Software Design" pt.3]]></description><link>https://blog.alaindichiappari.dev/p/death-by-configuration-parameters</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/death-by-configuration-parameters</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Wed, 27 Dec 2023 07:30:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sbSH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the second chapter of this series (<a href="https://weekendengineering.substack.com/p/must-classes-be-small-wrong-question">Must classes be small?</a>) we explored how deeper modules provide a significantly better interface, concealing complexity and enhancing clarity and readability. However, this improvement does not come without a cost. It demands better design and more thoughtful choices.</p><p>A crucial factor in this process is complexity management, and we understand that it is not always feasible to eliminate it entirely. Sometimes, it is inherent in the domain we operate in, or it arises from real-world scenarios. Additionally, in many 'fast-paced' work environments, those who contribute (directly or indirectly) to the design of a system are often rewarded for short-term choices rather than for long-term sustainability.</p><h4>Unavoidable complexity</h4><p>Eliminating any other source of avoidable (although with some associated cost and trade-off) complexity, let's assume you find yourself confronted with an inherently complex scenario, and you are tasked with deciding how to address it. A common situation arises when developing a library or module responsible for sending requests over the network. Due to its intrinsic nature, instability may occur, necessitating the implementation of a retry logic.</p><p>In poorly written software, this is often managed by either incorporating the logic into the module but exposing certain non-optional configuration parameters (such as timeout seconds, the number of retries, backoff strategy...) to handle it, or in the worst-case scenario, it is entirely delegated to the module's users.</p><p>As we mentioned, the primary objective is to consistently simplify the experience for users (i.e., other developers, end-users, sysadmins) when constructing modules. When developing, the focus is on maintaining a straightforward interface for common scenarios, ensuring that users can solve their problems without delving into intricate technical details. While it may be tempting for module developers to address easy issues and pass on the tougher ones &#8212; <strong>perhaps by throwing exceptions, introducing numerous configuration parameters, or overloading the API to shift responsibility of the software's runtime behavior</strong> &#8212; the core principle remains centered on user-friendly functionality.</p><p>What is important to understand is that the short-term approach is even detrimental for us since changing our interface (through exceptions or function/API/config parameters) ties our hands if we want to improve things in the future, forcing us to introduce breaking changes that we could have avoided. This is an additional cost, as we often need to support many versions simultaneously. This cost was hidden at the time of our poor decision, and now it&#8217;s coming back to hit us in the face.</p><h4>Pulling complexity up or down?</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sbSH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sbSH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 424w, https://substackcdn.com/image/fetch/$s_!sbSH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 848w, https://substackcdn.com/image/fetch/$s_!sbSH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 1272w, https://substackcdn.com/image/fetch/$s_!sbSH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sbSH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png" width="1456" height="1205" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1205,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177541,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sbSH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 424w, https://substackcdn.com/image/fetch/$s_!sbSH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 848w, https://substackcdn.com/image/fetch/$s_!sbSH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.png 1272w, https://substackcdn.com/image/fetch/$s_!sbSH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32fdd0ee-ae70-4fe9-83c3-7beeffb9723b_1530x1266.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>With all of this in mind, it is pretty clear that it is often better to pull complexity downward, but it should always be framed in the wider realm of <strong>minimizing the overall system complexity</strong>. As Ousterhout points out in the book, pulling complexity down is most valuable when:</p><ul><li><p>The complexity being pulled down is closely related to the class&#8217; existing functionality (e.g. retry-timeout loops in a client hiding API calls).</p></li><li><p>Pulling the complexity down will result in simplifications elsewhere in the application (the retry-loop is handled in a single place and reused everywhere in the module).</p></li><li><p>Pulling the complexity down simplifies the class&#8217; interface (for the most cases, if not all, there&#8217;s no need to expose our users to the network instability management details).</p></li></ul><h4>Reasonable defaults</h4><p>In conclusion, if there is something to take with you, it&#8217;s the question: "Will your users (or any upper-level module) be able to determine a better value than we can determine here?" Often the answer is no, and providing reasonable defaults or, better yet, a self-discovering mechanism to set these parameters (think about TCP congestion control) is the way to go to keep things simple (for them) at our cost for sure, but for long-term sustainability.</p>]]></content:encoded></item><item><title><![CDATA[Must classes be small? Wrong question.]]></title><description><![CDATA["A Philosophy of Software Design" pt.2 - Deep vs Shallow modules]]></description><link>https://blog.alaindichiappari.dev/p/must-classes-be-small-wrong-question</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/must-classes-be-small-wrong-question</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sun, 03 Dec 2023 15:38:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YbO0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s start from real code. Take a look at these two snippets.</p><p>This represents the signatures of the five basic I/O UNIX system calls:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XKfj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XKfj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 424w, https://substackcdn.com/image/fetch/$s_!XKfj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 848w, https://substackcdn.com/image/fetch/$s_!XKfj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 1272w, https://substackcdn.com/image/fetch/$s_!XKfj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XKfj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png" width="834" height="192" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:192,&quot;width&quot;:834,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57569,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XKfj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 424w, https://substackcdn.com/image/fetch/$s_!XKfj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 848w, https://substackcdn.com/image/fetch/$s_!XKfj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 1272w, https://substackcdn.com/image/fetch/$s_!XKfj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f38e9f-d1c2-4e0e-800d-c1945456da07_834x192.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>And this was the old/classic way in Java to open a file and read it into serialized objects:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XA3m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XA3m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 424w, https://substackcdn.com/image/fetch/$s_!XA3m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 848w, https://substackcdn.com/image/fetch/$s_!XA3m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 1272w, https://substackcdn.com/image/fetch/$s_!XA3m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XA3m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png" width="1032" height="142" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:142,&quot;width&quot;:1032,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56629,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XA3m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 424w, https://substackcdn.com/image/fetch/$s_!XA3m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 848w, https://substackcdn.com/image/fetch/$s_!XA3m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 1272w, https://substackcdn.com/image/fetch/$s_!XA3m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fc5799a-d62b-476d-b3ec-4ed9d96be45d_1032x142.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>You don't have to be a C expert or a Java expert. Obviously, we are not even comparing the same thing, but are you able to notice something in terms of abstraction?</p><p>On one hand, we have the simplicity (some would say the beauty) of the UNIX interface, concealing incredibly complicated abstractions and underlying behaviors. Just think about the many different scenarios this interface allows to be used in. On the other hand, we can see a somewhat cumbersome surfacing of lower-level details. In Java, a FileInputStream lacks buffered I/O and serialization support, requiring explicit use of BufferedInputStream and ObjectInputStream to address these limitations. This explicit need is dictated by the unfortunately chosen default behavior, not well-balanced in this interface design.</p><div><hr></div><p>Software design is a complex process, and managing this complexity is crucial for creating maintainable and scalable systems. In his book "A Philosophy of Software Design," John Ousterhout explores the concept of deep vs shallow modules, shedding light on a fundamental principle in software design.</p><p><strong>Modular Design</strong></p><p>The cornerstone of Ousterhout's philosophy is modular design, where a software system is decomposed into modules, each serving a specific function. These modules, whether classes, subsystems, or services, aim to be relatively independent. While the ideal of complete independence is unattainable due to necessary interactions between modules, the goal is to minimize <strong>dependencies</strong>, allowing for easier maintenance and modification.</p><p>To manage dependencies effectively, we have to understand the role of interfaces, including formal and informal elements. Formal elements, explicitly specified in the code, include method signatures and class attributes, as obvious. Informal elements, usually described through comments or documentation in general, encompass high-level behaviors and usage constraints. A well-defined interface helps developers understand what is essential for utilizing a module, mitigating the "unknown unknowns" problem.</p><p><strong>Abstractions</strong> play a key role in modular programming, providing simplified views of entities by omitting unimportant details. In the context of modules, the interface serves as an abstraction, presenting a streamlined perspective of the module's functionality while hiding implementation intricacies. Ousterhout emphasizes the need to discern what details are truly important to avoid both unnecessary complexity and obscurity.</p><h4>Deep vs Shallow Modules</h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YbO0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YbO0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 424w, https://substackcdn.com/image/fetch/$s_!YbO0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 848w, https://substackcdn.com/image/fetch/$s_!YbO0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 1272w, https://substackcdn.com/image/fetch/$s_!YbO0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YbO0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png" width="1232" height="848" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:848,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70890,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YbO0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 424w, https://substackcdn.com/image/fetch/$s_!YbO0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 848w, https://substackcdn.com/image/fetch/$s_!YbO0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.png 1272w, https://substackcdn.com/image/fetch/$s_!YbO0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23d1f15-455c-4e93-8366-e2b70746cfc2_1232x848.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>Deep Modules: &#8220;Less is better and hide complexity&#8221;</strong></p><p>The concept of deep modules encapsulates the idea that the best modules offer powerful functionality with simple interfaces. Visualizing modules as rectangles, the area represents functionality, and the top edge signifies interface complexity. Deep modules provide substantial benefits with minimal costs, as their interfaces hide internal complexities. Examples such as the Unix I/O interface or garbage collectors (where the interface is mostly zero) showcase the effectiveness of deep modules in providing powerful abstractions.</p><p><strong>Shallow Modules: &#8220;More is better and expose complexity&#8221;</strong></p><p>Conversely, shallow modules have relatively complex interfaces compared to the functionality they provide. <br>Sometimes, we end up with shallow modules due to laziness in the design process, simply accepting requests for new features and adding them on top of what we have, instead of thinking ahead (see <em><a href="https://weekendengineering.substack.com/p/tactical-vs-strategic-developers">Tactical vs Strategic Developer</a></em>) about how to prepare our software to accept changes. When the time arrives, we should pause and consider the best way to incorporate these changes. You may even discover that the best course of action is to not add them at all, or that the initial thought you had was merely a shortcut rather than a wise design decision. <br>Sometimes, the system is already designed in such a way that keeping the abstraction simple becomes too complicated or expensive. Once again, we may have overlooked something in the design process so far, and in the worst-case scenario, we should at least try to mitigate the problem instead of relying on the fact that anyway we are already working on something broken. <br>In general, while occasionally unavoidable, shallow modules contribute less to managing complexity and lead us into a vicious cycle that incrementally worsens the quality of our system and interfaces.</p><h4>Classitis</h4><p>Many of us have heard something like, &#8220;A class should be at most X lines of code&#8221; or &#8220;A method/function longer than Y lines of code must be split into multiple methods/functions&#8221;. This is sometimes blindly taken to the extreme without considering the specific case or, even worse, without considering the damage brought at the interface level. Think about jumping around in a codebase, navigating from a small function to a small function, only called from one or two points in the code and exposing an obscure subset of parameters, clearly part of a higher business logic. You clearly feel lost. Does this sound familiar?</p><p>Ousterhout refers to this phenomenon as &#8220;<strong>classitis</strong>&#8221;, the tendency to promote numerous small classes, overlooking the risks of verbose code, escalating complexity, and shallow interfaces.</p><h4>Conclusion<br></h4><p>In conclusion, when designing a module, a system, an API, a service, a library, or a function, don&#8217;t just rely on principles that sound cool on paper. Ask yourself what the real outcome of your decision and design is. It could be something small, like adding a parameter to a function or exposing a seemingly insignificant implementation detail to the user of your interface. Designing deep classes and dividing your module interface from its implementation hides complexity, allowing users to interact with a simplified abstraction that prioritizes common use cases.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Tactical vs Strategic Developers]]></title><description><![CDATA["A Philosophy of Software Design" pt.1]]></description><link>https://blog.alaindichiappari.dev/p/tactical-vs-strategic-developers</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/tactical-vs-strategic-developers</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Wed, 22 Nov 2023 07:15:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/efc0f7be-5adc-42a3-be81-6c52b244ebad_800x618.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the world of software creation, developers have different ways of thinking and working. In his enlightening book "A Philosophy of Software Design," John Ousterhout talks about the ideas and methods that make software design work well (or at least better). One important thing he discusses is the difference between tactical and strategic developers. This helps us understand the various approaches these developers use when creating software, and why the modern approaches that companies adopt bring to a dangerous path.</p><h3>The Divide</h3><h5>Tactical Developers</h5><p>Tactical developers are often focused on the immediate tasks at hand. They are adept at solving specific problems quickly and efficiently (often in terms of their time). These developers excels or just focus in coding and implementing features, demonstrating proficiency in the tactical aspects of software development. Their skills lie in writing code, fixing bugs, and ensuring that the software functions as intended at a first glance.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>However, the drawback of a purely tactical approach is the potential for shortsightedness. Tactical developers may prioritize quick fixes over long-term sustainability, leading to a codebase that becomes increasingly complex and difficult to maintain over time.</p><h5>Strategic Developers</h5><p>On the other hand, strategic developers take a more holistic view of software design. They are concerned not only with the current problem but also with how their solutions fit into the broader context of the entire system. Strategic developers focus on creating a maintainable, scalable, and adaptable architecture.</p><p>Ousterhout emphasizes the importance of strategic thinking in software design. Strategic developers invest time in designing abstractions, creating modular and reusable components, and considering the long-term implications of their decisions. While this approach may take more time upfront, it pays off in terms of the system's ability to evolve and adapt to changing requirements.</p><h3>The flaws of the &#8220;modern approach&#8221;</h3><p>In the evolution of modern software development practices, the emphasis on metrics such as velocity, inspired by frameworks like <a href="https://www.sumologic.com/glossary/dora-metrics/">DORA</a>, has been both a bless and a pitfall for companies. </p><p>While the intention behind adopting these metrics is often to streamline processes, reduce friction, and enhance overall efficiency, a common trap arises when organizations prioritize numerical outcomes over the qualitative experiences of their engineering teams. </p><p>In an environment driven by a relentless pursuit of faster pull request production and higher velocity, there is a risk of inadvertently fostering a culture that incentivizes individualistic behaviors and shortcuts. This can result in a focus on meeting numerical targets at the expense of thoughtful and sustainable software development practices. Striking a balance between quantitative metrics and a qualitative understanding of engineers' experiences is crucial to nurturing a healthy and sustainable software development culture. Companies should recognize the importance of creating an environment that values collaboration, innovation, and the long-term well-being of their development teams, rather than solely fixating on numerical indicators.<br><br>This focus on fast feature delivery and hitting numerical targets (un)intentionally allows a build-up of unavoidable (and accepted) technical debt, shortcutting on hasty decisions making the codebase harder to maintain. </p><p>Instead of addressing the root problem, some companies accept this as a normal part of the process. They try to manage the consequences without realizing that their development principles might be flawed. A classical example of this is Facebook/Meta, which shifted from "Move fast and break things" to "Move fast with stable infrastructure" recognizing at some point that their initial approach, while promoting innovation, was increasingly causing problems and accumulating technical debt brought to unmaintainable and unstable systems. </p><p>To break this cycle, probably companies need to rethink their fundamental principles and create a more sustainable and resilient software development culture, accepting that engineers are not working in an assembly line and that <strong>software creation is still art and craft</strong>.</p><div id="youtube2-gwLQMuTspxE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;gwLQMuTspxE&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/gwLQMuTspxE?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><h3>In conclusion</h3><p>Optimizing investment in software design is crucial for long-term success. Emphasizing the drawbacks of a large upfront investment (think about the old waterfall method), the suggestion of Ousterhout is to favor a continuous, smaller investment approach, dedicating approximately 10'-20% of total development time. While this may slightly extend project timelines initially, the resulting enhancements in software design become evident within a few months, ultimately accelerating development speed as a consequence and not as a requirement.<br>Investing in good design is a continual effort that pays off in the long run. Small, consistent investments prevent minor issues from snowballing into major problems. It's essential to adopt a strategic approach consistently and view investment as a present-day necessity, not a future task. Postponing cleanups during a crunch is tempting but risky, as it often leads to a perpetual cycle of delays and a shift toward tactical approaches. The longer design problems linger, the more challenging they become to address.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Code Review]]></title><description><![CDATA[My point of view and takeaways]]></description><link>https://blog.alaindichiappari.dev/p/code-review</link><guid isPermaLink="false">https://blog.alaindichiappari.dev/p/code-review</guid><dc:creator><![CDATA[Alain Di Chiappari]]></dc:creator><pubDate>Sat, 04 Mar 2023 06:49:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/345c6152-5141-450b-a4ae-6089460b70df_800x600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Code review is an essential part of any software development process, and it can have a significant impact on the quality and maintainability of the codebase. However, the way code review is conducted can vary greatly depending on the team's size, experience, and the type of project being developed.</p><h3>Tradeoffs</h3><p>Sometimes I see a dogmatic approach that some people take towards code review, which can be time-consuming and resource-intensive. I think we need to adopt a pragmatic approach that recognises the tradeoffs every company must consider, especially smaller ones, deeply involved in scaling themselves and working iteratively towards their main goals, survive and grow. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>By being more flexible in the way code review is conducted, companies can achieve a more efficient and effective process that is tailored to their specific needs and resources. This approach can help to strike a balance between maintaining code quality and productivity, which is critical for companies seeking to grow and succeed in today's competitive market.</p><p>In this blog post, we will explore some pragmatic approaches to conducting code reviews and highlight some key takeaways. You can apply just some of them, depending on the repository, system component, pull request, and seniority or code-specific knowledge of the engineer(s) involved.</p><h3>Ease your life beforehand</h3><p>Having pre-work done, such as setting up a CI/CD pipeline for testing, linting, formatting, measuring performances is critical in ensuring code quality, reliability, and maintainability. Also, it can be handy to leverage <a href="https://blog.devgenius.io/automate-unit-tests-before-each-commit-by-git-hook-f331f0499786">git hooks</a>, where possible, to address a subset of these.</p><p>These tools help to automate and streamline the development process by detecting and fixing minor issues, improving code consistency, and reducing the reviewer effort, especially onboarding new engineers in the team that are not familiar with code style and best practices. </p><p>A well-designed CI/CD pipeline can catch issues early in the development cycle, enabling developers to address them quickly before they cause significant problems. By using these tools, developers can focus on writing high-quality code that meets business requirements, and reviewers can focus on the important stuff. </p><h3>The role of submitter</h3><p>The submitter of the pull request plays a critical role in ensuring the smooth and efficient code review process. To help facilitate this process, teams should provide clear onboarding instructions on what to do before submitting a pull request for peer review. <br>This can include expectations such as:</p><ul><li><p>Sounds obvious but, documenting code with inline comments in the trickiest parts, as well as documenting changes in the pull request description (<a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository">use templates</a>!). </p></li><li><p>If there is no process in place for assigning a reviewer, the submitter can reach out to their team lead for guidance. Github can be configured to automatically assign them for you based on the repository.</p></li><li><p>Additionally, if the change is significant, it can be helpful to include a diagram. If you are developing or modifying a workflow or a non-trivial algorithm, a flowchart provides an immediate overview to the reviewers. As a side note, it&#8217;s a best practice to do this <strong>before</strong> the change, don&#8217;t need to say why.</p></li></ul><p>By following these guidelines, submitters can ensure that their code changes are clearly documented, and reviewers can quickly understand the proposed changes, leading to a more efficient and effective code review process.</p><h3>Reading, Understanding, and Running Locally</h3><p>One of the most fundamental aspects of code review is to read and understand the code changes thoroughly. This involves analysing the proposed changes to ensure they align with the project's objectives, adhere to best practices and standards, and are well-documented.</p><p>Running the code changes locally can be essential sometimes, as it enables the reviewer to test the functionality and identify any potential issues that may not be immediately evident from a code review. Additionally, it helps to ensure that the code integrates seamlessly with the existing codebase and spotting issues in the development setup such as dependency problems or versions mismatching.</p><h3>Level of Depth</h3><p>Code reviews can vary in-depth, depending on the size and impact of the changes. For minor changes (e.g. renaming a local variable in a statically typed language), a brief review may be sufficient, while larger changes may require a more detailed review.</p><p>In general, and considering the assumptions above, code reviews should focus on the most critical aspects of the code changes, such as the logic, functionality, and performance. More on this later on.</p><p>Reviewers should also ensure that the changes are consistent with the project's style and guidelines whereas they can&#8217;t be addressed by a linter. In many languages exist dozens of ways to do the same thing, these is fun for sure, but can (and it does) reduce the overall readability of your codebase. I do really recommend, despite being technical and vertical on Go, the <a href="https://go.dev/doc/faq">Golang FAQ</a> to have a grasp of what I mean.</p><h3>Number and &#8220;role&#8221; of Reviewers</h3><p>The number of reviewers involved in a code review can vary depending on the project's size, complexity, and team structure. However, having at least two reviewers can provide a balanced approach.<br>They can play the same role, doing a both generic review, but from time to time I&#8217;ve found another approach working better, splitting their focus/time (which are limited) in technical aspects (language gotcha, readability, dev tools etc.) and business logic, especially where it is impacted by the change.</p><p>Having a subject matter expert on the project or repository can be particularly helpful in ensuring that the proposed changes align with the project's objectives and are consistent with the existing codebase. In some companies, for the same reason, a language-specific review (conducted by a more expert engineer) is required to achieve a good quality code and at the same time growing the language expertise of the submitter, which will not require this level of review later on.</p><h3>Conclusion</h3><p>In conclusion, conducting code reviews is an essential part of our engineering life, and of software development, it needs to be conducted with a pragmatic approach and considering the tradeoffs and specificity of our pull request, codebase, team and company objectives.</p><p>Teams should automated as much as possible from the beginning, in order to alleviate the burden of long and consequently weak reviews. Therefore, by prioritising the core logic, reviewers can work towards improving the overall team in both general aspects such as language, code style, and skills, as well as specific aspects such as the codebase, business logic, and team knowledge.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.alaindichiappari.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Weekend Engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>