<?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[Rethinking Software]]></title><description><![CDATA[Calling it a "Best Practice" does not make it so.]]></description><link>https://rethinkingsoftware.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Ldi0!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ae0c8b-f638-4b7a-ad47-78db276aa38e_285x285.png</url><title>Rethinking Software</title><link>https://rethinkingsoftware.substack.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 24 Jul 2026 18:37:59 GMT</lastBuildDate><atom:link href="https://rethinkingsoftware.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Adam Ard]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[rethinkingsoftware@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[rethinkingsoftware@substack.com]]></itunes:email><itunes:name><![CDATA[Adam Ard]]></itunes:name></itunes:owner><itunes:author><![CDATA[Adam Ard]]></itunes:author><googleplay:owner><![CDATA[rethinkingsoftware@substack.com]]></googleplay:owner><googleplay:email><![CDATA[rethinkingsoftware@substack.com]]></googleplay:email><googleplay:author><![CDATA[Adam Ard]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Future Scrum Resistance]]></title><description><![CDATA[There isn&#8217;t much room left for developers to resist Scrum.]]></description><link>https://rethinkingsoftware.substack.com/p/future-scrum-resistance</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/future-scrum-resistance</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sun, 15 Feb 2026 22:30:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ldi0!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ae0c8b-f638-4b7a-ad47-78db276aa38e_285x285.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There isn&#8217;t much room left for developers to resist Scrum.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>When the decision to do Scrum is made several levels above the programmer, and retrospective meetings (if they happen at all) never address problems with Scrum itself, and Jira (with its required fields and workflows) cannot be modified by developers, and management won&#8217;t engage with our complaints, we are pretty much stuck. </p><p>If companies continue to operate like this, we&#8217;re going to have to get more creative.</p><p>Here are a few of my latest thoughts on the issue:</p><h4><strong>1. Start Your Own Business or Do Freelance Work</strong></h4><p>This is the path I am most focused on lately, and I hope to provide some useful references soon. I'm chronicling my journey on this road as it unfolds and hope it will be encouraging for others to read about. Wish me luck! The idea here is to exit the system altogether. If working for others is going to be this painful, then starting a company can&#8217;t be any worse. Right?</p><h4><strong>2. Shadow Projects</strong></h4><p>Shadow projects are when you do your own thing, but you are still at work. It&#8217;s stuff that will help the company that isn&#8217;t necessarily &#8220;prioritized&#8221; or &#8220;sanctioned.&#8221; You work on it (secretly) alongside your normal work.</p><p>The key shift here is asking forgiveness instead of permission. Because backlogs take all the control away from individual engineers, secretly working on things that you feel are important and/or interesting is a way to take some control back.</p><h4><strong>3. Civil Disobedience</strong></h4><p>One place I worked, I stopped attending my daily stand-ups&#8212;in protest. The Scrum Master wouldn't allow the team any control or even time to coordinate our day. As soon as members were finished reporting their status (yesterday-today-no-blockers style), he would abruptly end the meeting. By skipping it, I never missed a thing. More than that, the tone of the meeting was confrontational and anxiety-inducing. I told HR the meetings were causing me mental distress.</p><p>Eventually, HR determined that Scrum was an "industry standard," so I had no recourse. My boss gave me a written warning that if I did not return to stand-ups, I would be terminated.</p><p>Eventually I caved and returned to my stand-up meetings (and started interviewing for a different job), but this action demonstrated a glimmer of potential. I could tell my manager was quite distressed to start down the path of firing me (I was the team lead, had positive annual reviews, was liked by many high-ranking engineers, and had recently received an award for teamwork). Had I not been the only one actively resisting Scrum (everyone hated it but few took step to fight it), or HR had more actively investigated my situation, I may have gotten more traction.</p><p>In retrospect, I wish I had held firm to at least see what would happen&#8212;I think I had more leverage than I realized. Regardless, I learned an important lesson. Civil disobedience has potential. If deployed effectively, it could be a powerful tool.</p><h4><strong>4. Malicious Compliance</strong></h4><p>When work requirements are clearly ridiculous, one option is to simply comply. Do everything they tell you to&#8212;even though you know it will torpedo the project. Don&#8217;t go above and beyond to rescue it; let the system play out as instructed. Just let the ship go down. In the wake of catastrophe, if you can clearly demonstrate there was zero negligence on your part, then (maybe) the system will take the blame.</p><p>This isn&#8217;t sabotage. It&#8217;s obedience&#8212;letting the system reveal its own flaws without rescuing it.</p><p>But beware. When a project fails, accusations will fly. For the most part, developers are not present in the right meetings to rebut or even be aware of many of the arguments hurled against them. So, your case has to be air-tight and self-evident&#8212;perhaps even presented in writing to provide a presence even in closed-door meetings where developers are not permitted.</p><h4><strong>5. Unions</strong></h4><p>I haven't looked too deeply into this option, but it's the classical way for workers to gain workplace representation. It has worked in other industries, so I think it has potential in ours. While I am most inclined to put my energy into starting my own company, I wholeheartedly support anyone else&#8217;s effort on this front&#8212;and would love to re-stack other people's research on the topic.</p><h4><strong>6. S</strong>pread Awar<strong>eness</strong></h4><p>Keep talking and writing about the realities of forced Scrum. Share stories, document the harms, and expose the contradictions. It may take time, but as more people speak up and the costs of the system become undeniable, change will follow. History shows that flawed systems eventually crumble&#8212;but only if the truth is continually on display.</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>By Scrum, I mean ALL Scrum. It doesn&#8217;t really matter how you do it. Whether it&#8217;s completely by the book or you roll your own Scrum-like Frankenstein monster, it always sucks&#8212;because it always starts from the same <a href="https://rethinkingsoftware.substack.com/p/what-agile-is-not">flawed assumptions</a>. </p></div></div>]]></content:encoded></item><item><title><![CDATA[People Over Process]]></title><description><![CDATA[A Meditation for Managers]]></description><link>https://rethinkingsoftware.substack.com/p/people-over-process</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/people-over-process</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Fri, 01 Aug 2025 03:56:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-vR8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.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_!-vR8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-vR8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!-vR8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!-vR8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!-vR8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-vR8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png" width="727.9971313476562" height="727.9971313476562" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:727.9971313476562,&quot;bytes&quot;:2243061,&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://rethinkingsoftware.substack.com/i/169806201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-vR8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!-vR8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!-vR8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!-vR8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce4fa01-0098-4691-9bbd-93bcb7b1505a_1024x1024.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 aria-hidden="true" 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><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>Close your eyes.<br>Take a slow, deep breath.<br>Let your shoulders drop.</p><p>Picture the people who report to you &#8212; your team.<br>Not as a list of names, but as human beings.<br>See each face. Remember each voice.</p><p>Now, think about the mandate they&#8217;ve been given.<br>The problems they are here to solve &#8212;<br>for the customer,<br>for the organization,<br>for the world.</p><p>Hold these two things in your mind:<br>your team, and their purpose.</p><div><hr></div><p>Notice all the other things swirling around them:<br>Schedules. Meetings.<br>Process frameworks. Management dashboards.<br>Stakeholders offering advice &#8212; or demands.<br>Policies. Plans. Projections.</p><p>Some may be useful.<br>Others may not.</p><p>Let&#8217;s return to first principles.<br>Let&#8217;s strip it all away.</p><div><hr></div><p>One by one, imagine removing these external items from your team:</p><p>Wipe away each process &#8212; Scrum, Agile, sprints, estimates, forecasts.<br>Wipe away each policy.<br>Wipe away culture and tradition.</p><p>Keep going until there is nothing left &#8212;<br>no charts, no frameworks, no rituals.<br>Just people, and a goal.</p><div><hr></div><p>Sit in this emptiness.<br>Now, return to each person on your team.</p><p>What energizes them?<br>What are they uniquely capable of?<br>What do they need from you to succeed?<br>What do they want for their own career &#8212;<br>and how can that connect to the team&#8217;s purpose?</p><p>Notice where their personal goals align with the work.<br>Notice where they don&#8217;t &#8212; and what you could do to bridge that gap.</p><div><hr></div><p>Only now may you begin to add things back.<br>Choose the processes that supports them in reaching their goals.<br>Choose policies that protect their time and focus.<br>Choose tools that amplify their strengths.</p><p>Do not slap a pre&#8209;made process over the top of your team &#8212;<br>as if it were one&#8209;size&#8209;fits&#8209;all.<br>Design the process <em>around</em> the people.<br>Tailor it to each unique individual.<br>Around their skills.<br>Around their needs.<br>Around their growth.</p><div><hr></div><p><em><strong>This</strong></em><strong> is what it means to be a manager.</strong></p><p>Open your eyes.<br>Jot down what came to mind.<br>Set yourself to achieving it.</p><p>And every so often, return to this place &#8212;<br>strip away the noise,<br>and remember what is essential:</p><p>People.<br>Purpose.<br>And the space you create for them to succeed.</p>]]></content:encoded></item><item><title><![CDATA[Good Docs Describe, Bad Docs Prescribe]]></title><description><![CDATA[Of the four tenets of the Agile Manifesto, one gets the least attention:]]></description><link>https://rethinkingsoftware.substack.com/p/good-docs-describe-bad-docs-prescribe</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/good-docs-describe-bad-docs-prescribe</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Fri, 25 Jul 2025 02:42:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_Lky!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.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_!_Lky!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Lky!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!_Lky!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!_Lky!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!_Lky!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Lky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3178709,&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://rethinkingsoftware.substack.com/i/169189519?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.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_!_Lky!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!_Lky!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!_Lky!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!_Lky!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf9a6be4-d33c-43d5-91cf-05ac10529e2d_1024x1536.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 aria-hidden="true" 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><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>Of the four tenets of the Agile Manifesto<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, one gets the least attention:</p><blockquote><p><strong>"Working software over comprehensive documentation."</strong></p></blockquote><p>I used to wonder if this line was still necessary. Waterfall is dead, right? We don&#8217;t write 40-page specs anymore. We iterate. We deploy constantly. Who even reads documentation? But then along came <strong>ADRs</strong> &#8212; and suddenly, waterfall was back.</p><p>While documentation isn't forbidden by the Agile Manifesto, it should always take a backseat to the most important document: <strong>the source code</strong>. You&#8217;ll hear people claim that <strong>ADRs</strong>, <strong>RFCs</strong>, and other formats are a modern, Agile-friendly kind of documentation &#8212; sleeker, lighter, more collaborative than the bloated specs of the '80s and '90s. But in practice, they break the single most important rule of useful documentation:</p><blockquote><p><strong>Documentation should describe the current state of software, not future aspirations.</strong></p></blockquote><p>It&#8217;s that simple.</p><p>Documentation that reflects intention, aspiration, or &#8220;alignment&#8221; might <em>feel</em> useful &#8212; but it turns stale the moment real feedback hits. Plans change. Code evolves. No plan survives contact with the enemy.</p><p>That&#8217;s why documentation should follow implementation: to stay grounded in reality, not stuck in a pitch deck. When written too early, docs have a way of becoming gates &#8212; demanding buy-in, slowing progress, inviting bureaucracy.</p><p>Agile isn&#8217;t about asking permission. It&#8217;s about moving fast, learning as you go, and letting the code lead.</p><div><hr></div><h2>Documentation That Fails</h2><p>There&#8217;s a new class of documentation making the rounds in modern software teams. It looks clean. It lives in Git. It uses Markdown and has PRs and approvals. It feels <em>agile-ish</em> &#8212; but functionally, it&#8217;s just hipster waterfall.</p><p>Some common offenders:</p><ul><li><p><strong>ADRs</strong> &#8211; <strong>Architectural Decision Records</strong> are documents used to capture important technical decisions about a system &#8212; typically outlining the context, options considered, the chosen approach, and reasoning behind it.</p></li><li><p><strong>RFCs</strong> &#8211; <strong>Requests for Comments</strong> are documents shared within an organization to propose a change, invite discussion, and gather feedback from stakeholders before implementation begins.</p></li><li><p><strong>Alignment Docs</strong> &#8211; <strong>Alignment documents</strong> are often used when multiple teams are collaborating and want to clarify shared goals, responsibilities, timelines, or interfaces to avoid conflicts and miscommunication.</p></li></ul><p>These docs are clean. Structured. Reviewed. And deeply fictional.</p><p>Agile is iterative. You try, you check, you try again. But these types of documents &#8212; especially when written beforehand &#8212; don&#8217;t reflect that reality. They freeze assumptions before they&#8217;ve been tested and codify them as barriers to change.</p><p>Worst of all, these documents quickly morph from collaborative artifacts to bureaucratic hurdles. Once written, they attract approvers. Suddenly, progress hinges on buy-in. What starts as a discussion becomes a checkpoint &#8212; a justification &#8212; a gate. And who benefits from that? Usually not the engineers. These docs tend to serve management&#8217;s need for perceived control more than a developer&#8217;s need for real clarity.</p><div><hr></div><h2>Coding Is More Like Painting</h2><p>When painting, you draw a few lines. Step back. Add a little color. Erase something that felt wrong. You start to get a sense of what the painting wants to become. That&#8217;s the process.</p><p>Writing an <strong>ADR</strong> is like composing a detailed essay about your sketch &#8212; before you&#8217;ve decided whether to keep it, paint over it, or throw the whole canvas out. Even worse, once the essay exists, you&#8217;re obligated to justify why your final painting doesn&#8217;t match the thing you wrote when the canvas was still blank. </p><p>That&#8217;s why <strong>ADRs</strong> and <strong>RFCs</strong> so often become problematic. They:</p><ul><li><p>preserve assumptions that no longer make sense.</p></li><li><p>make it harder to change direction without "justifying the deviation."</p></li><li><p>create process drag instead of technical alignment.</p></li><li><p>encourage teams to commit too early to ideas that haven&#8217;t been pressure-tested.</p></li></ul><p>In fact, if your <strong>ADRs</strong> aren&#8217;t out of date, that&#8217;s a red flag.</p><blockquote><p><strong>If your ADR is accurate after three sprints, you&#8217;re ignoring what the code is trying to tell you.</strong></p></blockquote><p>Good teams learn. They adapt. They refactor. And when they do, the documentation rots. If it doesn&#8217;t, you&#8217;re not learning. You&#8217;re not Agile.</p><div><hr></div><h2>Documentation That Succeeds</h2><p>Documentation that works doesn&#8217;t try to <em>predict</em> the system. It describes it. Faithfully. Honestly. And in sync with reality.</p><p>That means no aspirational roadmaps disguised as design docs. No idealized blueprints frozen in time. Just living documents that reflect what the code <em>actually does</em> &#8212; as it changes.</p><p>Here&#8217;s what tends to work:</p><ul><li><p><strong>Generated docs</strong> &#8212; These are the gold standard for staying accurate. Because they&#8217;re built directly from the codebase, they evolve when the code evolves. API documentation, database schemas, typed interfaces, route maps &#8212; if you can generate it, you should. These docs can&#8217;t drift because they&#8217;re pulled from the source of truth.</p></li><li><p><strong>Inline code comments</strong> &#8212; When kept up to date, these are small but powerful acts of code annotation. They sit where the context lives, next to the logic they describe. They&#8217;re small, conversational, and close enough to get deleted or updated the moment they lie.</p></li><li><p><strong>Project READMEs</strong> &#8212; A well-written README anchors a project. It describes what the code does right now, how to run it, and how to contribute. When maintained alongside the codebase, it becomes the most accessible, low-friction entry point to understanding a system. It's not aspirational &#8212; it's operational.</p></li><li><p><strong>Literate programming</strong> &#8212; This is where narrative and implementation meet. Code and commentary live together, woven into the same artifact. When you explain what your code does in the same place that it does it, you force clarity of thought and invite better structure. Literate programming doesn&#8217;t tell stories about what <em>might</em> exist; it tells the story of what exists <em>now</em>.</p></li></ul><p>All four approaches work because they are anchored to the code itself. They resist drift. They avoid fiction. And most importantly:</p><blockquote><p><strong>They document the system that exists &#8212; not the one someone hoped would exist when they wrote a Google Doc three weeks ago.</strong></p></blockquote><div><hr></div><h2>Can&#8217;t Serve Two Masters</h2><p>Is it any wonder the authors of the Agile Manifesto valued <em>working software over comprehensive documentation?</em> They&#8217;ve seen what happens when teams make documentation the source of truth: endless effort poured into updating, reviewing, versioning, syncing &#8212; and still, it lags behind reality. They've seen documents become bottlenecks waiting for approvals.</p><p>You either prioritize working software or comprehensive documentation. The Agile Manifesto chooses working software. Or as Facebook&#8217;s old hacker culture doc put it:</p><blockquote><p><strong>&#8220;Code wins arguments</strong><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a><strong>&#8221;</strong></p></blockquote><p>You can spend your day updating documentation and chasing signatures &#8212; or you can make real progress in your code. Which would you prefer?</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>https://agilemanifesto.org/</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>https://om.co/2012/02/01/zuckerberg-the-hacker-way/</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Literate Testing]]></title><description><![CDATA[Literate Programming's Killer Feature]]></description><link>https://rethinkingsoftware.substack.com/p/literate-testing</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/literate-testing</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sat, 14 Jun 2025 22:18:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yh3P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.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_!yh3P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yh3P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yh3P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yh3P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yh3P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yh3P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2329726,&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://rethinkingsoftware.substack.com/i/165957171?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.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_!yh3P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yh3P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yh3P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yh3P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a4f6b7f-0494-4788-94a0-8bbf53e950f3_1024x1024.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 aria-hidden="true" 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><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>Literate programming (LP) is good for a lot of things: it keeps your code and documentation in sync, lets you present code in the most logical order, and helps remove stubborn duplication. But most people are unfamiliar with how it works for testing.</p><p>And for testing, LP <strong>soars</strong>&#8212;it may very well be LP&#8217;s killer feature. You can mock, fake, and stub easily&#8212;all without a framework. It works just as well for C/C++ or other compiled languages as for scripting languages. It gives you a clear way to declare which dependencies you're faking and which you're not. And it turns testing into a joy by wiping away boilerplate and letting you think directly in your target language. Integration tests become as easy as unit tests.</p><p>Once you try it, you&#8217;ll never want to go back.</p><h2>Mock a C function</h2><p>Let me whet your appetite with an example. We&#8217;ll build a simple program in C&#8212;a language notoriously difficult to mock without resorting to linker tricks (like `<code>-Wl,--wrap=&lt;func&gt;`</code>) or other ugly maneuvers. Not so with LP. Check it out.</p><p>Here&#8217;s a function that prints the current date repeatedly. It takes one argument: how many times to print the date.</p><p>Below is a literate file<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> called `<code>main.o.md`</code><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>.</p><pre><code># Application Code

## main

```C {tangle=main.c}
#include &lt;stdio.h&gt;
#include &lt;time.h&gt;

@&lt;print_date_repeatedly_def@&gt;

int main()
{
    print_date_repeatedly(10);
}
```

## print_date_repeatedly

```C {name=print_date_repeatedly_def}
void print_date_repeatedly(int count) 
{
    for (int i = 0; i &lt; count; i++) 
    {
        time_t now = time(NULL);
        struct tm *local = localtime(&amp;now);
        printf("%s", asctime(local));
    }
}
```

## Build and Run App

```bash {name=app}
gcc main.c -o app
./app
```</code></pre><p>To run, type the following in terminal in the same directory as this file:</p><pre><code>omd tangle &amp;&amp; omd run app</code></pre><p>You should see the following (with a different date/time though):</p><pre><code>Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025
Sat Jun 14 13:38:40 2025</code></pre><p>Pretty easy. But now let&#8217;s try to <strong>test</strong> it.</p><p>That&#8217;s not so easy.</p><p>Let&#8217;s simplify and say we trust the date/time code, but we still want to test that the output is printed the correct number of times. That should be easy, right? Nope.</p><p>Ideally, we&#8217;d just call `<code>print_date_repeatedly()`</code> with different values for <code>count</code> and check that it prints the expected number of lines. But there&#8217;s a problem: the output goes to `<code>stdout`</code>, so you have to capture it somehow and count the lines.</p><p>Here&#8217;s how you can test it using LP. Just add this section to your `<code>.o.md`</code> file:</p><pre><code># Testing Code

```C {tangle=print_date_repeatedly.c}
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;

int times_called = 0;
int printf( const char* restrict format, ... )
{
    times_called++;
}

@&lt;print_date_repeatedly_def@&gt;

void test_calls(int count)
{
    times_called = 0;
    print_date_repeatedly(count);
    
    // was I called the right number of times?
    if(times_called != count)
    {
        exit(-1);
    }
}

int main()
{
    test_calls(0);
    test_calls(1);
    test_calls(2);
    test_calls(3);
    test_calls(10);
    test_calls(100);
    
    // everything passed
    exit(0);
}
```


```bash {name=test}
gcc print_date_repeatedly.c -o app_test
if ./app_test; then
    echo "Success!"
else
    echo "Failure! Exit code: $?"
fi
```</code></pre><p>This creates a separate test binary that returns `-1` on failure and `0` on success. To run the test:</p><pre><code>omd tangle &amp;&amp; omd run test</code></pre><p>You should see:</p><pre><code>Success!</code></pre><p>Notice how we use the `<code>@&lt;print_date_repeatedly@&gt;`</code> reference to include the same code in both the application and the test. Referencing code this way acts like an automated cut-and-paste&#8212;but better. Instead of importing everything (with all its dependencies), you bring in <strong>just the code you want</strong>.</p><p>In this test, for example, we omit `<code>#include &lt;stdio.h&gt;`</code> so we can safely mock `<code>printf`</code>. And we could do the same thing for <strong>any</strong> function called by `<code>print_date_repeatedly`</code>&#8212;system call or not.</p><p>And the <strong>really</strong> remarkable thing? We don&#8217;t need a library or framework to mock it.</p><p>And this is <strong>C</strong>! Try doing that without LP.</p><h2>A Clean Split</h2><p>With LP, you can place the test code right next to the function it&#8217;s testing. No need to hunt through some distant `tests/` directory. In fact, I recommend splitting the code above into two files: one for `main`, and one for the function (with its tests):</p><h4>main.o.md</h4><pre><code># main

```C {tangle=main.c}
#include &lt;stdio.h&gt;
#include &lt;time.h&gt;

@&lt;print_date_repeatedly_def@&gt;

int main()
{
    print_date_repeatedly(10);
}
```

# Build and Run App

```bash {name=app}
gcc main.c -o app
./app
```</code></pre><h4>print_date_repeatedly.o.md</h4><pre><code># print_date_repeatedly

```C {name=print_date_repeatedly_def}
void print_date_repeatedly(int count) 
{
    for (int i = 0; i &lt; count; i++) 
    {
        time_t now = time(NULL);
        struct tm *local = localtime(&amp;now);
        printf("%s", asctime(local));
    }
}
```

# Testing Code

```C {tangle=print_date_repeatedly.c}
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;

int times_called = 0;
int printf( const char* restrict format, ... )
{
    times_called++;
}

@&lt;print_date_repeatedly_def@&gt;

void test_calls(int count)
{
    times_called = 0;
    print_date_repeatedly(count);
    
    // was I called the right number of times?
    if(times_called != count)
    {
        exit(-1);
    }
}

int main()
{
    test_calls(0);
    test_calls(1);
    test_calls(2);
    test_calls(3);
    test_calls(10);
    test_calls(100);
    
    // everything passed
    exit(0);
}
```

## Run Tests

```bash {name=test}
gcc print_date_repeatedly.c -o app_test
if ./app_test; then
    echo "Success!"
else
    echo "Failure! Exit code: $?"
fi
```
</code></pre><p>With time, you can add more functions in their own files&#8212;each with its own tests&#8212;and manage them in a clean, modular way. Everything stays isolated and easy to understand. Add some docs and links between files, and you&#8217;ll have a first class literate program!</p><h3>Conclusion</h3><p>Literate programming isn&#8217;t just a clever way to organize files&#8212;it&#8217;s a fundamentally different way of thinking. Your code and your thinking grow side by side. Your tests live where they belong: next to the ideas they verify. You stop writing tests as an obligation, and start writing them because they&#8217;re part of the story.</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>I&#8217;m using <strong>Organic Markdown</strong>, a simple, markdown-based literate system. For more on this particular flavor of LP, check out the <a href="https://github.com/adam-ard/organic-markdown">GitHub repo here</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>The <code>.o.md</code> stands for <strong>Organic Markdown</strong>. The &#8220;<code>o</code>&#8221; is separated from the <code>md</code> so that you can use any Markdown editor you want. I started off using <code>.omd</code>, but many editors wouldn&#8217;t open it because they didn&#8217;t recognize the extension.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Pair Programmers Unite]]></title><description><![CDATA[A Quiet Rebellion]]></description><link>https://rethinkingsoftware.substack.com/p/pair-programmers-unite</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/pair-programmers-unite</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Thu, 17 Apr 2025 20:56:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rZfK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Introduction</h2><p>For years, I've been searching for ways developers can shield themselves from misguided productivity management. I've tried everything, but management persists. Arbitrary targets and proxy metrics seem endless.</p><p>The idea respawns somewhere new as soon as it gets its head chopped off. Just look at how often someone tries to start a new company based entirely on the claim that they've figured out how to reduce programming effort and efficiency to a handful of numbers. ("No! I swear! This time it's for real.")</p><p>Most days, it feels like programmers are doomed to live under the outdated ideas of scientific management.</p><p>But today, I had an idea&#8212;something that's been right there in front of us all along: <strong>Pair Programming</strong>.</p><h2>The Hidden Power of Pair Programming</h2><p>Besides the benefits its proponents tout&#8212;faster onboarding, better sharing of institutional knowledge, more natural code reviews, increased team energy&#8212;pair programming could be the key to freeing developers from relentless individual scrutiny.</p><p>Here's the idea: if developers collectively insisted on pair programming&#8212;making it an absolute requirement rather than an occasional practice&#8212;they could effectively shield themselves from individual metric tracking.</p><p><strong>Because there would be no such thing as individual programming effort. </strong></p><p><strong>Bam!</strong></p><h2>Restructuring Task Management Systems</h2><p>To achieve this, existing software tracking systems would need adjustments. Most importantly, no developer would ever pull individual tickets from task management systems like Jira, Pivotal Tracker, or Asana. Instead, tickets should always be claimed by pairs or groups. While these tools don't inherently support team-based ticket assignment, creative solutions exist. Teams could adopt shared names or aliases for pairs, ensuring no task is tracked back to a single individual.</p><p>This seemingly minor shift is revolutionary. By removing individual accountability from tracking systems, management loses the ability to target developers individually based on arbitrary metrics. The burden is lifted.</p><h2>Strength in Numbers</h2><p>The benefits don't end there. When developers work in pairs or small groups, they can more effectively challenge unrealistic expectations or poorly conceived requirements. It's far harder to dismiss the collective voice of two or more developers pointing out problems than to label an individual as lazy or incompetent. Additionally, pair assignments diffuse blame and prevent unjust targeting of any single developer for setbacks or delays.</p><p>This realization excites me, although I know it's not entirely new. (I'm sure that if Kent Beck is reading this, he&#8217;s saying, "Well, duh!")</p><h2>Pair Programming as Civil Disobedience</h2><p>Pair programming can be more than just an effective development practice; it's a subtle yet powerful act of civil disobedience. By insisting on pairing, developers reclaim autonomy and push back against micromanagement without significant confrontation. They merely have to advocate for the already well-established benefits of pairing and insist on using it.</p><p>Developers should unite under this simple principle: <strong>"I only pair."</strong> Make the banners, print the flyers, knock on doors, and gather signatures. It's time to restore sanity, productivity, and enjoyment to programming.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rZfK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rZfK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!rZfK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!rZfK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!rZfK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rZfK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1948315,&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://rethinkingsoftware.substack.com/i/161549198?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.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_!rZfK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!rZfK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!rZfK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!rZfK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe43b9c6-03b1-41c0-b66b-f3f0de342896_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Individuality Still Thrives</h2><p>By no means does pair programming erase individuality. Like participating in a college study group, pairing augments individual capacity through sharing and collaboration. Developers still have ample opportunities to independently research new ideas, prototype solutions, and deepen their expertise outside tracked tasks. This balance allows developers to express unique strengths and autonomy while collectively resisting harmful management practices.</p><p>Individual talents will still shine&#8212;just in more collaborative moments, which gives more satisfaction anyway. Pairing doesn't hide anyone's skills; it merely enforces what Tom DeMarco and Timothy Lister suggested in their influential book <em>Peopleware</em>:</p><blockquote><p>Work measurement can be a useful tool for method improvement, motivation, and enhanced job satisfaction, but it is almost never used for these purposes. Measurement schemes tend to become threatening and burdensome.</p><p>In order to make the concept deliver on its potential, management has to be perceptive and secure enough to cut itself out of the loop. That means the data on individuals is not passed up to management, and everybody in the organization knows it. Data collected on the individual&#8217;s performance has to be used only to benefit that individual. The measurement scheme is an exercise in self-assessment, and only the sanitized averages are made available to the boss.</p><p>&#8230;The individuals are inclined to do exactly the same things with the data that the manager would do&#8230; The manager doesn&#8217;t really need the individual data in order to benefit from it.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p></blockquote><p>Programmer&#8217;s can still measure anything the would like about their own performance. They are simply cutting management &#8220;out of the loop&#8221;.</p><h2>Addressing the Parallelism Myth</h2><p>Of course, some will argue that pair programming removes the benefits of parallelism: two people could otherwise be working on two separate tasks, theoretically doubling output. But this doesn't hold in practice. Firstly, two programmers working on the same task usually complete it faster and with fewer errors than an single developer. Secondly, pair programming removes one of software development&#8217;s greatest productivity killers: code reviews.</p><p>In traditional workflows, code languishes for hours or days awaiting review and approval. With pair programming, peer reviews become intrinsic to the development process. As soon as a task is completed, it has already been sufficiently reviewed and can be immediately merged into the main code branch. In most cases, this speedup alone outweighs any supposed benefits of parallelism.</p><h2>Conclusion</h2><p>The path forward is clear: remove individual names from task tracking systems, insist on pairing, and reclaim our profession. Together, we can resist misguided productivity metrics and restore joy, sanity, and true productivity to software development.</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><em>Peopleware: Productive Projects and Teams</em> by Tom DeMarco and Timothy Lister</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[SOC 2 — We Do It to Ourselves]]></title><description><![CDATA[A developer's guide to SOC 2 Compliance]]></description><link>https://rethinkingsoftware.substack.com/p/soc-2-we-do-it-to-ourselves</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/soc-2-we-do-it-to-ourselves</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Tue, 08 Apr 2025 23:48:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bMOH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.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_!bMOH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bMOH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!bMOH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!bMOH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!bMOH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bMOH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:611605,&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://rethinkingsoftware.substack.com/i/160757267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.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_!bMOH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!bMOH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!bMOH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!bMOH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a867a1d-983f-44d3-8b36-465a111342b1_1024x1024.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 aria-hidden="true" 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><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>If your SOC 2 compliance requirements seem excessive, you only have yourself to blame.</p><p>That&#8217;s the dirty little secret of SOC 2 compliance that management hasn&#8217;t been so eager to explain. Most developers imagine there are evil compliance officers breathing down the company&#8217;s neck, forcing it to lock everything down. They assume that long ticket queues, deployment request forms, and code review requirements are all part of some SOC 2 rulebook.</p><p>If you&#8217;ve ever complained, you&#8217;ve probably gotten the standard reply: <em>"We can't do anything &#8212; it&#8217;s a SOC 2 compliance issue."</em></p><p>But the truth is, there is no SOC 2 rulebook. There are no external compliance officers. SOC 2 isn&#8217;t a list of mandatory tasks like a regulation. It&#8217;s a framework where you write your own rules and prove you follow them. Of course, they need to be reasonable enough to pass audit scrutiny. But the organization chooses the rules &#8212; not some outside body.</p><p>So if controls are overly rigid and painful, it&#8217;s because the company chose to make them that way. They&#8217;re the ones tasked with creating the controls.</p><p>The pain is self-inflicted.</p><div><hr></div><h2>Who <em>Really</em> Makes the Rules?</h2><p>At big companies, there may be dedicated security and compliance professionals. They might even call themselves compliance officers, but don&#8217;t be confused &#8212; they work for your company, not a regulatory body.</p><p>In smaller organizations without dedicated compliance professionals, the task of choosing and maintaining SOC 2 compliance rules normally falls to the Ops, DevOps, or Platform engineering teams.</p><p>Regardless of who inside the company is setting the rules, one thing is certain: the company itself is in charge, not the SOC 2 auditors.</p><p>And you don&#8217;t have to take my word for it.</p><blockquote><p>While some security frameworks like ISO 27001 and PCI DSS have rigid requirements, that isn&#8217;t the case with SOC 2.</p><p>Controls and attestation reports are unique to every organization.</p><p>Each company designs its own controls to comply with its Trust Services Criteria.</p><p>An independent auditor is then brought in to verify whether the company&#8217;s controls satisfy SOC 2 requirements.</p><p>After the audit, the auditor writes a report about how well the company&#8217;s systems and processes comply with SOC 2.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p></blockquote><blockquote><p>&#8230; organizations are given full autonomy over which TSC they develop controls for as well as what those controls consist of.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p></blockquote><p>Another thing is certain, developers aren&#8217;t being consulted when compliance controls are designed&#8212;even though compliance controls directly effect their daily workflows.</p><p>This needs to change.</p><div><hr></div><h2>Principles for Developer-Friendly Compliance</h2><p>How do we escape this bureaucratic mess and build developer-friendly compliance?</p><p>The way out is to design systems around better principles. Here are five that can help recalibrate an otherwise overly restrictive set of compliance practices.</p><div><hr></div><h3><strong>Principle 1: Better Defaults</strong></h3><p>Some operations teams default to zero access, forcing developers to request every single permission individually &#8212; a tedious, frustrating, and unnecessary mode of operation.</p><p>All developers on a team typically need the same permissions. It&#8217;s much more efficient to grant those permissions as a block, upfront, for every member of the team. They&#8217;re going to be approved eventually, so you might as well save yourself from fielding a dozen tickets just to get someone onboarded.</p><p>Better defaults also empower discovery. Developers can see what&#8217;s available, experiment, and move faster without waiting in line for approvals.</p><p>Another smart default is granting better access to CI/CD systems. Without proper access, it&#8217;s nearly impossible for developers to build, debug, and tune their pipelines.</p><div><hr></div><h3><strong>Principle 2: Sandboxed / Prototyping Environments</strong></h3><p>Developers need environments where they can safely explore, experiment, and learn &#8212; with real access to cloud services, infrastructure definitions, and deployment tooling.</p><p>Give developers direct access to Terraform files, Kubernetes manifests, and CloudFormation templates. Let them prototype infrastructure changes in dev environments without gatekeeping. Not every change must be fully polished in every iteration and prototypes are part of the learning process.</p><p>Formal reviews can wait for when changes move to production &#8212; after developers have had the chance to spin up resources and see how they work. Later, when they&#8217;ve formalized their work into a pull request, ops engineers can review the cloud configurations they create.</p><p>Developers who have full control in dev environments write better, safer production systems &#8212; and you avoid turning every infrastructure change into a ticket queue nightmare.</p><div><hr></div><h3><strong>Principle 3: Avoid Unnecessary Abstractions</strong></h3><p>Every time you wrap an API in a bespoke internal tool, you add latency and risk.</p><p>Internal wrappers over cloud APIs might seem helpful &#8212; adding guardrails, simplifying complexity &#8212; but too often they just create hard dependencies on the operations team. Developers get locked out of directly configuring infrastructure. And when cloud providers release new features, you lag months behind because your wrapper hasn&#8217;t caught up.</p><p>Good abstractions empower developers. Bad abstractions create dependency loops. The best approach is to give developers direct access to manifests and configuration, with clear policy guidance, rather than hiding everything behind custom tooling. Native manifests and configurations are already auditable. That&#8217;s as far as you need to go.</p><p>Unnecessary abstraction is unnecessary complexity.</p><div><hr></div><h3><strong>Principle 4: Favor Visibility Over Restriction</strong></h3><p>Restricting access might feel safer, but it often does the opposite.</p><p>Visibility is a better security posture. Open systems let developers understand how things work, spot problems early, and contribute to improvements. It&#8217;s the same principle that makes open source software often more secure than closed systems: more eyes, fewer surprises.</p><p>Defaulting to locked-down, opaque systems hides risks and slows down diagnosis when things go wrong. Instead of "security through obscurity," aim for transparent systems with auditable logs and clear visibility into operations.</p><p>Allowing all code repos to be at least readable by anyone in the organization, for example, makes it hard for nefarious code to see the light of day. It also makes it easy for all developers to check and contribute to each other&#8212;a requirement for any high functioning software organization.</p><div><hr></div><h3><strong>Principle 5: Interim Controls</strong></h3><p>The road to automation is long. But that doesn&#8217;t mean you have to live in ticket hell while you're trying to get there.</p><p>Most ops teams agree: the best solutions use self-service and automation. This is typically their long-term goal. But ops teams often get so overwhelmed with their near-term manual processes that they never get around to their automated end goals. Manual access approvals, manual deploy reviews, manual evidence collection &#8212; they devour the time and energy that could have gone toward building a better solution.</p><p>Be careful to design interim controls that are not only sufficient from a compliance viewpoint, but that also don't take up all your time.</p><p>For example: use templated requests that reduce manual decision-making. Grant permissions in blocks (see Principle 1). Let devs manage their own CI/CD pipelines. Do whatever you have to to avoid getting buried under a mountain of Jira tickets.</p><p>Trust that auditors will accept these interim solutions in light of your long-term goals.</p><p>Don&#8217;t accept the false choice between painful manual processes today and full automation someday (a day that may never comes). There&#8217;s a temporary middle road that can get you to your goal faster.</p><div><hr></div><h2>Yes, You Can Change SOC Controls (And You Should)</h2><p>Here&#8217;s another dirty little secret: SOC 2 controls are not set in stone. Despite what they may say at your company, you can absolutely change them. In fact, mature companies revise their controls all the time as they automate processes, improve risk posture, or grow out of old startup-era hacks.</p><p>If management says, <em>"We can't fix that because of SOC 2,"</em> when confronted with a poorly designed control, you can (and should) reply: <em>"Then it&#8217;s time to fix it."</em></p><p>If you switch from manual approvals to automated pipeline enforcement, you haven&#8217;t weakened your posture &#8212; you&#8217;ve improved it. Good auditors know and accept this. They care about outcomes, not ceremony. There is nothing sacred about your first attempt at defining controls. What matters is getting it right eventually.</p><p><strong>If you&#8217;ve inherited bad controls? Change them!</strong></p><p><strong>If a policy is crushing your developers? Replace it!</strong></p><p>Your controls are yours to define.</p><p>If you don&#8217;t take charge of improving your controls, you&#8217;ll be stuck living with someone else&#8217;s bad decisions forever.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mK3a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mK3a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!mK3a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!mK3a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!mK3a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mK3a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:748050,&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://rethinkingsoftware.substack.com/i/160757267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.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_!mK3a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!mK3a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!mK3a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!mK3a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4db60e84-8e58-432b-8e7d-681868b35023_1024x1024.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 aria-hidden="true" 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><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><h2>Developer Action</h2><p>If you&#8217;re a developer, and you&#8217;ve felt powerless to push back against excessive bureaucracy, hopefully this essay has made you feel more empowered.</p><p>You should feel comfortable challenging a painful status quo. Push back against:</p><ul><li><p>Controls that are more performative than useful.</p></li><li><p>Ticket queues and approval bottlenecks.</p></li><li><p>Manual processes.</p></li><li><p>The lack of sandboxed environments.</p></li><li><p>Wrappers around available cloud tools.</p></li><li><p>Opaque systems.</p></li></ul><p>Treat compliance design as an engineering responsibility. Good compliance should feel like good engineering: reliable and low-friction.</p><p><strong>Your company wrote the rules.</strong></p><p><strong>Now make them write better ones.</strong></p><div><hr></div><blockquote><p><strong>Disclaimer:</strong><br>This post reflects my personal opinions and experiences and is not legal or compliance advice. Always consult with your own legal counsel and auditors when making decisions about your compliance strategy.</p></blockquote><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><a href="https://secureframe.com/hub/soc-2/what-is-soc-2">https://secureframe.com/hub/soc-2/what-is-soc-2</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p><a href="https://scytale.ai/resources/soc-2-controls-explained-for-saas-startups/">https://scytale.ai/resources/soc-2-controls-explained-for-saas-startups/</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[In retrospect, DevOps was a bad idea.]]></title><description><![CDATA[We need to talk about DevOps.]]></description><link>https://rethinkingsoftware.substack.com/p/in-retrospect-devops-was-a-bad-idea</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/in-retrospect-devops-was-a-bad-idea</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Mon, 31 Mar 2025 19:51:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!S0BD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.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_!S0BD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S0BD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!S0BD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!S0BD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!S0BD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S0BD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2380772,&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://rethinkingsoftware.substack.com/i/160167399?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.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_!S0BD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!S0BD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!S0BD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!S0BD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af18ada-7340-498b-8740-50d9f7479cf3_1024x1536.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>We need to talk about DevOps.</p><p>In the beginning, DevOps made sense. It was a logical evolution of healthy engineering practices. But we never should have given it a name. Once we labeled it, it got completely out of hand.</p><p>Before DevOps, developers would write software and hand it off to an operations team, who then had to figure out how to get it running in production. This didn&#8217;t work very well. Eventually, developers who cared about deployment started getting involved in making sure their code made a smooth transition to production. That was a huge improvement.</p><p>And that&#8217;s where we should have stopped.</p><p>We should have just said: &#8220;Hey, developers should deploy their own code.&#8221; More than that&#8212;they should also be responsible for keeping it running. They should monitor it, respond to issues, and use their programming skills to automate deployments so they&#8217;re safe, repeatable, and easy for the team to use. Production-minded developers (who are part of the team!) should do a little extra work to make things better for everyone. This was the correct mindset&#8212;a necessary shift away from isolated ops teams managing production without developer participation.</p><p>When cloud services arrived, this shift became even more natural. Spinning up a server was no different than calling an API. Infrastructure could be programmed. It could be versioned. It could be tested.</p><p>But then we made a terrible mistake: we gave it a name&#8212;DevOps.</p><p>Suddenly, developers who were good at working with production systems were given a new title. And as soon as &#8220;DevOps engineer&#8221; became a role, people started forming DevOps teams. That was the beginning of the end.</p><p>When we created DevOps engineering teams, we pulled engineers away from product teams and gave them a new mission. We left product development teams without anyone focused on production. We undid everything that made DevOps work in the first place.</p><p>Effectively, we created a new operations team called DevOps, and operations went back to managing production in isolation. Sure, they adopted newer tools and sprinkled in some automation. But that&#8217;s really beside the point, because the real benefit of DevOps came from empowering developers to own their deployment pipelines and automate their production processes&#8212;tailored to their team&#8217;s specific needs.</p><p>Once again, companies tried to standardize everything and chase economies of scale. In the process, they stripped DevOps of its usefulness.</p><p>Now, DevOps teams build internal tooling designed more to restrict than to empower. They wrap every API in layers of homegrown abstractions, which fall behind what cloud providers like AWS already offer. Developers end up begging for support for features that are already standard elsewhere.</p><p>Originally, DevOps was about trusting developers with production. But modern DevOps teams operate on the belief that developers can&#8217;t be trusted with production. And because DevOps owns the compliance checklists, they bake that mistrust into the rules. SOC compliance, for example, ends up filled with restrictions that assume developers are potential bad actors&#8212;rules that hinder more than they help.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MFzV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MFzV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MFzV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MFzV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MFzV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MFzV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1006684,&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://rethinkingsoftware.substack.com/i/160167399?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.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_!MFzV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MFzV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MFzV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MFzV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F608358ed-19cb-4622-adeb-38c49e5dc212_1024x1024.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>Of course, this is all completely pointless. A DevOps engineer is just as capable of malicious behavior as any other engineer. The solution isn&#8217;t to block access&#8212;it&#8217;s to make actions transparent and reviewable. Security comes from visibility, not locked doors.</p><p>So what did creating a &#8220;DevOps&#8221; role actually get us?</p><p>It pulled production-minded engineers off their teams and stripped those teams of both the interest <em>and</em> the permission to manage their own production environments. We ruined the idea of DevOps by formalizing it.</p><p>P.S. Platform Engineering is the same story. In the words of Yogi Berra, &#8220;It's <a href="https://en.wikipedia.org/wiki/D%C3%A9j%C3%A0_vu">d&#233;j&#224; vu</a> all over again.&#8221;</p>]]></content:encoded></item><item><title><![CDATA[Don't Shoot the Android]]></title><description><![CDATA[I just re-read Do Androids Dream of Electric Sheep by Philip K.]]></description><link>https://rethinkingsoftware.substack.com/p/dont-shoot-the-android</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/dont-shoot-the-android</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sat, 29 Mar 2025 21:41:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1DNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.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_!1DNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1DNv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!1DNv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!1DNv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!1DNv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1DNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2037199,&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://rethinkingsoftware.substack.com/i/160143155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.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_!1DNv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 424w, https://substackcdn.com/image/fetch/$s_!1DNv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 848w, https://substackcdn.com/image/fetch/$s_!1DNv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!1DNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7213c0d5-ecd1-4289-ba66-76097c6eef11_1024x1536.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 aria-hidden="true" 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><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 just re-read <em>Do Androids Dream of Electric Sheep</em> by Philip K. Dick (PKD). It's a good one&#8212;and it hit me differently this time. Beyond its insights into dilemmas we may soon face with AI, it also says a lot about the plight of today&#8217;s laborers.</p><p>Rick Deckard's job is to hunt and retire (i.e. kill) androids&#8212;because he's a bounty hunter, and androids are forbidden on Earth. Occasionally, a few make their way back from off-world colonies and hide out, pretending to be human, so they have to be exterminated.</p><p>Over time, the androids become nearly indistinguishable from humans, and that starts to mess with Deckard. He begins to feel guilty about killing them. He develops too much empathy.</p><p>Yet he still feels pressure to do his job&#8212;and he still needs the money. So he's torn. At one point, he decides he's done with it:</p><blockquote><p>"This is my end," he said to himself. "As a bounty hunter. After the Batys [an android husband and wife], there won't be any more. Not after this, tonight."</p></blockquote><p>Sadly, in the end, he resigns himself to his morally questionable work, following the advice of Mercer, a religious icon who appears to him in visions. Mercer explains:</p><blockquote><p>"You will be required to do wrong no matter where you go. It is the basic condition of life, to be required to violate your own identity. At some time, every creature which lives must do so. It is the ultimate shadow, the defeat of creation; this is the curse at work, the curse that feeds on all life. Everywhere in the universe."</p></blockquote><p>The same rationalization returns at the end of the novel as Deckard reflects on his new conviction (resignation?) to his wife:</p><blockquote><p>"Do you think I did wrong?" he asked. "What I did today?"<br>"No."<br>"Mercer said it was wrong but I should do it anyhow. Really weird. Sometimes it's better to do something wrong than right."<br>"It's the curse on us," Iran said. "That Mercer talks about."</p></blockquote><p>These passages haunt me. I'm terrified that anyone could ever conclude that they&#8217;re true.</p><p>I'll admit, I often feel exactly like Deckard. I have a mortgage and other expenses that never go away. The job market isn't always great. So when my boss demands unquestioning obedience or threatens termination, I feel trapped.</p><p>But does that make Mercer right? Are we doomed to do what we hate, what we feel is wrong? Is that the consequence of living in society&#8212;the curse that feeds on all life?</p><p>I hope with every part of me that it&#8217;s not.</p><p>When otherwise good people decide they must violate their conscience at work because &#8220;that&#8217;s the way the sausage gets made,&#8221; society begins to slide. We make a mess of things.</p><p>Sure, sometimes we have to suck it up and do things we don&#8217;t enjoy. That&#8217;s fine when the tasks are benign. But when they violate our values and carry real consequences, we have to stand up and say no. </p><p>Most things programmers are required to do never rise to the level of evil involved in terminating sentient life forms, but we are still forced to act against our convictions every day. So much of what we do is contrary to what we would choose for ourselves. We are forced to:</p><ul><li><p>work in distracting open offices, when working at home is more productive.</p></li><li><p>complete single-day tasks when we would rather tackle month-long projects and determine the tasks ourselves.</p></li><li><p>agree to unrealistic deadlines.</p></li><li><p>forgo important planning, research, and prototyping.</p></li><li><p>optimize our work to pointless, counterproductive metrics.</p></li><li><p>persist in unfruitful circumstances (with people or projects with which we are a poor fit).</p></li><li><p>use wasteful and bureaucratic tooling and processes.</p></li><li><p>ask permission to install important software on work laptops.</p></li><li><p>use specific operating systems instead of the systems we are most comfortable with.</p></li></ul><p>The list could go on forever. Some may disagree that these examples constitute moral dilemmas, but the slope is slippery, and when every request goes unquestioned, we end up as wage slaves&#8212;without identity, without careers to shape or be proud of. We share Deckard&#8217;s fate:</p><blockquote><p>&#8220;...everything about me had become unnatural; I&#8217;ve become an unnatural self.&#8221;</p></blockquote><blockquote><p>&#8220;Yes, he thought, that&#8217;s what it is: I&#8217;ve been defeated in some obscure way.&#8221;</p></blockquote><blockquote><p>&#8220;I&#8217;m a scourge, like famine or plague. Where I go the ancient curse follows. As Mercer said, I am required to do wrong. Everything I&#8217;ve done has been wrong from the start.&#8221;</p></blockquote><p>Do I refuse to do all the things I listed above? No. I pick my battles to avoid getting fired. Sadly, I agree to way more than I should. We all do. As a result, we have given up a lot of territory. But, we need to find ways to start taking it back.</p><p>One thing is certain: to avoid the fate of PKD&#8217;s anti-hero, amidst the pressures designed to force compliance, we have to draw lines we won&#8217;t cross. If we don&#8217;t, we&#8217;ll lose ourselves. As hard as it is to stand up against compulsion, the alternative is far worse.</p><p>We can do it... right? We have to.</p><p>And more to the point: if an android isn&#8217;t hurting anyone, can&#8217;t we just let them be? Do we really gotta shoot 'em?</p>]]></content:encoded></item><item><title><![CDATA[Memorandum: Tips for Ensuring Scrum Compliance]]></title><description><![CDATA[A joke memorandum from a fictitious organization that might as well be true, given my experience being forced to do Scrum.]]></description><link>https://rethinkingsoftware.substack.com/p/scrum-managerial-research-institute</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/scrum-managerial-research-institute</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Tue, 25 Feb 2025 22:24:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vkyX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.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_!vkyX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vkyX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vkyX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vkyX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vkyX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vkyX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2121033,&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://rethinkingsoftware.substack.com/i/153240415?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.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_!vkyX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!vkyX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!vkyX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!vkyX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0d8719e-72b7-4ffa-b22f-b573dee82697_1024x1024.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 aria-hidden="true" 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><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>A joke memorandum from a fictitious organization that might as well be true, given my experience being forced to do Scrum.</p><div><hr></div><p><strong>MEMORANDUM</strong><br><strong>To:</strong> Scrum Masters<br><strong>From:</strong> Scrum Managerial Research Institute<br><strong>Date:</strong> 02-25-2025<br><strong>Subject:</strong> Tips for Ensuring Scrum Compliance</p><div><hr></div><p><strong>Introduction</strong><br>At <em>Scrum Managerial Research Institute</em>, we understand the challenges Scrum Masters face when dealing with team members who exhibit resistance to Scrum. Such individuals often present ideological objections, consume valuable time, and disrupt team harmony. This memo provides clear, actionable strategies to ensure compliance without the need for prolonged debates&#8212;so you can get back to work.</p><div><hr></div><p><strong>1. Invoke Authority</strong><br>Remind team members that Scrum is not up for debate. Clearly communicate that the decision to adopt Scrum was made at higher levels in the organization. If objections persist, direct team members to their reporting chain. This removes you from the argument and reinforces organizational alignment.</p><p><em>&#8220;This isn&#8217;t my call; leadership decided this. If you have concerns, take them up with management.&#8221;</em></p><div><hr></div><p><strong>2. Skip Retrospectives</strong><br>Retrospectives can devolve into ideological debates. If engineers are not willing to engage constructively&#8212;by only attacking Scrum itself&#8212;your only option is to suspend the practice. Until engineers can focus on working within the framework, sadly, they&#8217;ll have to forgo the benefits they would otherwise gain from incremental improvement. </p><div><hr></div><p><strong>3. Tighten the Leash</strong><br>Strict adherence to the Scrum Guide is required to remove ambiguity and quash deviations. Here are a some suggested actions that can help right the ship:</p><ul><li><p><strong>Run Scrum Meetings Yourself</strong>: Eliminate opportunities for derailment.</p></li><li><p><strong>Enforce Rules in Tools</strong>: Add required workflow steps and fields to Jira.</p></li><li><p><strong>Define Done in Detail</strong>: Draft a detailed, non-negotiable <em>Definition of Done</em> to ensure standards are upheld.</p></li><li><p><strong>Take Attendance</strong>: Enforce meeting participation to ensure team accountability.</p></li><li><p><strong>Attach Consequences to Carry-Over Stories</strong>: If work isn&#8217;t completed within the sprint, establish tangible repercussions.</p></li></ul><p><em>Consistency is key. Deviations signal that Scrum itself is negotiable.</em></p><div><hr></div><p><strong>4. Maintain Control</strong><br>As the gatekeeper of Scrum tools and processes, you hold the leverage:</p><ul><li><p><strong>Don&#8217;t Negotiate</strong>: Avoid debates with developers. Keep interactions brief and to the point.</p></li><li><p><strong>Stay Unflappable</strong>: If complaints arise, disengage politely. Example: <em>&#8220;I&#8217;ve got something else to attend to. You&#8217;ll excuse me?&#8221;</em></p></li></ul><div><hr></div><p><strong>5. Escalation</strong><br>When compliance remains elusive:</p><ul><li><p><strong>Refer Developer Objections to HR or Management</strong>: Clearly communicate that you are enforcing an established industry standard practiced in thousands of companies worldwide.</p></li><li><p><strong>Frame the Issue as Non-Personal</strong>: &#8220;This isn&#8217;t about you or me&#8212;it&#8217;s about following proven, universal standards.&#8221;</p></li></ul><div><hr></div><p><strong>Conclusion</strong><br>While it may feel uncomfortable, strict enforcement of Scrum is sometimes necessary. Scrum only functions when it is implemented <em>in its entirety</em>. Over time, even the most stubborn team members will come to appreciate the discipline and structure you bring to their work. Until then, remain firm, professional, and consistent.</p><p><em>Work isn&#8217;t always fun&#8212;that&#8217;s why they call it &#8216;work.&#8217;</em></p><div><hr></div><p><strong>Scrum Managerial Research Institute</strong></p>]]></content:encoded></item><item><title><![CDATA[Hours ∝ Story Points]]></title><description><![CDATA[(Scrum Planning Meeting)]]></description><link>https://rethinkingsoftware.substack.com/p/hours-story-points</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/hours-story-points</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Tue, 04 Feb 2025 05:25:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SH1_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.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_!SH1_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SH1_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 424w, https://substackcdn.com/image/fetch/$s_!SH1_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 848w, https://substackcdn.com/image/fetch/$s_!SH1_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!SH1_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SH1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png" width="1280" height="1062" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1062,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:243649,&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_!SH1_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 424w, https://substackcdn.com/image/fetch/$s_!SH1_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 848w, https://substackcdn.com/image/fetch/$s_!SH1_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!SH1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cb53f1-f77b-4c04-beae-861d210f1e8b_1280x1062.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 aria-hidden="true" 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><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">Image by <a href="https://pixabay.com/users/openclipart-vectors-30363/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=149195">OpenClipart-Vectors</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=149195">Pixabay</a></figcaption></figure></div><p><strong>(Scrum Planning Meeting)</strong></p><p><strong>Senior Programmer</strong>: Are those Scrum poker cards I see?</p><p><strong>Junior Programmer: </strong>Why, yes.</p><p><strong>Senior Programmer:</strong> Very Nice. A full deck?</p><p><strong>Junior Programmer:</strong> Yep, Fibonacci from 1 to 34.</p><p><strong>Senior Programmer:</strong> Do you like magic tricks?</p><p><strong>Junior Programmer:</strong> Sure!</p><p><strong>Senior Programmer:</strong> Now these are just story points right? Not hours?</p><p><strong>Scrum Master:</strong> We only do story points here, never hours!</p><p><strong>Senior Programmer:</strong> Very good! OK, pick a card and before your very eyes, I'll turn the number on that card into hours. </p><p><strong>Scrum Master:</strong> Impossible, they don't equate. Apples to Oranges. In Scrum we don't do time estimates. </p><p><strong>Senior Programmer: </strong>Have you picked your card? </p><p><strong>Junior Programmer:</strong> Yep, it's the number 2.</p><p><strong>Senior Programmer:</strong> <strong>(taking the card in one hand)</strong> Okay! Now I only need three things from you my good Scrum Master. The team size, the sprint length and the team velocity. </p><p><strong>Scrum Master:</strong> You know all that. Two programmers, 2 week sprints, and 20 points/sprint.</p><p><strong>Senior Programmer:</strong> Very good. Watch me closely now at the whiteboard. I'm going to do what no magician ever does and show you precisely how my trick works.</p><p><strong>(Writes: "2 team members X 40 hours/week X 2 weeks/sprint = 160 hours/sprint")</strong></p><p><strong>Scrum Master:</strong> <strong>(His expression changes from amusement to irritation)</strong></p><p><strong>Senior Programmer:</strong> OK, we are almost done now, watch closely. </p><p><strong>(Below the first line he writes "160 hours/sprint / 20 points/sprint = 8 hours/point")</strong></p><p><strong>Scrum Master: </strong>OK, now I think our planning meeting is starting to get off track.</p><p><strong>Senior Programmer:</strong> But we're almost done! <strong>(Holding up the Scrum poker card with the number 2 on it)</strong> Now tell me dear programmer, what is the number on your card?</p><p><strong>Junior Programmer: </strong>It's still a 2.</p><p><strong>Senior Programmer:</strong> And the number on the board here, what does that say? </p><p><strong>Junior Programmer: </strong>8 hours/point.</p><p><strong>Senior Programmer:</strong> multiplying them together?</p><p><strong>Junior Programmer:</strong> 16..</p><p><strong>Senior Programmer: </strong><em>Hours</em>! 16 <em>Hours</em>! Magically, we&#8217;ve transformed your story point estimate into hours. The Scrum Master said it couldn't be done! &#8220;Story points have nothing to do with hours&#8221;, he said. </p><p>Well, It appears we have done the impossible!</p><p>Now let's see how well you have learned my trick. How about 1 story point?</p><p><strong>Junior Programmer:</strong> 8 hours?</p><p><strong>Senior Programmer:</strong> YES! How about 8 story points?</p><p><strong>Junior Programmer: </strong>64 hours! </p><p><strong>Senior Programmer:</strong> The student has become the master!</p><p><strong>Junior Programmer: </strong>Thank you! Thank you! <strong>(Bowing and blowing kisses to an invisible audience)</strong> </p><p><strong>Scrum Master:</strong> Very funny. You've made your point.  </p>]]></content:encoded></item><item><title><![CDATA[Coming in Through the Back Door]]></title><description><![CDATA[Open Source as Utopia]]></description><link>https://rethinkingsoftware.substack.com/p/coming-in-through-the-back-door</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/coming-in-through-the-back-door</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Fri, 24 Jan 2025 04:03:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ACF4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg" 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_!ACF4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ACF4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ACF4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ACF4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ACF4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ACF4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg" width="1280" height="845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:845,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:484307,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ACF4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ACF4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ACF4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ACF4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b354f8d-ef53-4b5b-8f41-a3b750f0ebd9_1280x845.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 aria-hidden="true" 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><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">Image by <strong><a href="https://pixabay.com/users/life-of-pix-364018/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=406824">LEEROY Agency</a></strong> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=406824">Pixabay</a></figcaption></figure></div><p>In corporate America, software development is a painful slog. Management is fixated on metric optimization, developers take tickets one after another from a backlog, and work consists mostly of taking code that's already written (legacy code, open source, third-party libraries) and gluing it together. It doesn't exactly make you spring out of bed and race to work in the morning.</p><p>Even if a company starts out with a better culture, it eventually ends up like all the rest. There are just too many MBAs in suits running around applying their Taylorisms. Any resistance eventually succumbs, given enough time and persistence.</p><p>For a while now, I've felt trapped inside this mouse wheel and have wondered what the alternatives are. Most recently, I've looked into freelancing sites like Upwork as an escape from the traditional nine-to-five. But to make that happen, I'd have to ramp up consulting in my free time while keeping my day job to pay the bills. Sadly, I'm realizing that after a day of corporate coding, I just don't have the energy left to serve yet another group of people who want me to code for their benefit. Even if I do manage to transition from traditional employment to full-time freelance, I'm not certain I'll feel any more freedom (apart from a bit more schedule flexibility).</p><p>So lately, in the evening&#8212;when I should be freelancing&#8212;I've been researching the Zig programming language just for fun, because it's cool. I'm enamored with the level of autonomy and innovation that community has achieved. They tackle big, long-standing problems in unique ways. They&#8217;re trying things that could have a big payoff&#8212;the kind of work a typical software manager wouldn't let you touch with a ten-foot pole because of the perceived risk. It&#8217;s exactly the type of work I wish I was doing!</p><p>This got me thinking. I have an extra tool in my toolbox that I'm not using aggressively enough: <strong>open source software (OSS)</strong>.</p><p>OSS development is my chance to be in charge&#8212;to achieve the mastery, purpose, and autonomy that form the foundation of intrinsic motivation.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> At work, I take orders; in the OSS world, I do what I want.</p><p>The secret of OSS, and the way it sidesteps traditional capitalist pressures, is that you give it away for free. To some, this may seem foolish. But it's what gives OSS its magic powers.</p><p>Because it's free, OSS can be whatever you want it to be. No one can demand anything, and it doesn't have to find a place in the market. No one is paying for it, so users only have two options: take it or leave it. There's a lot of power in that position.</p><p>So while I do the boring work of gluing code together at work, the interesting stuff is being done elsewhere. OSS is one of those places&#8212;where contributors are digging into new algorithms, building frameworks, and writing new languages.</p><p>If things go well with an OSS project, you can even turn a profit. If you manage to get wide enough adoption, people start wanting you to stick around for a while&#8212;they become dependent. They start wanting customization, training, and upgrades. If they're excited enough, they may even want to buy some swag.</p><p>You've wormed your way into their hearts, and now there actually <em>is</em> a space for you in the market. With OSS, you don't get into the house by ringing the doorbell and giving an uncomfortable pitch on the front porch; you come in through the back door, asking if anyone wants some extra zucchini from your garden. Soon enough, you're all friends.</p><p>OSS can even be an effective way to take on the big guy in the neighborhood. I remember fondly how Netscape (eventually renamed Firefox) escaped oblivion to eventually conquer Internet Explorer. Microsoft thought they had the upper hand by bundling IE (at no extra cost) with their operating system. But then Netscape went open source. It was inspiring to watch them take on a giant and beat them at their own game.</p><p>Other benefits of OSS include the following:</p><ul><li><p>You can take it with you when you switch jobs.</p></li><li><p>You can neglect it whenever you get too busy.</p></li><li><p>If people like it, they may start contributing to it.</p></li><li><p>Since it's something you choose, it's likely to be interesting&#8212;otherwise you wouldn't have chosen it.</p></li><li><p>It allows you to build a portfolio of code you can demonstrate.</p></li><li><p>You get good karma from sharing with the world.</p></li><li><p>It can benefit you at your day job.</p></li><li><p>If someone else is building something that is close to what you want, you can contribute to their project instead of starting something from scratch.</p></li></ul><p>There&#8217;s a part of me that wishes the world worked more like OSS. If everyone built what they were passionate about and shared it freely, maybe there would be enough to go around, and you wouldn&#8217;t need to buy <em>anything</em>. Money would be unnecessary, and no one would feel compelled to do someone else&#8217;s bidding to make a living. When it comes to software, we're pretty close to that reality. There&#8217;s an open source version of pretty much anything you could ever want. If you have some hardware and the internet, you can download OSS and be off to the races. You don&#8217;t spend a penny. Is there a version of that for everything? That&#8217;s utopia in my opinion&#8212;an open source world.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><p>The bottom line is, I think this is what I need to maintain my mental health. After working for the man all day, in the evening I only have enough motivation to build something I totally control. If I can't pick my project, my stack, my tools, and my pace, then I simply don't have it in me to open up emacs again. It feels too much like the same old exploitation in slightly different clothing. I end up watching Netflix instead.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> So I'm officially modifying my trajectory. Instead of trying to transition to freelancing to gain some intermediate freedom and eventually start a company, I'm going to keep my day job and work on OSS at night. Eventually, I hope one of my projects will gain enough traction to bring in some extra cash. But in the meantime, I can use what I'm building for myself and share it with the world. That alone might keep me satisfied for a while. One can hope.</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><a href="https://www.danpink.com/books/drive/">https://www.danpink.com/books/drive/</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>I feel another essay brewing inside me.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>I always seem to find the motivation to write about my  issues with the software industry as well.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Navigating the Shadows]]></title><description><![CDATA[Some people think programmers should only do what they're told&#8212;one ticket at a time.]]></description><link>https://rethinkingsoftware.substack.com/p/navigating-the-shadows</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/navigating-the-shadows</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Fri, 10 Jan 2025 16:06:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!krEw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg" 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_!krEw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!krEw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 424w, https://substackcdn.com/image/fetch/$s_!krEw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 848w, https://substackcdn.com/image/fetch/$s_!krEw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!krEw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!krEw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg" width="1280" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109987,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!krEw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 424w, https://substackcdn.com/image/fetch/$s_!krEw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 848w, https://substackcdn.com/image/fetch/$s_!krEw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!krEw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06a5d97e-e629-466e-987c-07d3fe0a2528_1280x822.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><figcaption class="image-caption">Image by <a href="https://pixabay.com/users/pexels-2286921/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1850918">Pexels</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1850918">Pixabay</a></figcaption></figure></div><p>Some people think programmers should <em>only</em> do what they're told&#8212;one ticket at a time. Nothing extra.</p><p>Scrum has inscribed this sentiment into their official guide: the Product Backlog &#8220;is the single source of work undertaken by the Scrum Team.&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> And most engineering managers are careful to keep programmers locked out of the backlog&#8212;except for pulling and completing items exactly in the order they're given. </p><p>But, if you take this sentiment seriously, you're stuck. You're doomed forever to march to the beat of someone else's drum. The fast track to an unfulfilling career.</p><p>Thankfully, there's a simple way to break out of this trap: the shadow project. A shadow project is work you do off the books, on your own initiative. It's something <em>you</em> want to do, for your own reasons.</p><p>When you get a hankering to fix something, try something new, or learn something that might help you down the road, fire up a shadow project. Don't ask; just do it.</p><p>Forget the backlog.</p><p>Luckily, programmers are uniquely equipped for doing shadow work. We don't need special equipment or capital to run our experiments. We can run them on the computers we already have. We don't have to present the ROI or ask for budget to acquire new machinery. We are free to try anything we like, and with so much free software available, it's often as simple as typing 'apt install'.</p><p>Of course you'll be picking something that helps the business too. But that's not why you do it. You do it to better <em>your</em> position, make <em>your</em> life easier, or increase <em>your</em> future prospects. Backlogs focus on what <em>other</em> people want. Shadow projects restore the balance. They let you take the wheel for awhile and establish mutual benefit&#8212;yours and the company's.</p><p>It probably goes without saying, but while you're working on a shadow project, you don't tell anyone. Don&#8217;t put a ticket into Jira. What they don't know can't hurt them, right? I know it probably sounds subversive (to be honest, that's part of the fun). But is it really? You're working for the good of the company, in a way that will motivate you far more than working from a never-ending list of tasks. This way, you'll be far more productive.</p><p>Just because your manager doesn't understand this concept, doesn't mean you should rot away at your desk updating Jira. Doing shadow work is like pretending your manager actually <em>does</em> know how to motivate you ("Sure! I'd <em>love</em> to research a new language. Thanks!" "A little time for some clean-up work? Don't mind if I do.") and delivering the superior results they don't deserve. Who knows, it may even get them that promotion they are in no way qualified for.</p><p>Here's another way to look at it: shadow projects are a way to diversify. If you only do what you're told, you're putting all your eggs in one basket. You're counting on your employer to direct your efforts in a way that will be good for you long term. You're totally dependent on them. I'm much more comfortable taking my fate into my own hands and working on several fronts at the same time. Some sanctioned stuff and some secret stuff. If the sanctioned route works out, then great (for whatever reason, that's rarely the case for me). But if it doesn't, I have other irons in the fire.</p><p>Additionally, shadow projects fill an organizational gap. Because of their narrow focus and lack of context, backlogs leave many important things undone, things that programmers are acutely aware of. When you do shadow projects, you're naturally drawn to those neglected areas. By doing yourself the service of addressing things you find painful, you're actually doing the organization a service as well. These are exactly the things your organization needs to address.</p><p>Shadow projects can be anything. Sometimes they're directly related to the customer: a new feature or a GUI to hide a tricky command-line. Sometimes they focus on making your day-to-day life easier: some elisp code, a new plugin for your editor, or something to make Jenkins go faster. What's important is to trust yourself to be the guide. If you feel pain, it's relevant. You don't have to stuff it down anymore.</p><p>Another reason shadow projects should be exciting to you personally, is so they are interesting enough to motivate you to do them (secretly) alongside your normal work. Many of my shadow projects are moon shots&#8212;ideas that are radical, but if they work, they can make a dramatic difference. I've found going after big things is the best way to keep me interested.</p><h4>Example Shadow Projects</h4><p>For inspiration, here are a few shadow projects that have turned out well for me:</p><ul><li><p>Using vagrant and/or docker to create development environments that match production, which eventually turned into a way to create repeatable production environments. (This is common now, but back when I started trying this approach, it was more radical)</p></li><li><p>Exposing C code as modules to other languages (ex. gambit, python, C++, zig) to make the system more scriptable&#8212;especially useful for writing tests.</p></li><li><p>Building an A/B partitioning scheme for an embedded Linux device. Each update is an OS image that's installed to the inactive partition&#8212;which then becomes the active partition.</p></li><li><p>Converting complicated makefiles and visual studio projects to cmake, which can then automatically generate makefiles, visual studio projects and much more.</p></li><li><p>Building gameplay components for level designers in a visual scripting language they were already using, to allow them to design level functionality themselves, instead of having to rely on developers to script it all.</p></li><li><p>Using python to generate C code for state machines instead of coding them by hand. </p></li><li><p>Investigating literate programming tools to help documentation and code stay in sync, which eventually led to an exciting open source project: <a href="https://github.com/adam-ard/organic-markdown">https://github.com/adam-ard/organic-markdown</a></p></li><li><p>Adding parallelism to Jenkins builds to take them from hours to minutes.</p></li></ul><p>Looking back, I realize some of my best projects were shadow projects. Lots of good feelings. I'll spare you the details of my failed efforts (but even failures teach you something).</p><p>Here are some additional things to keep in mind as you navigate the shadow lands.</p><h4>Stay Strong, Stay Quiet</h4><p>With shadow projects, it's rarely useful to tell anyone what you&#8217;re doing until you're <em>completely</em> done. That way, if it doesn't work out, you don't have to bring it up at all. No one's the wiser, and people don't start getting the idea you're addressing your own needs concurrently with their priorities (even though you are).</p><p>Remember to make at least a little progress on something in Jira every day so you have something to report in morning stand-ups. Otherwise, people might start asking questions and you'll be forced to reveal your stealth project. At which point, they'll start a pressure campaign to make you stop. ("We don't have time for that right now." "Can you make a ticket for that, so we can (de)prioritize it?" "Let's get your current tickets done first.")</p><p>Once a shadow project shows promise, and you have some real working code to show off, then you can take a stab at sharing it&#8212;perhaps first with a trusted colleague or maybe more widely. Whatever you think gives your idea its best showing. Trust your intuition.</p><p>How much working code you need before sharing depends on your goal. How hard is it going to be to convince other people that your idea is viable? If you're dealing with more stubborn coworkers, it might be best to wait until you've implemented a lot of it. Then you can say, "If you don't believe me, here it is. I already wrote it."</p><p>If you're dealing with coworkers that are easier to engage, just a little code or research might do the trick. Every situation is unique.</p><h4>A Cup of Rejection with a Pinch Glory</h4><p>From the beginning you should expect that nine out of ten shadow projects won't go anywhere, at least not at first. You either won't find them worth presenting or they'll be rejected (by your boss, the team lead, and/or the rest of the team). That's OK! Just file it away for now. You'll have chances to bring it up again down the road&#8212;especially if the problem you're trying to solve is painful to others as well. Also, now you've established yourself as a pioneer of the alternative path. People will remember you. They'll come to you in the future when they're finally ready for a change. But no matter what happens to the project itself, you'll retain what you've learned and be a better engineer for your effort.</p><p>And what about the one in ten ideas that <em>do</em> get accepted? They can totally change your career. When you manage to get people onboard, opportunities open up. As a result of shadow projects, I've been offered positions on other teams, shifted to new specialties, been saved from getting fired, and maintained connections that have led to future opportunities. In all honesty, I don't know where I'd be in my career without my shadow projects. They've made all the difference.</p><h4>Some Honest Talk</h4><p>I'd be lying if I said that shadow projects don't come with some risk; you never know how management is going to respond to someone who goes rogue occasionally. The worst case scenario is you get fired. Most of the time, though, that doesn't happen. Someone who does extra work, for the benefit of the company, is hard to get mad at&#8212;even if they are a little subversive. Most managers are smart enough to appreciate free work.</p><p>This is how I think about it. If a shadow project gets me fired, I am likely working for a control freak. It's unlikely I'll ever be happy working for a control freak, no matter what I do. So, as difficult as it may be in the moment, getting fired is probably my best outcome; it gets me on to working somewhere with more potential. For that reason, shadow projects are a risk I'm willing to take. I realize that not everyone has the same risk tolerance as me though, and some may see a rare loss of employment offset by occasional moments of shining glory as an unacceptable trade-off. I respect that. The goal is to make work better. If a shadow project is just going to tie you in knots, it's probably not for you.</p><h4>Are you game?</h4><p>But if you're ready for an adventure, and your job feels like an endless stream of uninspiring errands, shadow projects might be your thing. They&#8217;re not just a way to escape monotony; they&#8217;re a way to reclaim agency in your career, sharpen your skills, and discover new opportunities. So proceed with caution, embrace the challenge, and enjoy the ride&#8212;because sometimes, the best work happens in the shadows.</p><p></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><a href="https://scrumguides.org/scrum-guide.html">https://scrumguides.org/scrum-guide.html</a></p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Fighting over Crumbs]]></title><description><![CDATA[In software companies, management lets precious little control fall to programmers.]]></description><link>https://rethinkingsoftware.substack.com/p/fighting-over-crumbs</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/fighting-over-crumbs</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Mon, 30 Dec 2024 07:21:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rnBd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.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_!rnBd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rnBd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 424w, https://substackcdn.com/image/fetch/$s_!rnBd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 848w, https://substackcdn.com/image/fetch/$s_!rnBd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 1272w, https://substackcdn.com/image/fetch/$s_!rnBd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rnBd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png" width="664" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:664,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105599,&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_!rnBd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 424w, https://substackcdn.com/image/fetch/$s_!rnBd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 848w, https://substackcdn.com/image/fetch/$s_!rnBd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.png 1272w, https://substackcdn.com/image/fetch/$s_!rnBd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f344b3c-4f7a-4afe-9f00-717df4b470fe_664x597.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>In software companies, management lets precious little control fall to programmers. They gobble it up themselves. This is a big problem! It turns programmers into assembly-line, knowledge workers&#8212;managed by tasks rather than projects or delegated responsibilities.</p><p>In this desert of autonomy, one of the saddest things you'll see is programmers fighting over the few crumbs of power that happen to fall from the table.</p><p>Of course, if programmers had access to real power, they'd stop fighting immediately. Who has time to wrestle over mere tokens of control when there are actual responsibilities to attend to?</p><p>But, conditions being what they are, software engineers ache from a lack of autonomy, a state that drives them to a handful of micro-power-grabbing behaviors:</p><h3>Land Grabbing</h3><p>When some question arises, such as which XML library to use, or package manager, or documentation tool, developers race to set up camp first in the new territory. Frantically, they research, make suggestions, write code samples, often on their own time.</p><p>This is all in hopes of being put in charge of this tiny decision. A kind of squatter's rights&#8212;to become the new documentation tooling czar or XML parsing king. Feel. The. Power.</p><p>This frenzied competition is unnecessary. Undecided questions should fall to individual teams; think states' rights. No need to standardize. Programmers will naturally converge on the best solutions while still leaving room for individual circumstances. We're better off sharing these decisions&#8212;no czars or kings necessary.</p><h3>Code Review Camping</h3><p>For most developers, code reviews are their only chance to flex the muscles of compulsion. Because they can hold a pull request hostage for any reason at all, sadly, many are all too willing to take the opportunity.</p><p>Perhaps they view it as their chance to show commitment to a greater cause or show they are ready for a greater responsibility. Or maybe it's simply because, in that shining moment, they're the boss; their vision is most important. Whatever the reason, every detail must be scrutinized. Even adjacent code must be scrubbed, because "we might as well, while we are in there." Suddenly they&#8217;re Anna Wintour and you&#8217;re the intern, grabbing coffee and picking up clothes from the dry-cleaner. </p><p>I honestly think this is the reason so many developers religiously defend the practice of code reviews, no matter how inefficient they are. It's their only chance to feel respected. I understand; but I hate it. I look forward to a time when we can quit this stupid game.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9iO4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9iO4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 424w, https://substackcdn.com/image/fetch/$s_!9iO4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 848w, https://substackcdn.com/image/fetch/$s_!9iO4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 1272w, https://substackcdn.com/image/fetch/$s_!9iO4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9iO4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png" width="689" height="252" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37001809-20a4-4c32-81d3-d37905c54e34_689x252.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:252,&quot;width&quot;:689,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65082,&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_!9iO4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 424w, https://substackcdn.com/image/fetch/$s_!9iO4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 848w, https://substackcdn.com/image/fetch/$s_!9iO4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.png 1272w, https://substackcdn.com/image/fetch/$s_!9iO4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37001809-20a4-4c32-81d3-d37905c54e34_689x252.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>Committee Forming</h3><p>Power-starved developers often look to form committees to wrestle some control back. Architecture committees are the most common. However, this rarely gives developers any extra power from above. It only consolidates the little power that remains into the hands of an "anointed" few.</p><p>The result is added bureaucracy&#8212;extra standards, layers of pre-approval, and bottlenecks that slow down decision-making. Committees add more friction than value.</p><h3>"Mentoring"</h3><p>I cringe when someone says they're skilled at mentoring. It feels so paternalistic. First, it assumes there are only two groups of programmers: teachers and learners, parents and children, those who know and those who don't. Second, it positions the speaker as one who knows, placing them above the rest.</p><p>I'm sure for some this is an innocent statement about a desire to teach, but I'm suspicious that more often than not it's a political maneuver: <em>Hey boss. Send me the juniors. I'll tell 'em what to do. Lemme take that off your plate.</em></p><p>I, for one, have no interest in being mentored. I'll collaborate with anyone, but if someone wants to pat me on the head and tell me how the world <em>really</em> works, they can give their blessed knowledge to someone else.</p><h3>Overzealous Team Leading</h3><p>Team Lead is the only non-management role allowed to boss other programmers around; and boy do they! By the time they get to be a lead, many are so thirsty for responsibility they drink it <em>all</em> up. Any minor technical issue (and at their level, most issues are minor) must be pried from their white-knuckled, death grip.</p><p>Curly brace position, tabs or spaces, functional vs. OOP, raw SQL vs. ORM, Jenkins vs. CircleCI. Don't even ask; the Team Lead's going to make <em>that</em> decision. They're not letting go. The Team Lead can be more stubborn than anyone else you report to. They've spent years as a peon and they'll be damned if anyone's going to take a slice of their new shred of dignity.</p><p>Sometimes you'll catch them hunched under their desk, clenching their fists, chanting their mantra: "mine... mine... mine..."</p><h3>We Are Better Than This</h3><p>I&#8217;ve fallen prey to these behaviors as much as anyone else; I can&#8217;t judge. But, I think we can do better. </p><p>Programmers are natural self-organizers (look at the open source movement). We don't need to hoard control. We don't need to tell each other what to do.</p><p>I know we&#8217;re starving for autonomy, something to call our own. But the ways we've chosen to satiate our hunger will never bring long-term satisfaction. They only distract us from making a real play for control.</p><p>We can be better than our circumstances; we can share our (admittedly limited) power evenly across self-managing individuals and teams. We don't need team leads or committees. We can stop the land-grabbing and the mentoring. We can even trust each other enough to forgo excessive code review requirements and pre-authorizations. We can work as peers, allowing each other an equal portion, and stop wasting energy grasping at crumbs.</p>]]></content:encoded></item><item><title><![CDATA[Extra DRY with Literate Programming]]></title><description><![CDATA[NOTE: The mobile version of this article doesn&#8217;t format code sections properly.]]></description><link>https://rethinkingsoftware.substack.com/p/dry-on-steroids-with-literate-programming</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/dry-on-steroids-with-literate-programming</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sun, 22 Dec 2024 04:11:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!D9DG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp" 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_!D9DG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D9DG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!D9DG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!D9DG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!D9DG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D9DG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:526540,&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;: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_!D9DG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!D9DG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!D9DG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!D9DG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97778ff2-b604-492d-821a-2efbd0b31b76_1024x1024.webp 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 aria-hidden="true" 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><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><blockquote><p>NOTE: The mobile version of this article doesn&#8217;t format code sections properly. Try the desktop version instead.</p></blockquote><p>I like my code DRY (Don&#8217;t Repeat Yourself)&#8212;no boilerplate, no repetition. But there&#8217;s always a handful of things I can't clean up. Literate program helps me scrub out those last few stubborn repetitions. Because it's basically a pre-processor, Literate programming can DRY out things that no programming language can. Want to write your company's copyright notice once and reference it in all your source files? Want a project name variable that you can reference across your project? Literate programming is up to the challenge.</p><p>Here<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, I reuse a copyright notice in several files. If I ever need to update it, I change it in one place and run &#8216;omd tangle&#8217;; it gets changed everywhere. </p><h5>File: main.md</h5><pre><code># My Example File

## Here is my copyright notice

```C {name=copyright}
/*
 * Copyright (C) 2024 Adam Ard
 *
 * Permission is hereby granted to use, copy, modify, and distribute
 * this code for any purpose, with or without attribution.
 * This code is provided "as is", without warranty of any kind.
 */
```

## Files

Here are two C files with some mildly interesting example code. Notice how they both have a reference to my copyright in them.

```C {tangle=file1.c}
@&lt;copyright@&gt;

int factorial(int n) {
    if (n &lt;= 1) return 1;
    return n * factorial(n - 1);
}
```

```C {tangle=file2.c}
@&lt;copyright@&gt;

int is_prime(int n) {
    if (n &lt; 2) return 0;
    for (int i = 2; i * i &lt;= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}
```</code></pre><p>Now if I run &#8216;omd tangle,&#8217; Organic Markdown spits out my files:</p><h5>terminal output:</h5><pre><code>$ ls
main.md

$ omd tangle

$ ls
file1.c  file2.c  main.md

$ cat file1.c
/*
 * Copyright (C) 2024 Adam Ard
 *
 * Permission is hereby granted to use, copy, modify, and distribute
 * this code for any purpose, with or without attribution.
 * This code is provided "as is", without warranty of any kind.
 */

int factorial(int n) {
    if (n &lt;= 1) return 1;
    return n * factorial(n - 1);
}

$ cat file2.c
/*
 * Copyright (C) 2024 Adam Ard
 *
 * Permission is hereby granted to use, copy, modify, and distribute
 * this code for any purpose, with or without attribution.
 * This code is provided "as is", without warranty of any kind.
 */

int is_prime(int n) {
    if (n &lt; 2) return 0;
    for (int i = 2; i * i &lt;= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}
</code></pre><p>To make life even easier, I add a &#8216;copyright-year&#8217; variable to a yaml block at the top of the markdown file. Then I can reference it in my copyright code block:</p><h5>main.md</h5><pre><code>---
constants:
  copyright-year: 2024
---

# My Example File

## Here is my copyright notice

```C {name=copyright}
/*
 * Copyright (C) @&lt;copyright-year@&gt; Adam Ard
 *
 * Permission is hereby granted to use, copy, modify, and distribute
 * this code for any purpose, with or without attribution.
 * This code is provided "as is", without warranty of any kind.
 */
```</code></pre><p>When 2025 comes, I&#8217;ll simply change the year in the yaml header, and run &#8216;omd tangle&#8217; again. All the files will get updated.</p><p>Something else I like to do is add the project name to the yaml header block. Then I can use it all over the project. Below, the filenames, executable name, code blocks and documentation all use the project-name variable defined in the yaml header block:</p><h5>main.md</h5><pre><code>---
constants:
  copyright-year: 2025
  project-name: dry-example
---

# My Example File

## Here is my copyright notice

```C {name=copyright}
/*
 * Copyright (C) @&lt;copyright-year@&gt; Adam Ard
 *
 * Permission is hereby granted to use, copy, modify, and distribute
 * this code for any purpose, with or without attribution.
 * This code is provided "as is", without warranty of any kind.
 */
```

## Files for the @&lt;project-name@&gt; project

Here are four C files with some mildly interesting example code I got
from ChatGPT. Notice how they all have a reference to my copyright in
them.

```C {tangle=@&lt;project-name@&gt;-1.c}
@&lt;copyright@&gt;

int factorial(int n) {
    if (n &lt;= 1) return 1;
    return n * factorial(n - 1);
}
```

```C {tangle=@&lt;project-name@&gt;-2.c}
@&lt;copyright@&gt;

int is_prime(int n) {
    if (n &lt; 2) return 0;
    for (int i = 2; i * i &lt;= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}
```

```C {tangle=main.c}
@&lt;copyright@&gt;

#include &lt;stdio.h&gt;

int factorial(int n);
int is_prime(int n);

int main() {
    printf("Running @&lt;project-name@&gt;\n\n");
    printf("factorial of 5: %d\n", factorial(5));
    printf("is_prime 29: %d\n", is_prime(29));
}
```

## Build the examples

```bash {name=build menu=true}
gcc @&lt;project-name@&gt;*.c main.c -o @&lt;project-name@&gt;
```</code></pre><p>It all works as expected:</p><h5>terminal output</h5><pre><code>$ ls
main.md

$ omd tangle

$ ls
dry-example-1.c  dry-example-2.c  main.c  main.md

$ omd run build

$ ls
dry-example  dry-example-1.c  dry-example-2.c  main.c  main.md

$ ./dry-example 
Running dry-example

factorial of 5: 120
is_prime 29: 1</code></pre><p>Using executable code blocks, I can transform the project-name into an include guard<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> and use it in a header file. When I add a &#8216;*&#8217; to the name of a literate reference, the tangle command inserts the output of running the code block instead of inserting the code block itself, as it normally would:</p><h5>main.md</h5><pre><code>## A code block to translate input text into `#include guard` format

```python {name=to-include-guard}
for c in "@&lt;txt@&gt;":
    if c.isalnum():
        print(c.upper(), end="")
    else:
        print("_", end="")
        
print("_H", end="")
```

## Header files

```C {name=include-guard}
@&lt;to-include-guard*(txt="@&lt;project-name@&gt;-@&lt;num@&gt;")@&gt;
```

```C {tangle=@&lt;project-name@&gt;-1.h}
#ifndef @&lt;include-guard(num=1)@&gt;
#define @&lt;include-guard(num=1)@&gt;

int factorial(int n);

#endif /* @&lt;include-guard(num=1)@&gt; */
```

```C {tangle=@&lt;project-name@&gt;-2.h}
#ifndef @&lt;include-guard(num=2)@&gt;
#define @&lt;include-guard(num=2)@&gt;

int is_prime(int n);

#endif /* @&lt;include-guard(num=2)@&gt; */
```</code></pre><h5>console output</h5><pre><code>$ omd tangle &amp;&amp; omd run build

$ ls
dry-example  dry-example-1.c  dry-example-1.h  dry-example-2.c  dry-example-2.h  main.c  main.md

$ cat dry-example-1.h
#ifndef DRY_EXAMPLE_1_H
#define DRY_EXAMPLE_1_H

int factorial(int n);

#endif /* DRY_EXAMPLE_1_H */

$ cat dry-example-2.h
#ifndef DRY_EXAMPLE_2_H
#define DRY_EXAMPLE_2_H

int is_prime(int n);

#endif /* DRY_EXAMPLE_2_H */</code></pre><p>Now that&#8217;s some DRY code! If you&#8217;d like to learn more about Organic Markdown, checkout the github project: <a href="https://github.com/adam-ard/organic-markdown">https://github.com/adam-ard/organic-markdown</a>. The main readme has more instructions and links to additional documentation.</p><p>Here is the full code listing for reference. Happy Literate Programming!</p><h5>main.md</h5><pre><code>---
constants:
  copyright-year: 2025
  project-name: dry-example
---

# My Example File

## Here is my copyright notice

```C {name=copyright}
/*
 * Copyright (C) @&lt;copyright-year@&gt; Adam Ard
 *
 * Permission is hereby granted to use, copy, modify, and distribute
 * this code for any purpose, with or without attribution.
 * This code is provided "as is", without warranty of any kind.
 */
```

## A code block to translate input text into `#include guard` format

```python {name=to-include-guard}
for c in "@&lt;txt@&gt;":
    if c.isalnum():
        print(c.upper(), end="")
    else:
        print("_", end="")
        
print("_H", end="")
```

## Header files

```C {name=include-guard}
@&lt;to-include-guard*(txt="@&lt;project-name@&gt;-@&lt;num@&gt;")@&gt;
```

```C {tangle=@&lt;project-name@&gt;-1.h}
#ifndef @&lt;include-guard(num=1)@&gt;
#define @&lt;include-guard(num=1)@&gt;

int factorial(int n);

#endif /* @&lt;include-guard(num=1)@&gt; */
```

```C {tangle=@&lt;project-name@&gt;-2.h}
#ifndef @&lt;include-guard(num=2)@&gt;
#define @&lt;include-guard(num=2)@&gt;

int is_prime(int n);

#endif /* @&lt;include-guard(num=2)@&gt; */
```

## Files for the @&lt;project-name@&gt; project

Here are four C files with some mildly interesting example code I got
from ChatGPT. Notice how they all have a reference to my copyright in
them.

```C {tangle=@&lt;project-name@&gt;-1.c}
@&lt;copyright@&gt;

#include "@&lt;project-name@&gt;-1.h"

int factorial(int n) {
    if (n &lt;= 1) return 1;
    return n * factorial(n - 1);
}
```

```C {tangle=@&lt;project-name@&gt;-2.c}
@&lt;copyright@&gt;

#include "@&lt;project-name@&gt;-2.h"

int is_prime(int n) {
    if (n &lt; 2) return 0;
    for (int i = 2; i * i &lt;= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}
```

```C {tangle=main.c}
@&lt;copyright@&gt;

#include &lt;stdio.h&gt;

#include "@&lt;project-name@&gt;-1.h"
#include "@&lt;project-name@&gt;-2.h"

int main() {
    printf("Running @&lt;project-name@&gt;\n\n");
    printf("factorial of 5: %d\n", factorial(5));
    printf("is_prime 29: %d\n", is_prime(29));
}
```

## Build the examples

```bash {name=build menu=true}
gcc @&lt;project-name@&gt;*.c main.c -o @&lt;project-name@&gt;
```</code></pre><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> In this article, I use Organic Markdown: https://github.com/adam-ard/organic-markdown</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>https://en.wikipedia.org/wiki/Include_guard</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Lessons from Christmas Puzzles]]></title><description><![CDATA[My wife's gotten into Christmas puzzles this year.]]></description><link>https://rethinkingsoftware.substack.com/p/lessons-from-christmas-puzzles</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/lessons-from-christmas-puzzles</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Mon, 16 Dec 2024 07:09:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Kxow!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp" 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_!Kxow!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kxow!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Kxow!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Kxow!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Kxow!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kxow!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:436138,&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;: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_!Kxow!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Kxow!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Kxow!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Kxow!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94a0261-338c-45df-a09e-e730ff2192fe_1024x1024.webp 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 aria-hidden="true" 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><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>My wife's gotten into Christmas puzzles this year. She leaves them half-finished on a table in the family room. As soon as one is finished, she starts the next. So, naturally, I sit down occasionally to hunt for a piece or two&#8212;what could possibly go wrong?</p><p>Four hours later, I realize it's 2:00 am and I've done nothing else with my evening and I swear I'm coming to bed in one second. Just one more piece to finish the cat... I'm so close. Here kitty kitty... let&#8217;s get you home. ARE YOU TOO GOOD FOR YOUR HOME?!</p><p>It goes without saying, I've spent a lot of time lately on these heroin-soaked devils and I'm starting to think of <em>everything</em> in terms of Christmas puzzles (the same way too much Tetris makes everything feel like a block I need to find a <em>really</em> good place for). </p><p>Here are a few life lessons from my puzzle-frenzied mind. May they serve your puzzle addiction (and maybe your life in general) as well as they have mine.</p><h4>A Foundation</h4><p>When I start a puzzle, my mind has to build a foundation first. Subconsciously, it starts cataloging colors and locations. I may not be placing lots of pieces, but that doesn't matter. If I stick with it through the slow phase, pretty soon I start recalling features of the puzzle from memory. Mystically, I'll see a piece and say, <em>Oh, that goes right here</em>. That&#8217;s when the momentum picks up.</p><h4>Progress</h4><p>I work and I work and it feels like I've hardly made progress at all. Then, out of nowhere, after many hours I can't fully recall, I&#8217;m almost done. </p><p>To notice my progress, I have to force myself to stop and look around. Sometimes I&#8217;m so deep in the puzzle I need my wife to tell me how much progress she&#8217;s seen me make (&#8220;You&#8217;re doing too much; leave some for me!" &#8220;You have to stop; you have a  problem.&#8221; ) to believe I am really getting somewhere.</p><h4>Fatigue</h4><p>It may seem obvious, but it&#8217;s amazing how often I try to do a puzzle when my brain is too tired. It's best to stop and sleep a bit. What takes hours with a tired brain can be accomplished in minutes with a fresh one.</p><h4>Companionship</h4><p>It's useful to have someone else working on the puzzle with me&#8212;for many reasons: I tire less quickly, we can team up in various ways, and it's more entertaining overall.</p><h4>Beginner's Mind</h4><p>Pieces that seem like they <em>must</em> fit&#8212;perfect color and shape&#8212;often belong somewhere else entirely. I need to keep a beginner's mind and be open to different interpretations.</p><h4>Nothing's Perfect</h4><p>Sometimes a piece falls on the floor, and my dog eats it&#8212;oops. But I have to be OK with that. Nothing in life is perfect. Some of our puzzles have missing pieces, but so what? They're still worth doing. Perfectionism be damned.</p><h4>Let the Puzzle Decide</h4><p>I often get stuck looking for one piece or finding a place for another. I have to stop forcing the work and let the puzzle unfold how <em>it</em> wants to. </p>]]></content:encoded></item><item><title><![CDATA[Strong Code Ownership]]></title><description><![CDATA[Lessons from Xiaogang]]></description><link>https://rethinkingsoftware.substack.com/p/strong-code-ownership</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/strong-code-ownership</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sat, 07 Dec 2024 18:52:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WFBF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg" 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_!WFBF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WFBF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WFBF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WFBF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WFBF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WFBF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg" width="1067" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:1067,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:285652,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WFBF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WFBF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WFBF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WFBF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4b0703b-6726-4a34-b05a-04df5e51524f_1067x1280.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><figcaption class="image-caption">Image by <a href="https://pixabay.com/users/photographer999-23209011/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=6593929">Mahafuzur Rahman</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=6593929">Pixabay</a></figcaption></figure></div><p>Martin Fowler describes three categories of code ownership:<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p><strong>Strong Code Ownership:</strong> Each module (classes, functions, files) is assigned to one developer, who <em>exclusively</em> makes changes. Others must request changes through the owner, often by submitting patches (or pull requests).</p></li><li><p><strong>Weak Code Ownership:</strong> Modules have owners, but anyone can modify them. Owners monitor changes to their modules and collaborate on significant edits.</p></li><li><p><strong>Collective Code Ownership:</strong> The team owns the codebase collectively, allowing anyone to make changes anywhere. Advocates emphasize team ownership over individual control.</p></li></ul><p>Later in his article he says, &#8220;Of the three the one I really don't like is strong code ownership&#8221; and admits a preference for &#8220;the dynamics of a collective code ownership team&#8212;particularly in the context of Extreme Programming.&#8221; The agile community has followed suit with that opinion. On most teams, anyone can edit anything. </p><p>As Fowler points out, this model works well if you use the collaboration practices from Extreme Programming (XP). But I believe the industry was too hasty to dismiss strong code ownership, which provides its own set of benefits<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> (especially when run like an open source project). It can be just as effective as XP and sometimes, when considering the individual preferences and talents on your team, it may be the better option.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p><h3>Ownership in Xiaogang</h3><p>Consider the story of how China transformed itself economically by embracing the previously forbidden practice of ownership&#8212;allowing workers to reap the <em>direct</em> benefits of their labor.</p><p>In the 70&#8217;s, in China, there was no concept of private property. Farmers worked on collectives where the government took all that was produced and divided it equally among all families. One such collective was located in the village of Xiaogang where residents were struggling to grow enough food, resorting to begging.</p><p>Realizing that something had to change, secretly, farmers in Xiaogang parceled up the land among the village families, allowing each to keep at least some of their own harvest, if it was bountiful enough. They risked death to try their illegal experiment, but in the end it was successful. It netted a larger harvest &#8220;than in the previous 5 years combined.&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a></p><p>What was the difference? The rules of the game. In a word: ownership. Where before:</p><blockquote><p>There was no incentive to work hard&#8202;&#8212;&#8202;to go out to the fields early, to put in extra effort<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a></p></blockquote><p>Now the village was motivated. It thrived. After the secret arrangement, villagers became masters of their own fate.</p><blockquote><p>It was the same land, the same tools and the same people. Yet just by changing the economic rules&#8202;&#8212;&#8202;by saying, you get to keep some of what you grow&#8202;&#8212;&#8202;everything changed.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p></blockquote><p>Needless to say, it was not possible to hide a 5X productivity increase from the government. But luckily, their actions where not viewed as treason but instead as instructional. Among other reforms, China implemented the model of Xiaogang&#8217;s partially privatized farm nationwide and &#8220;China&#8217;s economy started to grow like crazy. Since 1978, something like 500 million people have risen out of poverty in China.&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a></p><h3>Ownership in Software Development</h3><p>Software teams can reap the same benefits of ownership as Xaiogang. Obviously, developers don&#8217;t own their code in a legal sense; when they leave the company, they don&#8217;t take source code with them and use it elsewhere. But they can still own the code in ways that yield the motivational benefits achieved by the Chinese Farmers of Xiaogang. Parceling up the codebase among team members, in a strong code ownership arrangement, makes everyone a custodian or steward over a piece of the product. Individual programmers can be guardians of their piece&#8217;s design, testing,  and quality. When evaluating pull requests, their detailed knowledge and investment make them rigorously attentive. All code must conform to their personal standards to be acceptable.</p><p>There are many benefits of strong code ownership; below are a few:</p><ul><li><p><strong>Mastery of a domain&#8202;</strong>: Focus on a narrower section of code makes it easier to master.</p></li><li><p><strong>Pride in workmanship</strong>&#8202;: It&#8217;s easier to look back and be proud of good results in your stewardship&#8212;the code over which you were solely responsible.</p></li><li><p><strong>Respect from peers</strong>&#8202;: It&#8217;s easier for others to appreciate good results in your stewardship.</p></li><li><p><strong>Joy of providing customer value&#8202;</strong>: &#8202;It&#8217;s easier to see how your work directly effects the customer, as they interact with the code from your stewardship.</p></li><li><p><strong>Code cleanliness: </strong>With gatekeepers, code changes are rigorously vetted and stay true to original design.</p></li><li><p><strong>Personal portfolio</strong>&#8202;: It&#8217;s easier to collect concrete examples of your work and easier for your manager to assess them.</p></li><li><p><strong>Higher quality:</strong> Programmers tend to take better care of their individual stewardship, better than code shared by everyone. In a <a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/bird2011dtm.pdf">2011 study</a> examining the relationship between code ownership and software quality, Microsoft determined that files with clear ownership had fewer defects.</p></li></ul><h3>The Pendulum Always Swings Too Far</h3><p>Before the agile revolution, strong code ownership was common. Jeff Atwood&#8217;s article from 2005, <em>You Gotta Own It,</em> displays a strong code ownership ethos:</p><blockquote><p>&#8230; Renters don't take pride in their homes. Only homeowners do.</p><p>&#8230; if you do want great software, you have to let the developers own what they&#8217;re building. The developers are inevitably the ones who have the most control over the success or failure of the project. Creating an environment where your developers have no emotional attachment to the project they&#8217;re working on is a recipe for mediocre software&#8202;&#8212;&#8202;and job disillusionment.</p><p>The notion of "egoless programming" is dangerous and wrongheaded.</p><p>&#8230;Smart organizations cultivate this sense of ego-driven ownership with an implied trust: they go out of their way to hire smart people, and then they <em>get out of the way</em>.</p><p>If you're not working in an environment where ownership is encouraged, either wrest control from the powers that be, or start looking for another job. <strong>You gotta own it</strong>.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a></p></blockquote><p>He quotes Joel Spolsky:</p><blockquote><p>Software, by its nature, is very easy to divide into smaller and smaller components, so it's always possible to divide up responsibility among people and let people own an area. <strong>This is probably THE reason why software people love working at Microsoft.</strong><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a></p></blockquote><p>A lot of good software was built with strong code ownership. We know it works.</p><p>But with agile&#8217;s rightful rejection of waterfall&#8217;s upfront planning, a shift towards shared code ownership came along for the ride. While it did popularize a collaboration model ideal for extroverted programmers&#8212;that were perhaps suffering from feelings of isolation&#8212;the pendulum swung too far the other way and cut out the introverts&#8212;programmers that draw energy from being alone. After agile came, the suffering switched to them.</p><p>It doesn&#8217;t have to be one or the other. Strong and collective code ownership teams can co-exist in the same organization and service both personality types. (I don&#8217;t think it&#8217;s a good idea to do both on the same team though) Neither type need be overlooked. Programmers may even benefit from trying out &#8220;the other side&#8221; once in a while depending on the circumstances.</p><p>So, for the sake of suffering introverted programmers everywhere, <em>please</em> don&#8217;t discount strong code ownership. It can be just as effective as a well run XP project and, for some teams, it may be superior. On your next project, especially if your team needs a motivational boost, give strong code ownership a try. It may just be the change you need.</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><a href="https://martinfowler.com/bliki/CodeOwnership.html">https://martinfowler.com/bliki/CodeOwnership.html</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p><a href="https://rethinkingsoftware.substack.com/p/programmer-collaboration-styles">Programmer Collaboration Styles</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Scrum implementations tend to be stuck somewhere in the ineffective middle of these two options, reaping the benefits of neither one.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p><a href="https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china">https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p><a href="https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china">https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p><a href="https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china">https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p><a href="https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china">https://www.npr.org/sections/money/2012/01/20/145360447/the-secret-document-that-transformed-china</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p><a href="https://blog.codinghorror.com/you-gotta-own-it/">https://blog.codinghorror.com/you-gotta-own-it/</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>https://www.joelonsoftware.com/2000/03/19/two-stories/</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Operation Liberate Programmer]]></title><description><![CDATA[Apparently, they just wrapped up the 16th Annual Give Thanks for Scrum Conference. (Yes, that's a real thing.]]></description><link>https://rethinkingsoftware.substack.com/p/operation-liberate-programmer</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/operation-liberate-programmer</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Thu, 05 Dec 2024 01:26:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pj8g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.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_!pj8g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pj8g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 424w, https://substackcdn.com/image/fetch/$s_!pj8g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 848w, https://substackcdn.com/image/fetch/$s_!pj8g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 1272w, https://substackcdn.com/image/fetch/$s_!pj8g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pj8g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png" width="1280" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:412290,&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_!pj8g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 424w, https://substackcdn.com/image/fetch/$s_!pj8g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 848w, https://substackcdn.com/image/fetch/$s_!pj8g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.png 1272w, https://substackcdn.com/image/fetch/$s_!pj8g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b064ce8-f681-44b6-8b46-d83fe17c60d0_1280x808.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 aria-hidden="true" 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><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">Image by <a href="https://pixabay.com/users/pixundfertig-683277/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4262053">Ria Sopala</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4262053">Pixabay</a></figcaption></figure></div><p>Apparently, they just wrapped up the <em>16th Annual Give Thanks for Scrum Conference.</em><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> (Yes, that's a real thing. I wish it were a joke.) Jeff Sutherland is touting the next evolution of Scrum: <em>Extreme Agile</em>. (Nope, still not a joke. That's really what he&#8217;s calling it. Yes, I know there's already an Extreme Programming.) He's all done with "twice the work, in half the time," the measly 4X improvement he claims to get from Scrum. With Extreme Agile (essentially Scrum + AI + magic) he's claiming to get up to a 100X improvement (Nope, not an exaggeration. He really said 100.)</p><p>So, let's do the math. Something that takes a normal developer (someone not using Extreme Agile) a full year (~2000 hours), will take 20 hours for one of Jeff's devoted followers--not even a full week's work. </p><p>Face. To. Palm.</p><p>But everyone knows it's just hyperbole, right? He just means 'going fast' and now 'going really fast'. What's the big deal? The main problem with this laser focus on speed over all else isn't that the numbers are highly suspicious, it's that they telegraph to managers everywhere that Jeff is still their man. Scrum was about speed before, and Extreme Agile is about even more speed now. It's a management dog whistle. Your boss knows they can rely on the fact that Jeff still has his priorities straight. None of this nonsense about craftsmanship or building the right thing. That's just developer speak for, "I want to take it easy, and chase after shiny objects." Jeff sees through that. It won't be long before your boss is saying, "Let's  get our guys out there for some Extreme Agile training." </p><p>So I've realized (been reminded really) it's not worth fighting any more. In the future, if I'm ever poised to jump down the Scrum-bashing rabbit-hole again, I&#8217;m going to remind myself: if it&#8217;s not Scrum, it'll be something else. Jeff&#8217;s presentation makes that perfectly clear. All my talking about Scrum isn&#8217;t going to amount to anything in the long run, because neither developers nor Scrum Masters control anyone's fates at work. Owner is the only position with real power.</p><p>And for most owners<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, worker autonomy is not on the road-map today or next week or ever, it never was. Scrum isn&#8217;t the enemy, low trust work environments are. Owner&#8217;s don't care if you bad mouth the process. Why should they? They hold all the cards. They have all the leverage. And even if Scrum goes away, Extreme Agile is close on its heels, or something even worse.</p><p>So, I&#8217;m ready to stop wasting time arguing about Scrum and start talking about things that can actually move the needle--ways to take power back. I want to start talking about freelancing and/or starting your own business<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. That's the only way things will ever change. </p><p>Programmers have options, believe it or not. I know the market is tough right now. But AI is changing the game. It can make developers into productivity machines, making freelance work easier and more lucrative. I want to leverage AI for myself, not for my employer--certainly not in some scheme to make development even more frantic like "Extreme Agile."</p><p>For starting a small business, recent developments in AI are a stroke of incredible luck. They promise to make it even simpler to replace the business side of things and go it alone. Need an invoice? Ask AI. Need help with marketing materials? Ask AI. And I'm convinced it's only going to get better.</p><p>And since I'm in the same boat you are, grinding it out 9-5 for someone else, I want to practice what I preach and start dipping my toes into the freelancing water myself. I'm curious about sites like <a href="https://www.upwork.com/">Upwork</a> or <a href="https://www.fiverr.com/">fiverr</a>. I've even seen <a href="https://www.dataannotation.tech/">some places</a> that are paying programmers to produce example code that is later fed to AI models. I'm going to try it all (on the side, so be patient. I've still got a day job) and see if it's worthwhile. Then I'll write about what I discover--about how to use AI or anything else that makes it easier.</p><p>AI doesn't have to be an instrument of more corporate pressure; it can be our ticket out of this mess.</p><p>If freelance websites aren't a good option, then I'll move on to more traditional networking tactics and write about those as well. Whatever I&#8217;ve gotta do.</p><p>The purpose of targeting freelancing gigs first is to gain a little elbow room. Side work gives you extra savings and, when you go full-time, extra freedom over your schedule. For some, maybe full-time freelance work will be the ultimate goal; that&#8217;s totally cool. For me, it&#8217;s a step closer to starting a business and selling my own products--a way to bootstrap myself. Maybe that's interesting to you too.</p><p>By documenting my process (I'm going to try this in real-time, instead of after the fact, because I think it will be more informative that way. (I hope I don&#8217;t fail; that would be embarrassing)), Rethinking Software can become more than just a place to talk about writing software, but also a resource for any developer struggling to slip the 9-5 handcuffs&#8212;a good place for actionable information and helpful conversations. As I gain insight, I&#8217;ll post more notes and articles, so it can enlighten your path as well.</p><p>Let&#8217;s stop waiting for change and start building it ourselves. </p><p>Operation Liberate Programmer</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><a href="https://jvsmanagement.com/is-agile-dead-ai-extreme-agile/">https://jvsmanagement.com/is-agile-dead-ai-extreme-agile/</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>I say most, not all, because there are companies out there genuinely doing the right thing, sharing ownership and authority with employees. See the bucket list published by the Corporate Rebels to see who they are. Sadly, however, they are rare enough to not be a viable escape route for most people.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Occasionally someone will mention that developers should form unions. This might also work. I usually don't focus on that though, because there is something more exciting about taking things into my own hands and beating the competition at their own game, in the free market. Forming unions always sounds like such an intense struggle that I'd rather use that energy to build my own thing. But I respect anyone willing to go that route.</p></div></div>]]></content:encoded></item><item><title><![CDATA[I Was Wrong About Scrum, Again]]></title><description><![CDATA[So, I was reading the Scrum Guide the other day, since that&#8217;s the kind of guy I am.]]></description><link>https://rethinkingsoftware.substack.com/p/i-was-wrong-about-scrum-again</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/i-was-wrong-about-scrum-again</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sat, 30 Nov 2024 23:26:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ldi0!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ae0c8b-f638-4b7a-ad47-78db276aa38e_285x285.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So, I was reading the Scrum Guide the other day, since that&#8217;s the kind of guy I am. I am always on the lookout for something that I can quote, that a Scrum guru can&#8217;t explain away with magical logic. I haven&#8217;t found anything yet, but I haven&#8217;t given up.</p><p>First, I pointed out that sprints are problematic because they always repeat back-to-back. They don&#8217;t give you a break, and they stress people out. But Scrum advocates were quick to point me to the concept of &#8220;sustainable pace.&#8221; I guess if I understood that, I could do sprints forever, without a break, and never get tired. Sounds amazing. But I was left wondering why the obvious solution wasn&#8217;t acceptable: just taking breaks. Oh well. They know better than me.</p><p>Next, I pointed out that daily stand-ups are difficult because they make you feel like you have to justify your work <em>every day</em>, even when you happen to not make any progress. But my Scrum friends reminded me that stand-ups were never supposed to be status reports. They said that an evil elf named Yesterday-today-no-blockers McIntyre spread that lie around the industry long ago, and people have been confused ever since. I guess Mr. McIntyre was pretty influential because he seems to have gotten to every Scrum Master I&#8217;ve ever met. I wonder why he is still invited to all the Scrum conferences?</p><p>Then I told them that software estimation is problematic. No matter how hard I try, I can&#8217;t seem to figure out how long a task is going to take until I&#8217;ve gotten my hands dirty and written at least a little bit of code. But the Scrum gurus just scoffed. Scrum doesn&#8217;t do estimation; it does sizing, and you should never use time when you are doing sizing. I had no idea there was a difference! When you do sizing, you pick a barnyard animal that best describes the way you feel about your task (I always pick an ass). Then you put all those animals into the magical Jira machine and turn the crank&#8212;out pops burn-up, burn-down, (burn-it-all-down?) charts. No estimation needed. So, I was wrong again. They&#8217;ve got it all figured out.</p><p>Finally, I mentioned the issues I&#8217;ve had with giving Product Owners full control of the work. I explained that it doesn&#8217;t give developers a seat at the table or treat them like equal stakeholders. They just end up being ticket-takers. It also makes it hard to get approval for any work that doesn&#8217;t look like progress to the non-technical Product Owner: planning, refactoring, researching, training, etc. But they got me again. I am so stupid! They reminded me that no Product Owner would ever be so shortsighted. In general, Product Owners are like Santa Claus and think of developers as the children they watch over all year long. They have no other interests in mind. And if ever there was a bad egg Product Owner, the organization would fire them immediately. Because the last thing any organization would want is for developer needs to be ignored (that is why they picked Scrum in the first place! Duh!).</p><p>So, they assured me that all developers are in perfectly good hands. That&#8217;s why it&#8217;s <em>totally OK </em>for the Scrum Guide to give them unilateral, unchecked power over creating and prioritizing all the engineering work.</p><p>It turns out that my worry about Product Owners not being technical is not a big deal either. I was assured that everything <em>anyone</em> needs to know about building software is covered very thoroughly in the three-day Scrum certification training that Scrum Masters and Product Owners attend. Thank goodness.</p><p>Here, I thought I had found the four core elements of Scrum, straight from the Scrum Guide&#8212;the official document from Scrum.org&#8212;that were causing problems in the software teams I have been a part of. I thought there wasn&#8217;t any way someone could say, &#8220;you&#8217;re doing it wrong.&#8221; But, yet again, I ended up with egg on my face. Because, of course, yet again, I am doing it wrong. No matter how many times I read that guide, I just can&#8217;t seem to get its pure meaning through my thick developer skull.</p><p>But for those of you that have had the same &#8220;pretend&#8221; problems with Scrum as me, issues that you could have sworn were making life hard&#8212;even though it is just because you haven&#8217;t been able to fully internalize the glorious revelations of Sutherland and Schwaber yet&#8212;here are four articles that can help you fix the already perfect process your boss and Scrum Master are calling Scrum, that isn&#8217;t even close to the beautiful, pure, real Scrum that no one has actually managed to implement yet.</p><ol><li><p><a href="https://rethinkingsoftware.substack.com/p/why-scrum-is-stressing-you-out">Sprints constantly repeat, with fixed lengths and no breaks.</a></p></li><li><p><a href="https://rethinkingsoftware.substack.com/p/the-daily-scrum">Stand-ups are everyday.</a></p></li><li><p><a href="https://rethinkingsoftware.substack.com/p/how-to-measure-progress-in-a-software">Scrum depends on estimates (a.k.a. sizing).</a></p></li><li><p><a href="https://rethinkingsoftware.substack.com/p/scrums-product-owner-problem">The product owner has full control over the product backlog.</a></p></li></ol><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Definition of Dumb]]></title><description><![CDATA[Scrum's Definition of Done (DoD) is a convenient way for Scrum advocates to punt on resolving any real issues with their process.]]></description><link>https://rethinkingsoftware.substack.com/p/definition-of-dumb</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/definition-of-dumb</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Sat, 30 Nov 2024 00:14:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oZVw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg" 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_!oZVw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oZVw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oZVw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oZVw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oZVw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oZVw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg" width="1280" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:345453,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oZVw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oZVw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oZVw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oZVw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5cf27b74-9bdb-426c-8449-1e7050dc5b25_1280x960.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 aria-hidden="true" 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><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">Image by <a href="https://pixabay.com/users/davidcardinez-10567503/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3801013">David Cardinez</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3801013">Pixabay</a></figcaption></figure></div><p>Scrum's Definition of Done (DoD) is a convenient way for Scrum advocates to punt on resolving any <em>real</em> issues with their process.</p><p>If anyone complains that Scrum produces poor results, they have their ready response: The DoD should prevent this; if the work doesn't fit the DoD, it should be rejected; developers are simply not following the process.</p><p>Despite the inefficiencies and frustrations Scrum piles on developers, poor results are "impossible." Why? Because the Scrum Master has defined them away&#8212;binding programmers to their unholy oath of compliance.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>In their world, poor results don&#8217;t exist.</p><p>They can&#8217;t exist. The DoD forbids it.</p><p>These are not the droids you&#8217;re looking for.</p><p>The Scrum Guide defines the Definition of Done as a shared understanding of what it means for a product increment to be complete&#8212;a quality standard ensuring all increments are potentially shippable or releasable. In other words, &#8220;nothing ships unless it&#8217;s perfect.&#8221; Easier said than done.</p><p>Here are some common items for a DoD:</p><ul><li><p>tested</p></li><li><p>documented</p></li><li><p>reviewed</p></li><li><p>no bugs</p></li></ul><p>Good ideas, but unless your process builds them into daily workflows&#8212;through TDD, pair programming, or literate programming&#8212;they&#8217;re just bolt-ons, band-aids to stop the bleeding.</p><p>This thinking leads to an ever-growing checklist of ways to reject work: pre-authorizations, design approvals, 100% test coverage, team-wide code reviews, and tedious manual testing phases straight out of the Waterfall era.</p><p>An ever-growing bureaucracy. Pure quality theater.</p><p>To their credit, they named the DoD well. That&#8217;s exactly what it is: a definition&#8212;not a solution, not a root cause analysis&#8212;just a description of what quality software should look like. Once it's drafted, the team is expected&#8212;by decree&#8212;to produce only quality output. Nothing else is acceptable. Take what Scrum gave you before, don't change anything about the process, but now get different, higher-quality results. It's closer to the definition of insanity.</p><p>It&#8217;s a lot like running an apple orchard and claiming your process only produces flawless fruit: no bruises, perfect color, uniform sweetness. But the truth? The orchard just tosses every imperfect apple in the dumpster before they reach the market. Perfect apples at the market say nothing about the process. For all you know, they&#8217;re wildly inconsistent at growing good fruit&#8212;throwing away nine (or ninety-nine) apples for every one they keep.</p><p>What's worse is that corporations that run Scrum do not modify delivery expectations to account for process inefficiency, because they don't believe they exist. They shut their eyes to it. Yet they still demand a hundred apples a day. "Come on, what's so hard about picking a hundred apples a day?" What they don't see, however, (what they don't want to see) are the nine hundred apples that go into the dumpster in the back, while their workers hunt for a hundred apples that meet their criteria.</p><p>This way, developers end up doing the extra legwork themselves, if they want to get a reasonable product out of the frustratingly difficult practices of Scrum. Maybe you've heard this before? "If you can't meet your sprint commitments, you're expected to do nights and weekends."</p><p>That&#8217;s why I call the Definition of Done a punt&#8212;a way to dodge fixing real process deficiencies. It shifts all the responsibility for inefficiency to developers and hands them all the blame as well. Because, anyone who questions the system must be a malcontent that doesn&#8217;t do Scrum correctly&#8212;not someone with valid concerns.</p><p>Sooner or later, frustration and exhaustion take their toll. Companies end up with sprints yielding only a couple hundred apples total to choose from. So, definition or no definition, they&#8217;re stuck with whatever the system produces&#8212;even if only a few features can be considered &#8220;good&#8221; at all. Developers face a Sophie&#8217;s Choice: deliver subpar features or nothing at all.</p><p>This is the point when turnover ramps up, fingers start pointing, and scapegoats are born. Wise companies will eventually fire the management responsible for running productivity into the ground, but usually not until a lot of well-meaning developers go down in flames&#8212;and long after anyone good has headed for the hills.</p><p>It's a sad story I have lived through many times. But the solution is not hard. Ditch the rigid Scrum regimes still ruling the industry and hand control of the engineering process back to the engineers. And I'm not talking about giving control to engineering managers who toe the company line and are just as invested in Scrum as the business. Give control to the engineering team--the developers writing the code--the ones opening up their IDEs, typing in the code, and hitting compile. </p><p>Let them organize themselves. They&#8217;re the ones who know how to craft the right process for their work&#8212;one that naturally delivers better results. Do that, and the Definition of Done won&#8217;t matter anymore. The system will simply produce high-quality fruit on its own.</p><p>#endscrumin2025</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>The way this plays out is subtler in practice. The Scrum Master often frames the Definition of Done as the developers' own idea. They sit the team down and ask reasonable questions like, &#8220;What steps can we take to ensure high quality?&#8221; Once the answers are written down, they become the club used to beat you over the head.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Worker Autonomy: A Natural Law of Labor]]></title><description><![CDATA[Philosophically, I hold the view that no developer&#8212;or any worker, for that matter&#8212;should be forced or coerced.]]></description><link>https://rethinkingsoftware.substack.com/p/worker-autonomy-a-natural-law-of</link><guid isPermaLink="false">https://rethinkingsoftware.substack.com/p/worker-autonomy-a-natural-law-of</guid><dc:creator><![CDATA[Adam Ard]]></dc:creator><pubDate>Tue, 26 Nov 2024 02:48:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HHf5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp" 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_!HHf5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HHf5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!HHf5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!HHf5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!HHf5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HHf5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184004,&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;: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_!HHf5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!HHf5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!HHf5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!HHf5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25131e2d-2563-494b-bfde-d8b89fcdb227_1024x1024.webp 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 aria-hidden="true" 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><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>Philosophically, I hold the view that no developer&#8212;or any worker, for that matter&#8212;should be forced or coerced. Autonomy isn&#8217;t just vital for professionalism&#8212;it&#8217;s the cornerstone of workers&#8217; dignity and humanity.</p><p>This is not just a moral argument; it&#8217;s a natural law argument&#8212;a belief in fundamental, self-evident rights tied to human nature. By nature, workers must have control over their own actions, because they are the ones performing them. It&#8217;s the worker&#8217;s hand that pounds the nail, types the code, or operates the machinery. It is most natural that they choose <em>how</em> to work. In fact, they can only lose this control through coercion&#8212;most often through the fear of being fired. </p><h3><strong>The Logical Limits of Authority</strong></h3><p>Some argue that corporate owners hold absolute authority, but logic shows their power must have limits. What if an owner demands the unreasonable&#8212;such as working 24-hour days&#8212;or insists on unsafe or unreasonable conditions? Clearly, the worker can refuse. In these extremes, worker autonomy is self-evident. But this same autonomy applies much more broadly.</p><p>Natural law dictates that all worker action must be voluntary&#8212;just as collaboration is voluntary in other relationships, like those between spouses, church volunteers, or friends.</p><p>The line between acceptable and unacceptable requests lies between compulsion and persuasion. Workers are under no inherent obligation to comply with any request; they are free to choose based on mutual benefit, not fear of reprisal.</p><h3><strong>Workers Are Not Property</strong></h3><p>The corporate notion that an owner&#8217;s will always takes precedence over that of the worker&#8217;s is fundamentally unnatural. While owners may have legal rights over company property, workers are not property. They are collaborators. As such, their compliance should be earned through persuasion and mutual benefit, not fear of being fired.</p><p>When workers defer unquestioningly to their superiors, they give up their natural rights. John Locke, in his <em>Second Treatise</em>, argues:</p><blockquote><p>The Labour of his Body, and the Work of his Hands, we may say, are properly his. Whatsoever then he removes out of the State that Nature hath provided, and left it in, he hath mixed his Labour with, and joyned to it something that is his own, and thereby makes it his Property. <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p></blockquote><p>When workers mix their labor with a corporation&#8217;s resources, they naturally gain a stake in both the process and its outcomes&#8212;just as Locke describes. Too many corporations are accustomed to ignoring this natural ownership, ruling with an iron fist and taking all the proceeds. This is unnatural.</p><h3><strong>What It Looks Like in Practice</strong></h3><p>In software development&#8212;my area of expertise&#8212;unrealistic deadlines demonstrate this conflict clearly. Deadlines that lead to burnout or encourage poor workmanship are not mutually beneficial. Developers benefit most from working at a reasonable pace, where they can practice craftsmanship and cultivate mastery.</p><p>Developers must push back to safeguard their well-being and ensure quality work. If management can&#8217;t align their work expectations with reasonable working conditions, the relationship lacks mutual benefit, and developers should feel empowered to refuse.</p><p>Further, programmers must have autonomy over the labor of their hands and minds. They should have the authority to compose their work as they see fit, developing personal skills and competencies along the way. Workers should be judged on their outcomes, not micromanaged on their methods.</p><p>When management utilizes pseudo-productivity metrics, like task completion rates, they prioritize owner benefit at the expense of workers&#8217; personal mastery and aspirations. This dynamic is not mutually beneficial&#8212;it&#8217;s exploitative.</p><h3><strong>Economic Dependence Worsens Coercion</strong></h3><p>The most insidious enabler of coercion in the workplace is economic dependence. Many workers live paycheck to paycheck, making the threat of being fired deeply coercive. Debt and reliance on steady income shackle workers, turning them into wage slaves under the illusion of choice. While not compelled by law to serve their employers, they are bound just as forcefully by economic necessity.</p><p>The suggestion that workers can simply "quit" if mistreated is naive. Economic dependence gives too much power to corporations.  The resulting dynamic effectively creates an aristocratic class of capitalist owners who wield disproportionate power over workers.</p><h3><strong>Restoring Balance</strong></h3><p>To restore balance, we must reduce dependence on paycheck-to-paycheck living and adopt healthier workplace governance models. By empowering workers with autonomy and choice, we can reshape workplaces into spaces of mutual benefit, not coercion.</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><a href="https://press-pubs.uchicago.edu/founders/documents/v1ch16s3.html">https://press-pubs.uchicago.edu/founders/documents/v1ch16s3.html</a></p><p></p></div></div>]]></content:encoded></item></channel></rss>