<?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[Quantum Steps]]></title><description><![CDATA[Optimise developer productivity and judgement through small yet impactful steps. Essays from experience and research straight to your inbox.]]></description><link>https://read.ceilfors.com</link><image><url>https://substackcdn.com/image/fetch/$s_!J-xm!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png</url><title>Quantum Steps</title><link>https://read.ceilfors.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 05 Apr 2026 00:10:38 GMT</lastBuildDate><atom:link href="https://read.ceilfors.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Wisen Tanasa]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[quantumsteps@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[quantumsteps@substack.com]]></itunes:email><itunes:name><![CDATA[Wisen Tanasa]]></itunes:name></itunes:owner><itunes:author><![CDATA[Wisen Tanasa]]></itunes:author><googleplay:owner><![CDATA[quantumsteps@substack.com]]></googleplay:owner><googleplay:email><![CDATA[quantumsteps@substack.com]]></googleplay:email><googleplay:author><![CDATA[Wisen Tanasa]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Building AI-Native Teams #3: From Black Box to Boxes-And-Arrows]]></title><description><![CDATA[A learning hour to help engineers build intuition for LLMs, chatbots, and agents]]></description><link>https://read.ceilfors.com/p/ai-native-teams-3-unpacking-black-box-learning-hour</link><guid isPermaLink="false">https://read.ceilfors.com/p/ai-native-teams-3-unpacking-black-box-learning-hour</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Mon, 09 Mar 2026 15:03:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hbzZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Welcome to the latest issue of <a href="https://read.ceilfors.com/t/ai-enabled-teams">my newsletter series</a>, &#8216;AI-Enabled Teams&#8217;, where I&#8217;ll cover the journey of AI adoption inside an engineering team. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/ai-enabled-teams-1-kicking-off-the">introduction post</a>.</em></p><div><hr></div><p>Frustration is a common reaction among engineers new to AI. Why is AI not telling me the truth? Why did AI lead me down the wrong path? Engineers need to build a good intuition about AI for successful adoption, and we could achieve a better intuition by unpacking the magical black box of AI.</p><p>Building this intuition is important as the non-deterministic nature of AI often makes engineers operate, in Cynefin terms, in a Complex domain, where the cause and effect relationship is only partly visible. With better intuition, we understand better what we can and can not do against AI. A better intuition makes part of the work sit in the Complicated domain, where teams could analyse patterns and make improvements to their approach to AI.</p><p>A better intuition of how to use a technology effectively can be done by peeling the technology&#8217;s abstraction one level deeper. When my daughter got frustrated because the TV remote did not put the volume up, we went one abstraction level deeper. Understanding that the remote control blasts infrared light that needs to be received by the TV, built her intuition. She needs to point the remote at the TV's infrared receiver.</p><p>A similar idea can be applied to understanding AI chatbots and agents, too. Just like the TV remote control, we don&#8217;t have to go too deep into what infrared is. Even though the topics of attention and transformers are interesting, you don&#8217;t have to go that deep to build the initial intuition.</p><p>What follows is a blend of the learning hour I&#8217;ve designed, my thought process, and the result of the learning hour (Hat tip to <a href="https://blog.thepete.net/about/">Pete Hodgson</a>, who has greatly influenced the content of the workshop.)</p><h2>LLM inputs and outputs</h2><p>We kick-start the learning hour by focusing on LLM. Simple boxes and arrows are engineers&#8217; favourite tools to understand abstractions. Let&#8217;s use that. I deliberately exclude coding agents or AI chatbots from this initial picture.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wmKF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wmKF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 424w, https://substackcdn.com/image/fetch/$s_!wmKF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 848w, https://substackcdn.com/image/fetch/$s_!wmKF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 1272w, https://substackcdn.com/image/fetch/$s_!wmKF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wmKF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png" width="511" height="319.9081803005008" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:750,&quot;width&quot;:1198,&quot;resizeWidth&quot;:511,&quot;bytes&quot;:275759,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.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_!wmKF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 424w, https://substackcdn.com/image/fetch/$s_!wmKF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 848w, https://substackcdn.com/image/fetch/$s_!wmKF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 1272w, https://substackcdn.com/image/fetch/$s_!wmKF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661523eb-c7b1-4452-8a44-289f81fa6e71_1198x750.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This idea is an oversimplification at best, but one thing I emphasise over and over again throughout the learning hour is the idea that there are only two inputs to LLM to produce output (next tokens). Arguably, the training data could be framed as a database, but it doesn&#8217;t really matter at this point. I thought this oversimplification was necessary to build the foundational understanding of LLM.</p><p>Like any technology, we learn best when we can play around with it and observe the input and output in real time. This has proven to be difficult, as many AI tools out there have built a thick harness around LLM. Luckily, I found this <a href="https://alonsosilva-nexttokenprediction.hf.space/">fully hosted GPT-2 app</a> that I could use for the demo. I got an ooh and an aah at this point. Something clicked in people&#8217;s heads.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q-lu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q-lu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 424w, https://substackcdn.com/image/fetch/$s_!q-lu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 848w, https://substackcdn.com/image/fetch/$s_!q-lu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 1272w, https://substackcdn.com/image/fetch/$s_!q-lu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q-lu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png" width="502" height="494.2877094972067" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1410,&quot;width&quot;:1432,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:225517,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.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_!q-lu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 424w, https://substackcdn.com/image/fetch/$s_!q-lu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 848w, https://substackcdn.com/image/fetch/$s_!q-lu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.png 1272w, https://substackcdn.com/image/fetch/$s_!q-lu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff186a56f-1d0f-4c30-8376-546ef73672fd_1432x1410.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>&#8220;But AI chatbots don&#8217;t seem to respond to me with next tokens&#8221;</h2><p>We understand now that a language model's job is to produce the next tokens. However, it does not explain how AI chatbots work. Clearly, these chat assistants are responding to us conversationally. They&#8217;re not completing our sentences like what&#8217;s been demonstrated so far.</p><p>Think about it for a second. Imagine that you&#8217;re sending a prompt to an AI chatbot, &#8220;What&#8217;s the capital of&#8221;, the chatbot wouldn&#8217;t complete your sentence. It might even ask a question back to you instead and make an attempt to have a conversation.</p><p>Here, I asked the team to spend 5 minutes hypothesising how an AI chatbot might work, hoping for them to build a stronger learning connection. Unfortunately, I didn&#8217;t get any good answers as my questions were poorly written.</p><p>The magic here lies in some invincible texts that got injected into the input sent to the LLM by the chatbot. Our user prompts are modified by the chatbot to influence the response returned by LLM.</p><p>I used the same hosted LLM to demonstrate this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QUEo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QUEo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 424w, https://substackcdn.com/image/fetch/$s_!QUEo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 848w, https://substackcdn.com/image/fetch/$s_!QUEo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 1272w, https://substackcdn.com/image/fetch/$s_!QUEo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QUEo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png" width="1456" height="610" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:610,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:380640,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.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_!QUEo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 424w, https://substackcdn.com/image/fetch/$s_!QUEo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 848w, https://substackcdn.com/image/fetch/$s_!QUEo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 1272w, https://substackcdn.com/image/fetch/$s_!QUEo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22040edb-aba0-4d1d-863e-b4a532405e52_1818x762.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Left: Unmodified user prompt. Right: Prompt modified to roleplay.</figcaption></figure></div><p>Notice how, in this LLM, getting the LLM to role-play produces better prediction. (Do note that in reality, role-playing is only one trick the harness does. There&#8217;s much more to it.)</p><p>So, back to the original question, why is an AI chatbot not telling me the truth? Why is it hallucinating? In this LLM example, even with the role-playing trick, it would have told me that the capital of France is France!</p><p>By this point, hopefully, the team would have built enough intuition to answer this question. And the next time they send their prompt, they could visualise what&#8217;s going on behind the scenes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QW49!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QW49!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 424w, https://substackcdn.com/image/fetch/$s_!QW49!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 848w, https://substackcdn.com/image/fetch/$s_!QW49!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 1272w, https://substackcdn.com/image/fetch/$s_!QW49!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QW49!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png" width="493" height="285.97508896797154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:1124,&quot;resizeWidth&quot;:493,&quot;bytes&quot;:170473,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.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_!QW49!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 424w, https://substackcdn.com/image/fetch/$s_!QW49!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 848w, https://substackcdn.com/image/fetch/$s_!QW49!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 1272w, https://substackcdn.com/image/fetch/$s_!QW49!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec5f5b9c-9d41-4ba5-914c-e17e5cdaa705_1124x652.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The answers given by the team</figcaption></figure></div><h2>What about agents?</h2><p>Given that the team has been hyped-driven, uses a plethora of coding agents already, I thought it was worth unpeeling the abstraction further for agents. We started by reading the definition of agents by Anthropic&#8217;s Hannah Moran:</p><blockquote><p>Agents are models using tools in a loop</p></blockquote><p>All engineers would understand what a loop is, but what is a tool? How does the agent decide on what tool to call? Here again, we&#8217;re a bit stuck. Just like AI chatbots, the harnesses were quite thick, so activities are happening behind the scenes that we couldn&#8217;t really observe.</p><p>Thanks to Pete Hodgson, I discovered that I could observe the tool call in detail in Claude Workbench.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZtoH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZtoH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 424w, https://substackcdn.com/image/fetch/$s_!ZtoH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 848w, https://substackcdn.com/image/fetch/$s_!ZtoH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!ZtoH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZtoH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png" width="345" height="537.7423469387755" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1222,&quot;width&quot;:784,&quot;resizeWidth&quot;:345,&quot;bytes&quot;:298765,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.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_!ZtoH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 424w, https://substackcdn.com/image/fetch/$s_!ZtoH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 848w, https://substackcdn.com/image/fetch/$s_!ZtoH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!ZtoH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5754ea75-dc7d-4865-89f5-e20cb02150b3_784x1222.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Claude Workbench showing how LLM responds with a formatted instruction for the agent to make a tool call, rather than a conversational response.</figcaption></figure></div><p>And before we close, I reiterated the idea that the only LLM input we could control is the context, and the reason LLM understands this specific tool is that the detail has been injected into the context window.</p><p>This is the final boxes-and-arrows diagram.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hbzZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hbzZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 424w, https://substackcdn.com/image/fetch/$s_!hbzZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 848w, https://substackcdn.com/image/fetch/$s_!hbzZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 1272w, https://substackcdn.com/image/fetch/$s_!hbzZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hbzZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png" width="566" height="335.2891396332863" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:840,&quot;width&quot;:1418,&quot;resizeWidth&quot;:566,&quot;bytes&quot;:332987,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.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_!hbzZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 424w, https://substackcdn.com/image/fetch/$s_!hbzZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 848w, https://substackcdn.com/image/fetch/$s_!hbzZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.png 1272w, https://substackcdn.com/image/fetch/$s_!hbzZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff23328db-75f6-4b3c-bb45-b24ee62db36a_1418x840.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></p><h2>Closing</h2><p>We first closed this learning hour with a quiz, as I felt that the activities were fairly theoretical. I&#8217;m pretty pleased with the results.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_56y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_56y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 424w, https://substackcdn.com/image/fetch/$s_!_56y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 848w, https://substackcdn.com/image/fetch/$s_!_56y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 1272w, https://substackcdn.com/image/fetch/$s_!_56y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_56y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png" width="501" height="419.2834951456311" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:862,&quot;width&quot;:1030,&quot;resizeWidth&quot;:501,&quot;bytes&quot;:162661,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.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_!_56y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 424w, https://substackcdn.com/image/fetch/$s_!_56y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 848w, https://substackcdn.com/image/fetch/$s_!_56y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.png 1272w, https://substackcdn.com/image/fetch/$s_!_56y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72865fd9-54bb-4fda-9ab1-aae9c0e4cd51_1030x862.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>And with the quiz answered, we closed it with reflective questions. The answers made me pretty confident that we&#8217;re making good progress in this AI adoption journey.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VKgb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VKgb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 424w, https://substackcdn.com/image/fetch/$s_!VKgb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 848w, https://substackcdn.com/image/fetch/$s_!VKgb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!VKgb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VKgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png" width="508" height="391.11813186813185" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1121,&quot;width&quot;:1456,&quot;resizeWidth&quot;:508,&quot;bytes&quot;:435294,&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://read.ceilfors.com/i/189372976?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.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_!VKgb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 424w, https://substackcdn.com/image/fetch/$s_!VKgb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 848w, https://substackcdn.com/image/fetch/$s_!VKgb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.png 1272w, https://substackcdn.com/image/fetch/$s_!VKgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee67456e-35b9-4e3a-9e3d-b78a21858ee9_1896x1460.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>Speaking of good progress, next up, I&#8217;ll write about what I&#8217;ve decided to measure. Stay tuned.</p>]]></content:encoded></item><item><title><![CDATA[AI-Enabled Teams #2: Clarifying Our AI Stance]]></title><description><![CDATA[Creating constraints with shared direction and a paved road]]></description><link>https://read.ceilfors.com/p/ai-enabled-teams-2-clarifying-our-ai-stance</link><guid isPermaLink="false">https://read.ceilfors.com/p/ai-enabled-teams-2-clarifying-our-ai-stance</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Mon, 16 Feb 2026 14:07:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oC7K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Welcome to the latest issue of <a href="https://read.ceilfors.com/t/ai-enabled-teams">my newsletter series</a>, &#8216;AI-Enabled Teams&#8217;, where I&#8217;ll cover the journey of AI adoption inside an engineering team. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/ai-enabled-teams-1-kicking-off-the">introduction post</a>.</em></p><div><hr></div><p>Our AI half-hype-driven team is now at the beginning of our adoption, or rather, formalising our adoption. When I was asked to get this initiative going, I knew clarifying our AI stance should be our first step. This step was inspired by the DORA AI Capability Model, which is called &#8220;Clear and communicated AI stance,&#8221; which is pretty well described by the name.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Quantum Steps! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Having a clear stance helps reduce the ambiguity that our team members might have. Are we going to lose our jobs? Are we going to get replaced by machines? Would our current skills be irrelevant? It&#8217;s hard to tell if anyone in our remote-first team is anxious around these topics. However, it&#8217;s not hard to imagine people having such a prediction and developing their own fears.</p><p>We begin our journey through a 30-minute workshop.</p><h2><strong>Where are we heading?</strong></h2><p>We kicked off the workshop by having our Head of Product Engineering act as a sponsor to endorse our AI adoption initiative. Our sponsor mentioned that AI is here to stay, and let&#8217;s not fall behind. The goal that we set by this point is a directional one, and we did not declare where the finish line is, by intention.</p><p>As much as I dislike any top-to-bottom approach, a power dynamic exists in any organisation, and we have to attack this adoption from all possible angles. This three-minute endorsement served as an enabling constraint, as it gave an explicit permission for the team to adopt AI. We made it firm that we, as a company, will go through this together and learn new skills around AI if we have to, tightening our stance on AI.</p><h2><strong>Where are we?</strong></h2><p>While setting a goal could be aspirational, as a student of complexity, I thought it&#8217;s more important for us to understand where we are as an organisation. We are unlikely to get to where we want to be if we don&#8217;t recognise our current dispositional state. To surface signals about our current dispositions, I created three Likert-scale statements using a screenshot from the recent DORA report:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oC7K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oC7K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 424w, https://substackcdn.com/image/fetch/$s_!oC7K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 848w, https://substackcdn.com/image/fetch/$s_!oC7K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 1272w, https://substackcdn.com/image/fetch/$s_!oC7K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oC7K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png" width="1456" height="1105" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1105,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:957557,&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://read.ceilfors.com/i/187870531?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.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_!oC7K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 424w, https://substackcdn.com/image/fetch/$s_!oC7K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 848w, https://substackcdn.com/image/fetch/$s_!oC7K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 1272w, https://substackcdn.com/image/fetch/$s_!oC7K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f0a7621-3866-44f6-87f2-0c4bb3d926b1_1960x1488.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Statement on the left is: DORA State of AI-assisted Software Development 2025, page 3</figcaption></figure></div><p>As you can see from the result, thankfully, we have quite a good starting position as an organisation. We did not have strong disagreements around the statements presented.</p><p>I recall having a conversation with our sponsor where he suggested us having a strong transformation and training programme. Having encountered charlatan coaches in the past gave me a hard knee-jerk reaction. I promised him that we&#8217;re not as bad as he thinks we are, and this survey should reassure him.</p><h2><strong>How do we move forward?</strong></h2><p>It&#8217;s clear now that we&#8217;ll adopt AI, but some question marks remain. How do we adopt it safely?</p><p>There were worries about our use of multiple AI vendors and the impact of this practice on the business. A couple of us have been experimenting with various AI agent tools with the belief that it&#8217;s best to let engineers use the tools they like. We&#8217;re scrappy, and we disliked the idea of company-approved tools. These vendors are releasing new models every minute. We should always use the best one, should we not? There was an argument for consolidation for cost reduction (which I thought was a weak argument).</p><p>With this context in mind, I revealed the next set of Likert-scale statements in the workshop. To make the workshop more productive, I prepared the questions to be more concrete, articulating the worst and best outcomes of consolidation, expecting to spur some debate. I thought this was more productive than asking a generic, should we consolidate question.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZPaU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZPaU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 424w, https://substackcdn.com/image/fetch/$s_!ZPaU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 848w, https://substackcdn.com/image/fetch/$s_!ZPaU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!ZPaU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZPaU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png" width="502" height="769.810623556582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1328,&quot;width&quot;:866,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:673352,&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://read.ceilfors.com/i/187870531?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.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_!ZPaU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 424w, https://substackcdn.com/image/fetch/$s_!ZPaU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 848w, https://substackcdn.com/image/fetch/$s_!ZPaU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!ZPaU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ec9c3d3-c28e-47af-8163-93b411320185_866x1328.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>One of the most important outcomes of the debate was that our business does not have any special secret, patented source. We, as a business, are not too concerned about the use of LLM against our codebase.</p><p>We also discovered a new tension, which was revealed by the third Likert statement. Some of us still like model hopping and are attached to our tools. We did not resolve this tension in the workshop as we ran out of time. The good news was that I did not see strong disagreements.</p><h2><strong>Concluding the tension</strong></h2><p>Seven days after the workshop, after thinking and researching, I&#8217;ve decided to make a Request for Comments to resolve the tension.</p><p>Below is the original RFC I&#8217;d written for the team:</p><div><hr></div><p>We&#8217;re going to invest more in Claude Code as our coding agent (full Anthropic stack, agent, and LLM), so we can adopt it well as a team.</p><p><strong>What matters most: </strong>Brand trust and adoptability, Agent and model compatibility, One tool to share</p><p><strong>1. Brand trust and adoptability</strong></p><p>This one is subjective, but I personally trust the Anthropic brand more than OpenAI. They&#8217;ve positioned themselves around safety since day 1. I&#8217;m also cautious about any company whose business model is strongly tied to advertising. More importantly, regardless of vendor, I want us to be confident about <strong>clear enterprise/API data guarantees</strong>&#8212;especially around retention and whether our data is used for training. As we onboard more engineers, we&#8217;ll naturally have more opinions. In the industry, there are also strong feelings about leadership (Sam Altman) and company reputations, and that can affect adoption for tools we standardize on.</p><p><strong>2. Agent and model compatibility</strong></p><p>We learned today that context is king for influencing an LLM&#8217;s response. <em>(Editor note: We had just finished a LLM learning hour when I posted this RFC.) </em>Picking an agent that&#8217;s designed around the model should produce better results. Different models respond better to different conventions (e.g., structured tags vs. plain text), and they behave differently under the hood. Claude Code, for example, can inject system reminders into the <a href="https://blog.thepete.net/blog/2025/12/10/same-model-different-results-why-coding-agents-arent-interchangeable/">context window</a>, like:</p><pre><code>&lt;system-reminder&gt;

Note: [FILENAME] was modified, either by the user or by a linter. This change was intentional, so make sure to take it into account as you</code></pre><p>This is a similar trade-off to adopting hybrid cloud vs. going all-in on a single cloud provider: tighter integration can be a big advantage, but it comes with more coupling.</p><p><strong>3. One tool to share</strong></p><p>All of these tools inevitably have different configs and different ways to make usage safer. The community is usually behind on sharing consistent standards (think &#8220;skills&#8221; protocols, reusable workflows, etc.). It&#8217;s also easier to share concrete knowledge when we&#8217;re all using the same default tool, rather than translating ideas across multiple setups. I know many of us are trying different models. In my head we&#8217;re hitting <a href="https://en.wikipedia.org/wiki/Fredkin%27s_paradox">Fredkin&#8217;s Paradox</a>:</p><blockquote><p>The more equally attractive two alternatives seem, the harder it can be to choose between them&#8212;no matter that, to the same degree, the choice can only matter less.</p></blockquote><p>My hypothesis is we&#8217;ll get way more benefit by using one vendor really, really well as a team. I&#8217;m <strong>not</strong> saying we&#8217;re banning Cursor or other tools right now. You&#8217;re still free to explore. I&#8217;m saying: we&#8217;ll pave the default path toward Claude Code and its surrounding tooling so the team can align and compound improvements.</p><div><hr></div><p>I had good feedback from the RFC. Our sponsor, who had a strong desire to consolidate, approved it, which is great news.</p><p>The idea of forced consolidation was one of the biggest worries I had. A paved road would form a permeable constraint, not a rigid one. In a complex system such as ours, a rigid constraint might not be the best one, as it may create shadow IT and resistance.</p><p>We also had an engineer who was worried about our Cursor subscription being stopped, to which I responded, that&#8217;s not what&#8217;s happening.</p><p>In making this decision, I mostly thought about our junior members whose progress might stifle with the idea of multi-tool-multi-model chaos. I know that the cool kids have moved on to gastown and codex, and I have a burning desire to try them out, too, but it wouldn&#8217;t have been the right call. We have to get everyone on the journey together.</p><p>If we get this right, this decision should kick off a flywheel of deeper learning in the teams, sharing tips or tricks for Claude Code, rather than sharing hypes.</p><p><strong>Closing: </strong>This concludes our first step of clarifying our AI stance, turning the adoption from a set of hype-driven experimentation into the start of building an organisational capability.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI-Enabled Teams #1: Kicking Off the Series]]></title><description><![CDATA[Notes from the journey of adopting AI inside an engineering team]]></description><link>https://read.ceilfors.com/p/ai-enabled-teams-1-kicking-off-the</link><guid isPermaLink="false">https://read.ceilfors.com/p/ai-enabled-teams-1-kicking-off-the</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Mon, 09 Feb 2026 14:17:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J-xm!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey readers. I can&#8217;t believe I haven&#8217;t written for more than one and a half years. Life, work, parenting, and sports have all been too consuming. I&#8217;ve been thinking about writing, about something, about anything, for a long time, and finally there&#8217;s a strong enough gravity to pull me back.</p><p>As I&#8217;ve been writing documents productively at work through voice-to-text and LLMs (or rather, productively generating tokens), I realise my thoughts are not as clear as they used to be. When my mentees asked for advice, I found it harder to articulate and form my thoughts live. This realisation is immense. I&#8217;m now jotting each and every letter on my keyboard again for this post to force myself to think about each of the tokens I&#8217;m about to generate from my mind.</p><h2>Why this series now?</h2><p>Regaining mental clarity works as the inner force, but the external forces for me to write about this series are even greater. As the industry is moving fast, the force for business leaders to increase the team&#8217;s throughput through AI adoption is strong, and I&#8217;ve been asked to help with that.</p><p>As I go through the journey, I struggle to find content that I find relevant. A lot of the contents are pretty focused on greenfield projects, prototypes, and new LLM models and features. I&#8217;ll write about what I can&#8217;t easily find, i.e. work experiences and challenges which are grounded in reality.</p><p>Is there a value in capturing experiences? I&#8217;ve managed to develop injuries on my forearm through ashtanga yoga and badminton. Thanks to a random stranger sharing their experience on Reddit, suggesting me to try Tyler&#8217;s Twist exercise, I do feel better now. Before I discovered that post. Feeling irritated that I can&#8217;t hold Tolasana and swing my racket without pain, I asked ChatGPT to do deep research, dig up all the bloody anti-fragile science papers it could, and give me the one single thing I should do. No, none of them helped, and yes, I suffer from an episodic scientism now and then.</p><p>That Reddit post was about tennis elbow, and even though I do not actually have tennis elbow, the exercise is helping me. That lack of causal relationship is the nature of a complex system, which would also be present in a team setting. A failed experiment in one team could be a successful one in another.</p><h2>The team&#8217;s context</h2><p>As I write the future posts in this series, understanding the context that I&#8217;m operating in is important.</p><p>Our codebase is about 2.5 years old, accumulated tech debts through constant change of business priorities. We work in the telecom industry. We&#8217;re delivering sustainably, deploying every day.</p><p>We are a company of nine engineers, organised into three small outcome-focused teams. We&#8217;ve got a good spectrum of juniors and senior+ engineers in the team. We are a remote team, with engineers in the US, the UK, and India.</p><p>All of us are in a different phase of AI adoption. Some are a bit more conservative than others. Some are a bit more hype-driven, pushing for multiple agents and switching models as frequently as they can. Some would think that we&#8217;ll lose our jobs in 6 months or that junior engineers would cease to exist. I probably write 95% of my code through agents, and some are still at 0% as they&#8217;re still using AI chat assistants.</p><p>A few of us have been in an indefinite state of experimentation, trying things out for about a year, while some are lagging.</p><p>A few of us have used agents, then started to move back to coding by hand.</p><p>I&#8217;ve reviewed LLM written PRs that have not been reviewed by the authors.</p><p>A beautiful mess.</p><h2>Defining the series</h2><p>I hope that the term &#8220;AI-enabled teams&#8221; is self-descriptive.</p><p>I originally liked the term AI-assisted engineering, as it&#8217;s also used by DORA when they published their AI-assisted software development report last year. However, as I&#8217;ve been adopting agents more, I don&#8217;t think the word &#8216;assist&#8217; is fully capturing the evolution of where we are now.</p><p>Some used the term Agentic Coding, but this sounds like a specific activity within the umbrella of software engineering. The industry is moving so fast that agents might become obsolete.</p><p>AI-native is an interesting term for me, and many are using it. It sounds bold, as it implies that there exist brand new engineering practices could not live without AI. The heuristic being, if you subtract AI from your system now, would it still operate? I found this hard to believe. I believe that all the evergreen engineering practices like TDD and Continuous Delivery will hold regardless of AI, if not becoming more important.</p><p>I still don&#8217;t like the word AI-enabled, but it&#8217;s the least worst option I have.</p><p>Teams implies the idea that we have a shared codebase where multiple engineers are working on it together. It&#8217;s my belief that this idea would not go away anytime soon. I believe that if you want to build something great, you&#8217;ll need to put multiple minds on it.</p><p>While there is a lot of excitement around what the tool could do, software development is still software development, and we have to deal with all the anthro-complexity around it.</p><p>It did come across my mind, why not let each of the engineer in our team build their own microservices in their own repo, agenting away? Let&#8217;s not get there for the time being.</p><h2>What to expect in the series</h2><p>The posts would be a mixture of essays, our progress, and some dojos or learning hours that I have organised for the team and some commentaries around that.</p><p>This is not a series where I&#8217;ll help you replicate our AI adoption journey, in fact, I don&#8217;t even know what our outcome would be. My intention is to share our effort and results in the hope that you could help your team, too.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[How to become a Production Blocker in a CI Theatre]]></title><description><![CDATA[A ladder from Junior Production Blocker to Principal Production Blocker]]></description><link>https://read.ceilfors.com/p/how-to-become-a-production-blocker</link><guid isPermaLink="false">https://read.ceilfors.com/p/how-to-become-a-production-blocker</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Mon, 08 Jul 2024 09:00:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I expelled a big sigh. I&#8217;ve been asked to review a pull request, and it&#8217;s large&#8212;over 2000 lines of code added, representing more than a week&#8217;s worth of work. Gathering my willpower, I opened it up but quickly felt overwhelmed. Maybe I&#8217;ll try again in an hour, or perhaps tomorrow.</p><p>Is the delay in reviews always about the size of the pull requests? Maybe, maybe not. Just the other day, a colleague cried, &#8220;I submitted a small pull request, and it still takes 3 days to be reviewed!&#8221; Meanwhile, the work in progress started piling up.</p><p>These are frustrating experiences. We know what good practices should look like&#8212;Continuous Integration (CI). One key aspect of CI is that engineers should commit to the mainline at least daily. Delays in reviews, like the examples above, are counterexamples of CI.</p><p>While describing what good looks like is important, it&#8217;s equally crucial to define what we should avoid. We have a term for the CI counterexamples: <a href="https://www.thoughtworks.com/radar/techniques/ci-theatre">CI theatre</a>, where a team assumes they&#8217;re practising CI just because they have set up a CI server, ignoring the frequency of commits to mainline.</p><p>I think the term CI theatre is insufficient for us to shift our behaviours, as it doesn&#8217;t describe the issues caused by such behaviours. When engineers submit large pull requests or delay reviews, they often don&#8217;t realise the impact. They&#8217;re blocking production. Value to customers is blocked. I want to have a clearer way to describe this, especially on the individual level.</p><p>I suggest the term Production Blocker, an individual who plays well in a CI theatre.</p><p>When I procrastinate on reviewing large pull requests, I ask myself, &#8220;Do I want to be a Production Blocker? No, let&#8217;s review it.&#8221;</p><p><em>This idea shouldn&#8217;t be used to point fingers but used as a personal anti-goal instead. </em>Anti-goals are a powerful concept that applies the idea of inversion to goal setting. I&#8217;ve seen this idea being used by Jack Dorsey with his &#8216;won&#8217;t do list&#8217;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. My colleague recently shared TypeScript Design&#8217;s &#8216;Non-Goals&#8217;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, which are similar.</p><p>To better understand the anti-goals of a Production Blocker, I&#8217;ve described them in a ladder format:</p><p><strong>Junior Production Blocker</strong></p><p>As a reviewer:</p><ul><li><p>Don&#8217;t bother checking your inbox for review requests. Your sole purpose is to code; leave the inboxes to the seniors.</p></li><li><p>Approve everything without reading the code to ensure potential issues go straight to production.</p></li></ul><p>As a changer:</p><ul><li><p>Merge your code on broken mainline builds. Once approved, don&#8217;t check the build status&#8212;just merge. As long as your code is in the mainline, your work is done.</p></li><li><p>Don&#8217;t review your own pull request. Let others discover your typo, temporary logs, or unfinished work.</p></li></ul><p><strong>Senior Production Blocker</strong></p><p>As a reviewer:</p><ul><li><p>Comment on every minor style issue and nitpick relentlessly. Don&#8217;t allow merging until all trivial issues are resolved.</p></li><li><p>If your teammates ask if they can merge first and resolve later, firmly say no.</p></li><li><p>Delete review request emails because your current work is far too important to be interrupted.</p></li></ul><p>As a changer:</p><ul><li><p>Do not add any explanation, context, or screenshot to your pull requests, your code is self-explanatory.</p></li><li><p>Submit only large pull requests. Big tickets need big pull requests. The larger the better.</p></li><li><p>Never revert your changes if they break the mainline. Spend a week investigating the root cause instead.</p></li></ul><p><strong>Lead Production Blocker</strong></p><p>As a reviewer:</p><ul><li><p>Be the only one who can approve pull requests, no one else is qualified. Make others wait, even if you&#8217;re on holiday.</p></li><li><p>Provide overly detailed feedback. If the changers don&#8217;t understand the feedback, close the pull request, and complete the change by yourself.</p></li></ul><p>As a changer:</p><ul><li><p>Focus solely on what you&#8217;re working on, and reject every collaboration attempt from your teammates.</p></li><li><p>Reject all review feedback from your teammates. They are not mature enough to understand your superior code.</p></li></ul><p><strong>Principal Production Blocker</strong></p><p>As a Principal, you transcend the roles of reviewer or changer. Your mission is to block the root of all production by taking it to the psychological level, you block people&#8217;s minds. Production Blocking<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> is the psychological term used to describe the tendency of one person to block other people from offering ideas, that&#8217;s your ultimate goal.</p><p>In a group discussion, always be the first one to speak and make sure you win by getting the last word<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>. If the discussion lasts an hour, talk for the entire hour, and block production. Suck all the oxygen in the room. When people interrupt, you&#8217;ll say &#8220;I&#8217;m not finished!&#8221; This way, no pull requests are even possible to be submitted.</p><div><hr></div><p>What else would you add to be a successful Production Blocker?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><a href="https://x.com/jack/status/1052383053094350848">https://x.com/jack/status/1052383053094350848</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://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#non-goals">https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#non-goals</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><a href="https://notes.ceilfors.com/Production_blocking.html">https://notes.ceilfors.com/Production_blocking.html</a></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://en.wikipedia.org/wiki/Wikipedia:The_Last_Word">https://en.wikipedia.org/wiki/Wikipedia:The_Last_Word</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[Seek concrete examples to deepen problem understanding: Lessons from Eric Evans (Part 2)]]></title><description><![CDATA[The most emphasised heuristic from Eric Evans' Software Design masterclass]]></description><link>https://read.ceilfors.com/p/concrete-examples-to-deepen-understanding</link><guid isPermaLink="false">https://read.ceilfors.com/p/concrete-examples-to-deepen-understanding</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Mon, 17 Jun 2024 09:27:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-haR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This is the second part of my previous essay about what I&#8217;ve learnt in Eric Evans&#8217; Software Design Masterclass. The full context can be found in <a href="https://read.ceilfors.com/p/unspoken-secrets-of-ddd-lessons-from-eric-evans">the first essay</a>.</em></p><div><hr></div><p>In software design, a deeper understanding of a problem is important. Gaining that deep understanding will also need to be efficient, as domain experts are typically busy. Through my experience in Eric Evans&#8217; Software Design Masterclass, I learned a small yet impactful step to gain a deeper understanding more efficiently.</p><p>During a conversation with a fellow attendee at the DDD Europe 2024 conference, I shared this significant insight about concrete examples. &#8220;Well, that&#8217;s pretty obvious isn&#8217;t it?&#8221;, they responded, highlighting a misconception I believe needs addressing.</p><p>If this technique was truly obvious, Eric wouldn&#8217;t have felt the need to emphasize it repeatedly throughout the two-day course. His constant reiteration reveals how deeply this idea is engrained in his head as a heuristic. It&#8217;s so pervasive that I noticed he repeated the phrase &#8216;concrete example&#8217; in his unrelated closing conference talk, which was about LLM and DDD.</p><p>The effectiveness of a concrete example became clear during our exercise. Consider a simplified snippet of the interview we did with Gien Verschatse, who acted as a domain expert in the class:</p><p>Eric: &#8220;Alright, class, remember, ask for concrete examples.&#8221;<br>Gien: &#8220;The problem is the fridge shows an error when I scan my plate.&#8221;<br>Class: &#8220;How does the fridge operate?&#8221;<br>Gien: <em>&lt;Long irrelevant explanation&gt;</em><br>Class: &#8220;How does the barcode look? Is it a QR code?&#8221;<br>Gien: <em>&lt;Long irrelevant explanation&gt;</em></p><p>Eric stepped in, &#8220;Could you walk us through a concrete example of when this problem happened?&#8221; Suddenly we were getting a great detail of what the problem is. I could notice the class were having a lightbulb moment, we understood the problem deeper now that we could come up with a better solution.</p><p>The first part of the phrase &#8216;concrete example&#8217; is the word &#8216;concrete&#8217;. The word concrete implies a real-world example, not a hypothetical or abstract one. While abstract examples can enhance our understanding, a concrete example keeps a discussion more grounded in reality, therefore we&#8217;ll be more confident that we&#8217;re solving the right problem.</p><p>The second part of the phrase is the word &#8216;example&#8217;. In my opinion, this word requires more emphasis given none of the class participants asked for any form of examples in the exercise.</p><p>Explain, example, extrapolate, all these words share the same prefix Latin root that implies &#8220;out of&#8221; or &#8220;from&#8221;, to mean a process to bring something to light, to make something clear. Giving an example is a process of making something clearer by representing a single item from a larger whole to illustrate a point.</p><p>On reflection, I realised how obvious it feels to explain concepts using examples, yet how non-obvious it often is to ask for them. I found it easier to help my eight-year-old daughter understand the concept of inertia through examples. In the London Underground, I would point out her experience when the train is about to move or about to stop, as an example of inertia, providing a concrete point of reference to a more abstract concept. Examples helped her gain that understanding.</p><p>Building on this, let&#8217;s consider the word &#8216;dog&#8217;. Imagine how you would explain this abstract concept to a child, without examples, it would have been challenging. Examples are fundamental to our knowledge acquisition process. My daughter&#8217;s understanding of dogs expanded through a series of examples and counterexamples, such as mistaking a cat for a dog.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-haR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-haR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-haR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-haR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-haR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-haR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg" width="1456" height="565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:565,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2201651,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-haR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-haR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-haR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-haR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb237b0a-6998-471c-808c-81ef09791fa2_4003x1554.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Many different dog breeds with different characteristics in one picture. A photo taken from Figure 9.2. p. 264. Goldstein, E. Bruce, and Johanna C. Van Hoff. <em>COGNITIVE PSYCHOLOGY</em>. 2E EMEA Edition, Annabel Ainscow (CENGAGE), 2021.</figcaption></figure></div><p>While it may seem unintuitive to ask for concrete examples initially, integrating this practice has proven valuable, even when I felt that I understood a particular problem. For instance, in a recent conversation with our team:</p><p>Product Manager: &#8220;I&#8217;d like a single analytics dashboard, so I don&#8217;t have to look to multiple places to analyse our customer conversion.&#8221;<br>Team: &#8220;We&#8217;re going to need to adopt a data platform. We&#8217;re worried about the associated cost.&#8221;<br>Product Manager: &#8220;I think we need to invest in a data platform, it&#8217;ll allow us to collect and gather more data in the future.&#8221;<br>Team: <em>&lt;Long discussion and conversation&gt;</em></p><p>Notice how even though we were discussing a problem, the problem was not concrete enough. This is exactly what happened in Eric&#8217;s class. The team were trapped in the discussion that didn&#8217;t deepen our understanding.</p><p>I asked for a concrete example, &#8220;Could you show us, share your screen, what is it that you&#8217;re doing, and found painful?&#8221; Upon seeing the real-life demonstration, the team immediately had a clearer understanding of the problem. We also started to think like a designer, we dug deeper into the pain points. We ask, how often does our Product Manager need to do this?</p><p>At the end of the discussion, we thought a simpler solution would work so long as we make it evolvable. Better yet, we thought the problem wasn&#8217;t painful enough for now we deferred from solving it.</p><p>Ultimately, grounding our understanding of problems through concrete examples anchors our discussions in reality. This technique proved invaluable in efficiently comprehending a problem.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Seeking concrete examples improves our judgement through a small yet impactful step, the theme of this newsletter. Share it with your friends!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div><hr></div><p>If enjoyed this post, you might enjoy these other DDD posts and my deeper thoughts about the intuitiveness of TDD.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;064da8db-d098-4fea-ada2-dcbf716b4810&quot;,&quot;caption&quot;:&quot;Like any other practices or techniques I learned, I&#8217;d like to validate my understanding against the source of truth, and I can&#8217;t get closer to the source of truth than attending Eric Evans&#8217; class, a pre-conference workshop in DDD Europe 2024. It&#8217;ll be an opportunity to observe the original author of the big blue book, the man himself, operate in real li&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;The Unspoken Secrets of DDD: Lessons from Eric Evans &quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:106123510,&quot;name&quot;:&quot;Wisen Tanasa&quot;,&quot;bio&quot;:&quot;Independent Consultant. Technical Coach. Fractional CTO. Previously Principal Consultant at ThoughtWorks.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b3f3c3-2c40-4391-99d4-01dd7c3d14e3_280x280.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-06-07T09:58:19.554Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://read.ceilfors.com/p/unspoken-secrets-of-ddd-lessons-from-eric-evans&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:145332666,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:6,&quot;comment_count&quot;:4,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Quantum Steps&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;148a3716-2894-444f-963a-efca60f5e33a&quot;,&quot;caption&quot;:&quot;Imagine that you&#8217;re designing a REST API that returns a date. Knowing that dates are not a primitive type, you must decide how to represent the date in a string. You came up with these options: Use ISO 8601: 2020-01-12 Create a custom date format: 20201201&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Why Explore DDD&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:106123510,&quot;name&quot;:&quot;Wisen Tanasa&quot;,&quot;bio&quot;:&quot;Independent Consultant. Technical Coach. Fractional CTO. Previously Principal Consultant at ThoughtWorks.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b3f3c3-2c40-4391-99d4-01dd7c3d14e3_280x280.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-05-20T06:27:55.488Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c00d25-eef8-4555-adbe-e876131c365a_1024x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://read.ceilfors.com/p/why-explore-ddd&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:122445094,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Quantum Steps&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;bffa9897-d507-4aba-9adf-9ea724b652f0&quot;,&quot;caption&quot;:&quot;Welcome to the latest issue of my newsletter series, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the introduction post.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;TDD Made Intuitive: Spec-First Thinking&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:106123510,&quot;name&quot;:&quot;Wisen Tanasa&quot;,&quot;bio&quot;:&quot;Independent Consultant. Technical Coach. Fractional CTO. Previously Principal Consultant at ThoughtWorks.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b3f3c3-2c40-4391-99d4-01dd7c3d14e3_280x280.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-10-06T09:50:33.765Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:137687848,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:2,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Quantum Steps&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[The Unspoken Secrets of DDD: Lessons from Eric Evans ]]></title><description><![CDATA[What I learned about knowledge crunching from Eric Evans' Software Design Masterclass]]></description><link>https://read.ceilfors.com/p/unspoken-secrets-of-ddd-lessons-from-eric-evans</link><guid isPermaLink="false">https://read.ceilfors.com/p/unspoken-secrets-of-ddd-lessons-from-eric-evans</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 07 Jun 2024 09:58:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!L1Q_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.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_!L1Q_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L1Q_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L1Q_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L1Q_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L1Q_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L1Q_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:372649,&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_!L1Q_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L1Q_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L1Q_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L1Q_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd97ab51a-942e-4d0e-a7e2-47da9aa4f327_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Like any other practices or techniques I learned, I&#8217;d like to validate my understanding against the source of truth, and I can&#8217;t get closer to the source of truth than attending Eric Evans&#8217; class, a pre-conference workshop in DDD Europe 2024. It&#8217;ll be an opportunity to observe the original author of the big blue book, the man himself, operate in real life.</p><p>Validating against the source of truth is important for me to reduce misinterpretation. For example, I joined ThoughtWorks 7 years ago to validate my understanding of various Agile practices. I was first exposed to Domain-Driven Design (DDD) at around the same time, but unsatisfactorily until today, I haven&#8217;t felt that I have validated my understanding of DDD. That&#8217;s what I aimed to do in this class, uncovering Eric&#8217;s secrets.</p><p>This brings me to the structure of the class. The class was running for two days. There were 2 instructors, Eric Evans and Gien Verschatse, and there were roughly about 15 participants. Gien wore two hats, she&#8217;s a software engineer, and she&#8217;s also playing the role of a domain expert in DNA building or strain engineering, a domain she worked in for 5 years. Eric, and all of us participants, were to knowledge crunch and model this problem.</p><p>I have zero experience in DNA building. The domain is fascinating, but I had to remind myself that I paid a significant amount to attend this class. This means I&#8217;m more interested in &#8220;domain modelling&#8221; Eric&#8217;s thought processes than the problem domain itself. I kept 80% of my energy observing Eric.</p><p>Given how unstructured the class is, I told Eric that I&#8217;m struggling to domain model his head and DNA building together. I&#8217;m glad I did that as despite my best effort to read his mind, it was easier when he started to add commentaries about his thoughts.</p><p>There were many observations and learnings I&#8217;ve made, but to cut the length of this narrative essay, I&#8217;ve decided to scope it to knowledge crunching, the hardest, crucial, yet often neglected skill to master in DDD.</p><h2>Expertise in listening</h2><p>Despite the plethora of techniques and methods in the DDD community, such as Event Storming, Eric didn&#8217;t use any of them. At some point, a group in the class were debating on what techniques to use, and they received advice to use whatever that works for them.</p><p>There wasn&#8217;t any specially DDD-named technique he was using. Eric spent most of his time sitting and listening. He didn&#8217;t hold a notebook. He didn&#8217;t draw anything. There were 5 instances where he would stand up, show a gesture of having a light bulb moment, and write a short sentence on a whiteboard. Apart from that, he&#8217;s primarily listening.</p><p>What strikes me is how good his intuition is for what&#8217;s important to capture and expand. He shared his heuristic: &#8220;What&#8217;s important you&#8217;ll hear over and over again.&#8221; He&#8217;s able to separate signals from noise extremely well.</p><p>When a participant asked, &#8220;Could we solve the problem by defining DNA pipeline declaratively?&#8221; Eric noticed Gien&#8217;s reaction, her eyebrow raised, lost in words. Then Eric intervened and suggested using language that resonated, the word declarative was too technical. He&#8217;s actively listening, and paying attention to subtle cues.</p><h2>Expertise in interviewing</h2><p>Listening is one expertise, he&#8217;s also demonstrated how to ask great relevant questions at the right time. During the class, it&#8217;s becoming apparent that the participants tend to try to go deep into irrelevant points or understand everything at once.</p><p>Like any interview, time is of the essence, and going deeper into an irrelevant topic will waste everyone&#8217;s time. In fact, he mentioned that &#8220;time&#8221; is always in his head, so he wants to be careful about how he spends time with a domain expert.</p><p>The room often jumps ahead and talks about solutions, and Eric often refocuses the room on pain points, rather than solutions. I have observed a similar tendency to jump into solutions from many engineers throughout my career.</p><p>At one point Gien uttered so much jargon no one understood anything in the room. Eric caught his confusion and executed a manoeuvre that left the room in shock and awe. The class later summarised this technique as &#8220;zooming in and zooming out&#8221;, which I don&#8217;t think captures the nuances of what he did. In his own words, what he did is to &#8220;latch&#8221; onto a smaller problem, within the big problem that&#8217;s been described. This small problem is not known to him, but he felt that he could understand that better than the bigger problem. Once he understood the smaller problem better, which took some time, he climbed back up to the bigger problem with a newfound understanding.</p><h2>Expertise in learning</h2><p>&#8220;Is this how you would operate in real life? No tools, no notes, no nothing?&#8221;, I asked at some point. The answer was a resounding yes. He further expanded on how he doesn&#8217;t default to UML either. Instead, he would learn and absorb diagrams being drawn by domain experts.</p><p>He&#8217;s deeply committed to being immersed in the domain. Never once he would say that he&#8217;s trying to domain model, or he&#8217;s trying to knowledge crunch, he listens to a problem, and he&#8217;s off having that deep conversation to further his understanding.</p><p><a href="https://notes.ceilfors.com/Understanding_requires_elaboration.html">Understanding requires elaboration</a>, and I was amazed by how much effort he&#8217;s showing in elaborating with the domain language. He&#8217;s the first one that would verbalise such a sentence, &#8220;So we would use THCAS Forward Primer and Reverse Primer on a plate to amplify the gene through a PCR process to create PGAL1.&#8221; (I don&#8217;t remember the exact details). As you can see, we were in a different world. As far as I can remember, no participants attempted to elaborate like this. Eric was demonstrably struggling, stuttering, and showing pauses, when he was trying to finish that sentence. The result, he learnt the fastest in the room.</p><div><hr></div><p>What I love about the themes I&#8217;ve observed is how Eric opened up about the fact that we don&#8217;t always need to rely on new methods, but we could get better results by being experts in our basics. These basics, the idea that designers should have curiosity and empathy, were shown in all the observation themes.</p><p>Unfortunately, though, I felt underwhelmed by what I&#8217;ve learnt. These were the things I already knew, these are no secrets to me.</p><p>It took me time to realise that there was an observation that I overlooked. It took me 5 days to realise this and I later shared that one key learning with Eric, jokingly during our dinner: &#8220;Eric would like to be the first one who kills his baby, and if it&#8217;s not his baby, he&#8217;ll cuddle it first before killing it.&#8221;</p><p>This metaphor was used when we talked about how to deal with an old broken existing domain model that has been created, either by ourselves or someone else. Eric made an important point: Most designers could not come up with good domain models because the designers are too attached to what they have produced in the past. Then he further said:</p><blockquote><p>&#8220;I want to be the one who comes up with a better model. I want to be the one to find flaws in my model.&#8221;<br><br><em>- Eric Evans</em></p></blockquote><p>That&#8217;s the secret I&#8217;ve been looking for. I have not thought of approaching a model in that manner.</p><p>That statement itself may sound plain, but it expresses his attitude towards domain modelling, the level of care for domain models he conveyed in that sentence is on another level.  Two individuals may practice the same techniques, but they&#8217;ll show different results when they care.</p><p>If you have a deep belief that a better model will help us solve problems better, you&#8217;ll do whatever it takes to produce a better model. And in that belief, I found not just a lesson in DDD, but a lesson in the relentless pursuit of excellence.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This writing is reader-enabled. Subscribe to support, and share it with your friends.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p><div><hr></div><p>If you liked this essay, you might like another one about DDD:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;def067ed-f20d-484b-a695-964ce1a0108a&quot;,&quot;caption&quot;:&quot;Imagine that you&#8217;re designing a REST API that returns a date. Knowing that dates are not a primitive type, you must decide how to represent the date in a string. You came up with these options: Use ISO 8601: 2020-01-12 Create a custom date format: 20201201&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Why Explore DDD&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:106123510,&quot;name&quot;:&quot;Wisen Tanasa&quot;,&quot;bio&quot;:&quot;Independent Consultant. Technical Coach. Fractional CTO. Previously Principal Consultant at ThoughtWorks.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b3f3c3-2c40-4391-99d4-01dd7c3d14e3_280x280.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-05-20T06:27:55.488Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c00d25-eef8-4555-adbe-e876131c365a_1024x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://read.ceilfors.com/p/why-explore-ddd&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:122445094,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Quantum Steps&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div>]]></content:encoded></item><item><title><![CDATA[Crossing the Road Together]]></title><description><![CDATA[What is your expertise, and how might we teach it?]]></description><link>https://read.ceilfors.com/p/crossing-the-road-together</link><guid isPermaLink="false">https://read.ceilfors.com/p/crossing-the-road-together</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 24 Nov 2023 09:43:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J57W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Petruk let out a deep sigh as he reviewed yet another pull request. Sitting in front of his computer, coffee in hand, he felt a familiar frustration. &#8220;Not again,&#8221; he thought, recalling numerous similar comments he had left over the past months.</p><p>For many months, Petruk's primary goal had been to elevate the coding standards of his team. He diligently provided feedback with lists of suggestions, but his team struggled to grasp his comments. They&#8217;re all struggling and frustrated. It seems Petruk can see things that others can&#8217;t see.</p><p>Dewi, his colleague, approached with her calming presence. &#8220;What&#8217;s that big sigh about, O Petruk?&#8221; she inquired.</p><p>Petruk explained his situation. Dewi, closing her eyes and nodding thoughtfully, posed an unexpected question.</p><p>&#8220;O Petruk, do you know how to cross the road?&#8221;<br>&#8221;What? What do you mean?&#8221;</p><p>&#8221;Answer the question, do you know how to cross the road?&#8221;<br>&#8221;Well, you just&#8230; Cross the road. It&#8217;s easy.&#8221;</p><p>&#8221;How do you avoid getting hit by a car?&#8221;<br>&#8221;Hmm&#8230; You cross properly, with attention.&#8221;</p><p>&#8221;Tell that to toddlers. What do you think will happen?&#8221;<br>&#8221;Well&#8230; They might not understand and could get hurt.&#8221;</p><p>&#8221;O Petruk, tell me, how would you show a toddler how to cross properly look like?&#8221;</p><p>Petruk paused, then began explaining to Dewi. He mentioned the importance of stopping and pausing before crossing, looking left and right, and being aware of oncoming traffic. He realised that some aspects of crossing the road, like judging the speed of cars or understanding when it&#8217;s safe to cross, are difficult to explain in words.</p><p>Dewi, still with her eyes closed, looked satisfied with Petruk&#8217;s explanation. &#8220;Do your teammates know how to cross the road?&#8221; she inquired. Petruk wasn&#8217;t sure how to answer.</p><p>&#8220;O Petruk, <strong>expertise is knowing what to pay attention to</strong>. By using pull request comments, you&#8217;re only pointing out the signs along the road. To show others what you&#8217;re paying attention to, try crossing the road together.&#8221;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><p>In the following weeks, Petruk started experimenting with different techniques. &#8220;I need to find ways to show what I&#8217;m paying attention to, &#8220; he thought. He began sitting with his teammates more. He experiments with pair programming. He experiments with live demonstrations, where he&#8217;ll sit down to refactor and improve the quality of the codebase while thinking out loud. Rather than leaving asynchronous pull request comments, he experiments with doing a live code review, where his teammates can hear his thought process.</p><p>Sometimes, he noticed, his teammates still couldn&#8217;t see certain issues, not because they weren&#8217;t trying, but because they hadn&#8217;t developed the necessary perspective. Just like how even with great technique, a toddler is still not tall enough to see past parked cars. Petruk started to build more empathy, helping them see what he saw when those parked cars were blocking their views.</p><p>A year quickly passed. Petruk was again sitting and sipping his cup of coffee, reviewing a pull request, when he let out a big sigh. Dewi noticed, &#8220;O Petruk, what&#8217;s the big sigh about this time?&#8221;</p><p>&#8220;A sigh of relief&#8221;, Petruk responded.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/crossing-the-road-together?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Enjoyed this? Don&#8217;t just stare, share it with your friends.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/crossing-the-road-together?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/crossing-the-road-together?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>I previously wrote about how attention is one of our cognitive functions.</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;23b421cd-b3fe-4828-8aaf-a5b364a1bd48&quot;,&quot;caption&quot;:&quot;I have bad memories. Not the kind that relates to regret or sadness, but rather, I have difficulty recalling them. Whenever my wife reminisces, saying, &#8220;Remember that holiday when we &#8230;&#8221; I often draw a blank. This forgetfulness piqued my curiosity, or more accurately, it instilled fear, prompting me to delve into books about memory. I remember over a deca&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Exploring Cognitive Functions for Software Engineering&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:106123510,&quot;name&quot;:&quot;Wisen Tanasa&quot;,&quot;bio&quot;:&quot;Independent Consultant. Technical Coach. Fractional CTO. Previously Principal Consultant at ThoughtWorks.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b3f3c3-2c40-4391-99d4-01dd7c3d14e3_280x280.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-11-09T12:17:09.384Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://read.ceilfors.com/p/9-cognitive-functions&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:138722085,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:3,&quot;comment_count&quot;:2,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Quantum Steps&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p></p><p>If you enjoyed this kind of story, you might enjoy:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;18c4b8ba-c7d9-4dae-801f-be6a9c52fced&quot;,&quot;caption&quot;:&quot;George took a sip, his face cringed, disgusted, disapproving. Being polite, he didn&#8217;t say anything, until I asked if I had made the tea wrong. &#8220;It doesn&#8217;t taste right. Could you explain to me how you made it, please?&#8221; George asked politely. I explained to him that I took a cup, poured some milk into it, and then he interrupted me. &#8221;Stop, what? That&#8217;s not how you make a cup of tea! You put in the tea first, the milk last!&#8221;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;md&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Making a Nice Cup of TDD&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:106123510,&quot;name&quot;:&quot;Wisen Tanasa&quot;,&quot;bio&quot;:&quot;Independent Consultant. Technical Coach. Fractional CTO. Previously Principal Consultant at ThoughtWorks.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b3f3c3-2c40-4391-99d4-01dd7c3d14e3_280x280.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-06-12T10:26:17.033Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://read.ceilfors.com/p/making-a-nice-cup-of-tdd&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:123679767,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:15,&quot;comment_count&quot;:10,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Quantum Steps&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J57W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J57W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!J57W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!J57W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!J57W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J57W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png" width="1312" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J57W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!J57W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!J57W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!J57W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ac3c1d-4d95-4b43-a882-7a1f7e93d9d1_1312x928.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>]]></content:encoded></item><item><title><![CDATA[Write Forgettable Code]]></title><description><![CDATA[Making design judgements based on our tendency to forget]]></description><link>https://read.ceilfors.com/p/write-forgettable-code</link><guid isPermaLink="false">https://read.ceilfors.com/p/write-forgettable-code</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 17 Nov 2023 14:33:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rFAa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My daughter held a book and asked, &#8220;Dad, can you remind me to bring this book to school tomorrow morning?&#8221; I replied, &#8220;Put it in your bag, I&#8217;m not your alarm.&#8221; She didn&#8217;t and said, &#8220;Oh, well, I&#8217;ll remember.&#8221; The following day, she forgot the book.</p><p>This reminds me of a deep discussion I had with <a href="https://twitter.com/therealbenji14">Ben</a> yesterday. We were looking at a part of our codebase, which I&#8217;ll simplify here:</p><pre><code>// Version 1

if (env === "prod") {
  return {
    API_URL: "prod-url",
    STRIPE_KEY: "prod-key",
  };
} else {
  return {
    API_URL: "dev-url",
    STRIPE_KEY: "dev-key",
  };
}</code></pre><p>I suggested a different approach:</p><pre><code>// Version 2

return {
  API_URL: env === 'prod' ? 'prod-url' : 'non-prod-url',
  STRIPE_KEY: env === 'prod' ? 'prod-key' : 'non-prod-key',
}</code></pre><p>In Version 1, you might notice the duplication of the `API_URL` line. Reflecting on how I suggested for Version 2, I realise I didn&#8217;t use the word duplication. I think this is probably because I know that Ben is a deep thinker. He really digs into the &#8216;why &#8216;of things. Simply arguing about duplication might not have been persuasive enough for him.</p><p>Instead, I highlighted a potential problem we might face in the future: the risk of forgetting to update the `prod` part of the code when changes are made to the `non-prod` part. From my previous essay, <a href="https://read.ceilfors.com/p/remove-duplication-to-deliberately-forget">Remove duplication to deliberately forget</a>:</p><blockquote><p>This heuristic, the act of forgetting and remembering, also implies the aspect of time. Time is the primary difference between programming and software engineering. We need to adapt to changing needs over time, and this context of what probabilities might come in the future, helps us make a better judgement.</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><p>Imagine a scenario where the prod section is overlooked during an update, the production environment might break:</p><pre><code>if (env === "prod") {
  return {
    API_URL: "prod-url",
    KEY: "prod-key",
    // &lt;--- not updated
  };
} else {
  return {
    API_URL: "non-prod-url",
    KEY: "non-prod-key",
    NEW_BUCKET_NAME: "non-prod-bucket",
  };
}</code></pre><p>In this case, Version 1 requires you to remember well. On the other hand, I describe Version 2 as &#8220;forgettable code&#8221; (I don&#8217;t like this name).</p><p>I&#8217;ve found that discussing this concept with others leads to more agreement, given that forgetting is a human limitation we share. Debates about duplication often end up like discussions about personal writing styles - &#8220;I prefer the code to be centralised&#8221; vs &#8220;I prefer the code to be shorter&#8221;. Such discussions rarely lead to consensus.</p><p>Of course, we can see the whole code visually, so you might think, &#8220;I&#8217;ll remember, I can see them!&#8221; But our current codebase has examples where the complete prod config doesn&#8217;t fit on one screen.</p><p>You might further say, &#8220;I&#8217;ll still remember, even if it doesn&#8217;t fit my screen.&#8221; However, consolidating new information into our Long-Term Memory (one of our <a href="https://read.ceilfors.com/p/9-cognitive-functions">nine cognitive functions</a>) is challenging. We tend to forget over time. If there&#8217;s an option that requires you to spend less cognitive effort, why not do it?</p><p>The challenge grows when working in teams. You move from dealing with one head to multiple heads, i.e. multiple Long-Term Memories. With Version 1, you have to ensure that everyone remembers to keep the values in sync. You might note this in a Pull Request or add comments to the code as reminders. You know how the story ends, your teammate will forget.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rFAa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rFAa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!rFAa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!rFAa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!rFAa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rFAa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png" width="1312" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1700385,&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_!rFAa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!rFAa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!rFAa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!rFAa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5678cb35-fc41-4368-a42b-0a11316f2fbf_1312x928.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>]]></content:encoded></item><item><title><![CDATA[Exploring Cognitive Functions for Software Engineering]]></title><description><![CDATA[How might we apply cognitive psychology to our work?]]></description><link>https://read.ceilfors.com/p/9-cognitive-functions</link><guid isPermaLink="false">https://read.ceilfors.com/p/9-cognitive-functions</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Thu, 09 Nov 2023 12:17:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_UNM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have bad memories. Not the kind that relates to regret or sadness, but rather, I have difficulty recalling them. Whenever my wife reminisces, saying, &#8220;Remember that holiday when we &#8230;&#8221; I often draw a blank.</p><p>This forgetfulness piqued my curiosity, or more accurately, it instilled fear, prompting me to delve into books about memory. I remember over a decade ago, I read &#8220;Moonwalking with Einstein&#8221; by Joshua Foer, the 2006 U.S. Memory Championship winner. Ironically, just days after his victory, he drove his car to a celebratory dinner and took the subway back home, completely forgetting his car.</p><p>After devouring many books, I toyed with the idea of returning to university to delve deeper into the subject, but I couldn&#8217;t afford it. That&#8217;s when I realised that perhaps a textbook is a cheaper path to finding the truth<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. I picked up &#8220;Cognitive Psychology&#8221; by E. Bruce Goldstein, a university textbook. Back in my university days, I&#8217;d despise reading a textbook cover to cover, but this time, I finished the textbook (still processing) and felt energised. All the things I wanted to know, they&#8217;re all here.</p><h2>Nine cognitive functions</h2><p>I don&#8217;t think there&#8217;s an official list of cognitive functions. The following is derived from the textbook as hinted by its chapters. As you read through this list, imagine that I&#8217;m seated in front of my computer, about to make a change to a codebase:</p><ol><li><p>I engage my <strong>perception</strong> and notice multiple problems in the codebase.</p></li><li><p>I pay <strong>attention</strong> to one problem that worries me the most.</p></li><li><p>This particular problem turns into information and goes into my <strong>working memory</strong>, ready for manipulation.</p></li><li><p>As I manipulate the information, I rake through my <strong>long-term memory</strong> to determine if I have solved similar issues.</p></li><li><p>I&#8217;ve seen this before. I have the <strong>knowledge</strong>. This is a code smell. It&#8217;s called the long method. And I know multiple refactoring techniques to address this code smell.</p></li><li><p>I use <strong>visual imagery</strong>, to remind me of the architectural style we&#8217;ve adopted, ensuring the solution is aligned to it.</p></li><li><p>I <strong>reason </strong>and make the <strong>judgement</strong> to choose which solution is best.</p></li><li><p>Using all the above cognitive functions, I <strong>problem-solve</strong>, and the problem is resolved.</p></li><li><p>I commit the change, writing the commit message in a <strong>language</strong> that my future self and others will understand.</p></li></ol><p>Each of the emphasised words represents a cognitive function, I won&#8217;t go deep in defining each one here. I have illustrated these cognitive functions linearly for simplicity, but they&#8217;re more intricate than that. Consider a recent task, maybe making an architectural decision, and reflect on it, every cognitive function is at play.</p><p>Cognitive psychology is the study of the mind. An interesting observation is that these cognitive functions can often be metaphorically replaced with the concept of &#8216;mind&#8217;:</p><ul><li><p>&#8220;I&#8217;ve changed my mind&#8221; (judgement)</p></li><li><p>&#8220;If you put your mind to it, I&#8217;m sure you can find the solution&#8221; (problem-solving)</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_UNM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_UNM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 424w, https://substackcdn.com/image/fetch/$s_!_UNM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 848w, https://substackcdn.com/image/fetch/$s_!_UNM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 1272w, https://substackcdn.com/image/fetch/$s_!_UNM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_UNM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68766,&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_!_UNM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 424w, https://substackcdn.com/image/fetch/$s_!_UNM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 848w, https://substackcdn.com/image/fetch/$s_!_UNM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 1272w, https://substackcdn.com/image/fetch/$s_!_UNM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0325cf1-906d-42e9-85b1-8fa048cf4047_768x1464.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I was sketching multiple models into one</figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>How might this be useful?</h2><p>After reading the illustration above, you might ponder, what&#8217;s the point? You might think, I can do my job without understanding all that.</p><p>This is where my exploration has led me, and so far, some of my coachees have begun to see its usefulness:</p><p> <em><strong>1. Decompose a skill into multiple parts</strong></em></p><p>Observe how a child learns to hold a pencil to write. You can break this down into fine motor skills (the strength to hold the pencil) and recognising the alphabet. Both are essential.<br><br>Similarly, in a refactoring exercise, you can dissect the skills into multiple cognitive functions, as illustrated before. This is what Quantum Steps is all about, I want to break things down into tiny parts.</p><p> <em><strong>2. Identifying gaps</strong></em></p><p>You may notice that a child can recognise the alphabet but still can&#8217;t hold the pencil. The gap here is the fine motor skills.</p><p>In the context of refactoring, an engineer might <strong>know</strong> the steps to refactor but fail to <strong>perceive</strong> code smells. Some can&#8217;t <strong>judge</strong> well when or when not to refactor. Some architects may know architectural patterns well but fall short in <strong>problem-solving</strong> or communicating in effective <strong>language</strong>.</p><p><strong> </strong><em><strong>3. Filling the gap effectively</strong></em></p><p>Once a specific gap, such as fine motor skills, is identified, you could strengthen the child&#8217;s finger with other toys, which could be more effective as they learn through play, and the skills are transferable to writing.</p><p>With the plethora of courses, many people consume vast amounts of content to learn about a topic. Ask yourself, what&#8217;s the most effective way to learn? Let me reframe this from a cognitive psychology lens: what&#8217;s the most effective way to consolidate information into <strong>long-term memory?</strong> The answer might surprise you.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/9-cognitive-functions?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/9-cognitive-functions?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/9-cognitive-functions?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><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>Textbooks as the best way to learn new material: <a href="https://www.lesswrong.com/posts/xg3hXCYQPJkwHyik2/the-best-textbooks-on-every-subject">Less Wrong</a>.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Help me choose future topics?]]></title><description><![CDATA[Which theme resonates most with you, and which would you eagerly anticipate reading?]]></description><link>https://read.ceilfors.com/p/help-me-choose-future-topics</link><guid isPermaLink="false">https://read.ceilfors.com/p/help-me-choose-future-topics</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Wed, 11 Oct 2023 08:24:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2e61f7-e2dd-451b-a946-5f6457683780_701x701.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there! I need your help to pull myself out of the TDD rabbit hole (~2 essays left). It&#8217;ll be great to see what topics you&#8217;re interested in learning or reading about next.</p><p>Following my goal to dive more into small yet impactful steps, below are the themes that float around in my head (some might overlap).</p><p>Comment with your thoughts or multiple themes; if short on time, take the poll. Your input is invaluable. Thank you!</p><div class="poll-embed" data-attrs="{&quot;id&quot;:109608}" data-component-name="PollToDOM"></div><ol><li><p>The Power of Naming</p><p>We name things all the time without knowing what good or bad naming would look like. I&#8217;m not talking about not using acronyms as variables; this theme is beyond that. Naming has powers, it influences boundaries and could determine trajectories. This may come primarily from stories to start with. I hope to create a framework for naming at some point that may benefit us.</p></li><li><p>Task Decomposition Patterns</p><p>Many software engineers I work with love to work on small steps but struggle to break big things down into &lt; 1/2 day work. Sometimes, I show them how to break it down, and they have a moment of revelation. May connect to productivity improvements, pomodoro, flow state, etc.</p></li><li><p>Initiative, Influence, Introverts</p><p>This theme is about turning that big cloud into raindrops (bigger task than previous theme). Many great engineers I met have high expectations for their team but get frustrated to make the change. Some attribute this to their introversion. I&#8217;ll share some of my stories, and case studies, about what works and doesn&#8217;t work, broken down into small steps.</p></li><li><p>Minimal Momentum</p><p>I attribute many of my learnings to what I do outside of work, such as reading or working on a pet project, whether reading or shipping. Many engineers I spoke to feel they can&#8217;t finish their pet projects. In other words, they have big motivation but they lose their momentum. With the right technique, we can work on something decent with just 10 - 30 minutes a day.</p></li><li><p>Deliberate Expertise (Research Insights)</p><p>Many found their expertise by accident, we can do better by making it deliberate. I&#8217;m self-studying some topics and will try to tie this back to our work as software engineers. To give some colour to this theme, this is what I&#8217;m currently studying:</p><ol><li><p>Cognitive Psychology. I&#8217;m studying a university book and am currently deep in <a href="https://notes.ceilfors.com/Goldstein,_Cognitive_Psychology.html">Zettelkastening</a> it. Lots of insights on how to learn and work better.</p></li><li><p>Science of Expertise: How did I learn TDD? What&#8217;s deliberate practice? (lots of misunderstanding out there).</p><p>I might tie this back to <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Kent Beck&quot;,&quot;id&quot;:24333739,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F000da410-0ed6-4a25-80b1-6a46e964ae0b_242x242.jpeg&quot;,&quot;uuid&quot;:&quot;774037c6-bbbd-4e4a-8c4f-48340d1b43ee&quot;}" data-component-name="MentionToDOM"></span>&#8216;s <a href="https://www.facebook.com/notes/kent-beck/mastering-programming/1184427814923414/">Mastering Programming</a>.</p></li><li><p>Science of Habits: What habits? Which bad habits? How do we build/undo it?</p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Kent Beck&quot;,&quot;id&quot;:24333739,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F000da410-0ed6-4a25-80b1-6a46e964ae0b_242x242.jpeg&quot;,&quot;uuid&quot;:&quot;9087874b-e957-4bf5-9549-d64b98ad8a0b&quot;}" data-component-name="MentionToDOM"></span> : &#8220;I'm not a great programmer; I'm just a good programmer with great habits.&#8221;</p></li><li><p>Cynefin: Which practice, when, and where?</p></li></ol></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/help-me-choose-future-topics/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/help-me-choose-future-topics/comments"><span>Leave a comment</span></a></p><h2>Expert&#8217;s Aside</h2><p>As I wrote the last theme, I realised I believe in the idea of &#8216;competency over career&#8217;. This means I&#8217;d prefer to use the language of novice to expert, rather than junior/grad to lead/staff, etc. This is ironic because the idea of competency is often discussed in the context of a career. More ironically, I also associate the word &#8216;expert&#8217; with this hilarious video:</p><div id="youtube2-BKorP55Aqvg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;BKorP55Aqvg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/BKorP55Aqvg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/help-me-choose-future-topics/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/help-me-choose-future-topics/comments"><span>Leave a comment</span></a></p>]]></content:encoded></item><item><title><![CDATA[TDD Made Intuitive: Spec-First Thinking]]></title><description><![CDATA[Why we should embed spec in our workflow.]]></description><link>https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking</link><guid isPermaLink="false">https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 06 Oct 2023 09:50:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YQmp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.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_!YQmp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YQmp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!YQmp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!YQmp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!YQmp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YQmp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png" width="1312" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7548d13-6897-4569-a899-d0537ff2044c_1312x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1873751,&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_!YQmp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!YQmp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!YQmp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!YQmp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7548d13-6897-4569-a899-d0537ff2044c_1312x928.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Bricks on top of guiding lines</figcaption></figure></div><p><em>Welcome to the latest issue of my <a href="https://read.ceilfors.com/t/test-first-vs-last">newsletter series</a>, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/test-first-vs-last-introduction">introduction post</a>.</em></p><div><hr></div><p>Test-driven development (TDD) is often rejected due to its perceived unintuitiveness. Is there a way to make TDD more intuitive? I believe there is, and it requires us to think more about specification first, rather than testing first.</p><p>In this essay, I&#8217;ll explain why spec-first might be more intuitive than test-first. I&#8217;ll further explore why we still don&#8217;t write a spec even though it&#8217;s an intuitively small yet impactful step, with the hope that more of us will think about this in our work.</p><h2>Spec first, test last</h2><p>I previously wrote about how <a href="https://read.ceilfors.com/p/tdd-is-unintuitive">unintuitive TDD</a> might be for some. The root of the unintuitiveness of TDD comes from the word test:</p><blockquote><p>The idea of test to be after the fact is simple enough for even young children to grasp. They are tested, once they have studied. They got tested for an illness, once there&#8217;s a symptom for it. They can test a dish, once it&#8217;s started cooking. Testing, always comes last, not first!</p></blockquote><p>Let&#8217;s consider the term &#8220;spec&#8221; instead. The terms specification, specify, and specific all stem from the Latin word &#8220;specificus&#8221;, which pertains to defining or identifying with clarity. You make something specifically clear by specifying in a specification.</p><p>The idea of specifying is simple enough for young children to grasp, even when they don&#8217;t use the word spec. The recipe they follow to cook is a spec. Builders don&#8217;t start laying bricks randomly; they follow a spec. Before you are about to drive that nail to the wall, you mark the spot first (spec). Spec mostly comes first, not last.</p><p>In the TDD process, one might view the first step more as defining a specification than merely setting up a test. Some of you might be creating spec files without realising why it&#8217;s called this way, i.e. foo.spec.js or foo_spec.rb. The next time you write that spec file, think about it for a moment: why is it called a spec?</p><p>When you think in spec-first, a specification is the defined behaviour of the elements you&#8217;re about to create.</p><p>As I have described so far in this series, the benefits of TDD hinge on the concept of laying out specifications. I believe you&#8217;ll gain the benefit even when you don&#8217;t write the spec in code. Write spec in human language if you feel that it&#8217;s easier. TDD helps you save one step by encouraging you to write the specification in code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-pbY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-pbY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 424w, https://substackcdn.com/image/fetch/$s_!-pbY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 848w, https://substackcdn.com/image/fetch/$s_!-pbY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 1272w, https://substackcdn.com/image/fetch/$s_!-pbY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-pbY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png" width="1456" height="674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:439628,&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_!-pbY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 424w, https://substackcdn.com/image/fetch/$s_!-pbY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 848w, https://substackcdn.com/image/fetch/$s_!-pbY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.png 1272w, https://substackcdn.com/image/fetch/$s_!-pbY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d8cc7c0-beeb-4d20-9c5e-929d64eb485b_2026x938.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>Unfortunately, although the word spec should intuitively come first before coding, we still don&#8217;t intuitively spec first. Knowing is not enough, we tend to miss this step.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>Coding mindlessly</h2><p>Seth Godin frequently emphasises the significance of specifications in his writings. In his blog post, <a href="https://seths.blog/2018/12/creating-a-useful-spec/">Creating a useful spec</a>, he wrote:</p><blockquote><p>If you want someone to help, you&#8217;ll do better with a spec. It lists just four things:</p><ol><li><p>What is the problem to be solved?</p></li><li><p>How are we going to solve it?</p></li><li><p>How can we test that the thing we built matches what we set out to build?</p></li><li><p>How will we know if it&#8217;s working?</p></li></ol><p>[&#8230;]</p><p><strong>If you&#8217;re not spending at least 5% of your project budget on the spec, you might be doing it wrong.</strong></p></blockquote><p>This blog is not about software, but pay attention to what Seth has written for points 3 and 4 and notice how similar it is to what we need as software engineers.</p><p>Next, pay attention to the last sentence I&#8217;ve emphasised in the excerpt. Seth implicitly suggests that many of us don&#8217;t spend enough time defining a spec, and I agree. From the misunderstood waterfall model to the misunderstood Agile, we have gone from 100% to 0% in defining specifications. The waterfall model describes distinct activities before code: requirement (spec), analysis, and design. Many of us don&#8217;t do these activities anymore after the transition to Agile.</p><p>Vaughn Vernon, the author of <em>DDD Distilled</em>, observed a similar experience called &#8220;the taskboard shuffle&#8221;. The taskboard shuffle happens when the entirety of the team&#8217;s design process is to move a sticky note from the &#8220;To Do&#8221; column to the &#8220;In Progress&#8221; column, which is equal to nonexistent.</p><p>While product manager may contribute to specifications, often their focus is at a broader system level. When you break the system down into smaller elements, who is going to spec the component level if not us software engineers?</p><h2>Why don&#8217;t we spec?</h2><p>I delved deeper into the idea of spec-first thinking as a means to make TDD more intuitive. Therefore, it&#8217;s essential to understand and address the reservations many engineers might have around thinking or writing about spec. Why might some shy away from the spec-first approach, even when its benefits are clear? Five reasons:</p><ol><li><p>Spec is perceived as optional.</p><p>Some of us have survived so far in our career without thinking in spec. In my experience, we survive because someone else pays for the cost down the line. There is a misalignment of incentives.</p></li><li><p>Spec is perceived as a new skill.</p><p>Like any new skill or methodology, spec-first thinking may come with a learning curve. Those already adept at their current method might hesitate to feel like novices again.</p></li><li><p>Spec is perceived harder than code.</p><p>Even after you have acquired the necessary skills for it, you might still have the bias to do what&#8217;s easier i.e. code. This is related to the idea of task aversion, which I wrote previously here: <a href="https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias">Task Aversion and Confirmation Bias</a>.</p></li><li><p>Spec is perceived as bureaucratic.</p><p>Some may view thinking in spec as an additional layer of bureaucracy to the development process, slowing down the joy of coding. This could be related to the misunderstanding of being Agile.</p></li><li><p>Spec is perceived as unknown or uncertain.</p><p>There are works where we can&#8217;t really define the spec upfront unless we muddle through the code. The resulting code becomes the spec (spec comes last).</p></li></ol><p>In recognising these reasons, hopefully, we can address the underlying factors that might deter us from incorporating spec-first thinking and, finally, TDD in our workflow.</p><p>I believe the fifth reason causes a significant misunderstanding of TDD as some treat TDD as a one-size-fits-all approach. In such a scenario, does thinking in spec-first make sense? What do you think?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking/comments"><span>Leave a comment</span></a></p><h2>Conclusion</h2><p>I&#8217;ve described why thinking spec-first could be more intuitive than test-first. Even though it&#8217;s more intuitive to think about it this way, we shouldn&#8217;t forget that we still have to do it. Knowing is not enough.</p><p>In my following essay on this series, I may tackle why TDD is not a one-size-fits-all approach so that we understand when it is applicable. It&#8217;s a difficult one to write. Stay tuned.</p><p>P.S. Apologies for the sound of my washing machine in the voiceover recording.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/tdd-made-intuitive-spec-first-thinking?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[TDD is unintuitive. Does it matter?]]></title><description><![CDATA[How our intuition may not be as reliable as it seems.]]></description><link>https://read.ceilfors.com/p/tdd-is-unintuitive</link><guid isPermaLink="false">https://read.ceilfors.com/p/tdd-is-unintuitive</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 29 Sep 2023 08:27:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uRwJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.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_!uRwJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uRwJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!uRwJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!uRwJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!uRwJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uRwJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png" width="1312" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1957455,&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_!uRwJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!uRwJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!uRwJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!uRwJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5070f7cc-2a88-40b2-b564-a2baa2f7c165_1312x928.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><em>Welcome to the latest issue of my <a href="https://read.ceilfors.com/t/test-first-vs-last">newsletter series</a>, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/test-first-vs-last-introduction">introduction post</a>.</em></p><div><hr></div><p>Test-Driven Development (TDD) is often rejected due to its perceived unintuitiveness. Given the seemingly unintuitive nature of TDD, some people have seen me as unethical, manipulative, or forceful in writing about TDD&#8217;s benefits. While I question being labelled as unethical, manipulative, or forceful, I do agree that TDD is unintuitive.</p><p>In this essay, I&#8217;ll explain why TDD may feel unintuitive, and concurrently, challenge the reliability of our intuition.</p><h2>Tests are intuitively after the fact</h2><p>We don&#8217;t have to look far to understand why TDD is unintuitive. Tests are traditionally conducted after the fact, and we would intuitively understand this. If there&#8217;s no code has been written, what is there to test?</p><p>The idea of test to be after the fact is simple enough for even young children to grasp. They are tested, once they have studied. They got tested for an illness, once there&#8217;s a symptom for it. They can test a dish, once it&#8217;s started cooking. Testing, always comes last, not first!</p><p>Intuition serves as our subconscious navigator, built from our past experience and knowledge, allowing us to interact with our environment without conscious reasoning. We don&#8217;t need conscious reasoning to realize that testing has traditionally come last.</p><p>However, TDD challenges this traditional sequence. If it&#8217;s seemingly unnatural or unintuitive, does that inherently make TDD an ineffective technique?</p><h2>Unintuitive? Does not make it wrong</h2><p>The foundational argument against TDD here seems to be its lack of intuitiveness, concluding that what is unintuitive is not effective. If there&#8217;s a more intuitive way of doing things, why change?</p><p>Observing the daily routines of my 7-year-old, it&#8217;s evident that not all effective practices are intuitive. Would she grow up to brush her teeth regularly, naturally, by her intuition? This habit is not instinctively formed. It&#8217;s been cultivated and reinforced.</p><p>Similarly, the notion of the Earth being spherical is not immediately intuitive. How does our Earth look like the Blue Marble (a picture only taken 50 years ago)? To our ancestors, and to anyone climbing high, the world appears flat, contradicting the actual spherical model.</p><p>Another example is riding a bicycle. It&#8217;s widely appreciated, but it&#8217;s not something one can intuitively do. It requires learning and practice. It appears that not everything unintuitive is inherently disadvantageous.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>Fosbury&#8217;s unintuitive gold medal</h2><p>TDD is unintuitive as it needs us to reorder our work sequence. This simple alteration can yield superior results, analogous to Dick Fosbury&#8217;s revolutionary high jump technique.</p><p>The aim of the high jump is straightforward: to leap as high as possible without knocking the bar over. Before Fosbury, athletes embraced techniques that had them facing down and leading with their legs. Fosbury, however, flipped this traditional technique by facing up and leading with his head.</p><p>The initial scepticism around his technique, due to its unintuitiveness, diminished when he won the Olympic gold medal in 1968. This unintuitive technique, the Fosbury Flop, is now becoming the norm.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aplc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aplc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aplc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aplc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aplc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aplc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg" width="442" height="320.9985815602837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1410,&quot;resizeWidth&quot;:442,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image" title="Image" srcset="https://substackcdn.com/image/fetch/$s_!aplc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aplc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aplc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aplc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5736c86-ca69-43a6-8f1e-292c4140aee0_1410x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The top search results for &#8220;high jump&#8221; show the Fosbury Flop</figcaption></figure></div><p>The Fosbury Flop circumvents our biological limit by shifting our centre of gravity, allowing us to jump higher with the same amount of force. I believe that we can apply the same principle to knowledge workers, and one technique that we have uncovered is TDD.</p><p><em>What biological limits are we circumventing in TDD? Read the essays in this series and <a href="https://read.ceilfors.com/p/tdd-productivity">Why TDD Enhances Developer Productivity</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>The illusion of intuition</h2><p>The daily routines, understanding of the Earth, and sports exemplify how unreliable our intuition is. Comparing these examples, one major difference in developing software is how much more involved our minds are. Could intuition be more reliable, perhaps in our line of work?</p><p><em>The Invisible Gorilla</em>, a book by Chabris and Simons, argues against the excessive reliance on intuition, highlighting the numerous biases and limitations inherent in human cognition. One illusion discussed in the book is the illusion of attention, which I observe to be affecting us software engineers to overlook our work.</p><p>To understand this illusion, watch the following video and follow its instructions.</p><div id="youtube2-vJG698U2Mvo" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vJG698U2Mvo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/vJG698U2Mvo?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Did you watch the video? In the original study, 50% of participants did not report seeing the gorilla. If you did watch the video, I bet you noticed the gorilla, that&#8217;s because you expected some sort of an illusion when you watched it!</p><p>As software engineers, our minds constantly fall prey to this illusion. We can&#8217;t notice the gorillas in our work. We tend not to notice things that we don&#8217;t expect, here are a few examples from <a href="https://read.ceilfors.com/t/test-first-vs-last">this series</a>:</p><ul><li><p>We don&#8217;t expect <a href="https://read.ceilfors.com/p/test-first-vs-last-false-positive">false positive test results</a></p></li><li><p>We don&#8217;t expect <a href="https://read.ceilfors.com/p/test-first-vs-last-mere-exposure">tickets to be that complicated</a></p></li></ul><p>Software engineering is not the only profession that&#8217;s affected by the illusion of attention. In the healthcare industry, even experienced doctors can misdiagnose an illness. Similar to TDD, a structured approach, such as having a checklist, has been proven effective in improving patient care.</p><p>One might wonder why Dr. Atul Gawande chose to write the book <em>Checklist Manifesto</em>. My guess? Checklists are unintuitive.</p><h2>Conclusion</h2><p>TDD, while seemingly unintuitive, doesn&#8217;t mean it&#8217;s a technique to be dismissed. Numerous examples illustrate how unintuitive methods can prove effective. TDD effectiveness is independent of its unintuitiveness.</p><p>In my subsequent essay, I&#8217;ll propose how to make TDD more intuitive for us software engineers. Stay tuned.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/tdd-is-unintuitive?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/tdd-is-unintuitive?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/tdd-is-unintuitive?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Test First vs Last: Disappearing Rewards and Present Bias]]></title><description><![CDATA[Exploring how present bias and reduced rewards impact the test-last approach]]></description><link>https://read.ceilfors.com/p/test-first-vs-last-rewards-and-present-bias</link><guid isPermaLink="false">https://read.ceilfors.com/p/test-first-vs-last-rewards-and-present-bias</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 22 Sep 2023 07:59:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h33o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.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_!h33o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h33o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!h33o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!h33o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!h33o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h33o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png" width="1312" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1472208,&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_!h33o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!h33o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!h33o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!h33o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0bbbfab-8b00-4ee9-9a7e-85fa2cb57bb7_1312x928.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><em>This is the latest issue of my <a href="https://read.ceilfors.com/t/test-first-vs-last">newsletter series</a>, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/test-first-vs-last-introduction">introduction post</a>.</em></p><div><hr></div><p>In my previous essay, <a href="https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias">Task Aversion and Confirmation Bias</a>, I wrote about how I may experience aversion when writing tests:</p><blockquote><p>After all, I&#8217;m done with the change, why bother writing tests? Suddenly, when I saw the written code, I felt it was hard to write tests. Maybe it&#8217;s not worth the effort. Oh, and that test framework I haven&#8217;t learned properly, it will be tough writing the test. I&#8217;m experiencing task aversion.</p></blockquote><p>The aversion could come from many reasons, but aversion is not the only reason I might not write my test when I use the test-last approach. I&#8217;ll take an excerpt from Cecilie Vennevik&#8217;s blog post, <a href="https://www.cvennevik.no/post/a-corner-cutters-confession/">A corner-cutter&#8217;s confession</a>, as she brilliantly describes her experience (emphasis mine):</p><blockquote><p>And yes, yes, I didn&#8217;t write any tests first. I know it would have made my work easier, and refactoring less error-prone. And it would have helped me out in the design process. But I knew what I needed to do (mostly)! And I could just boot up the app and test it manually - it was familiar and convenient!</p><p>What&#8217;s that? Did I write any tests after, then? Oh, no, I didn&#8217;t do that either. <strong>I&#8217;d, uh, already tested all the use cases manually by the time I finished. It felt like a waste of time not to merge the work and move on.</strong> Yes, I have no cheap way of catching regressions now, I know, I know. Can we move on?</p><p>Because there&#8217;s so much to move on to. I can&#8217;t afford to feel like I&#8217;m slow. <strong>There&#8217;s so many more things to do! Important things!</strong> Features! Stories! Bugs!&nbsp;<em>Pull requests!</em>&nbsp;The board is so long and the days are so short and&nbsp;<em>I need to do my part</em>.</p></blockquote><h2>Test-last may induce present bias</h2><p>I have a higher probability of not writing a test when I practise the test-last approach too, just like what&#8217;s been illustrated in the excerpt. You might think what Cecilie or I would do to be lazy, but I prefer to make an argument that we&#8217;re delivering more value if we skip tests. The present bias influences us. </p><p>Present bias is our tendency to overvalue immediate rewards and undervalue long-term consequences. We tend to choose what we can do now that rewards us immediately rather than what can give us a larger reward in the future.</p><p>When it comes to writing a test, there are two types of rewards that you can get:</p><ol><li><p>Instant reward - You know your change satisfies the expected behaviours</p></li><li><p>Delayed reward - You know your change breaks the existing behaviours</p></li></ol><p>When I practice the test-last approach, I tend to test my change manually. This manual test will make the instant reward disappear because I understand that my change is working. This is not only happening for frontend development but also valid for backend development, where I would pull up an API client, like Postman, to test my changes.</p><p>Could the delayed reward be a good reason to write the test last? I&#8217;m not sure. My job as a software engineer is to deliver value to my customers, and that value can now be delivered because my change is done. Given the options to work on new features or write tests? I choose to work on new features!</p><p>The delayed reward of writing a test, to know that my <strong>future</strong> change may break an existing behaviour, regardless of how large the reward is, is seemingly small now compared to delivering a new feature.</p><p>To battle the present bias, you must draw rigour and discipline in your work. The leadership team may mandate that you write a test, therefore, it&#8217;s part of your performance goal, giving you an extrinsic reward. I&#8217;ll dread writing the test even more, as extrinsic rewards do not drive me.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>Test-first rewards by design</h2><p>When I practice the test-first approach (or TDD), I&#8217;m incentivised with the instant reward, writing my test so that I know my change satisfies the expected behaviour. Call me cheap, but I feel joy seeing my test turning green. It&#8217;s incredibly rewarding. It&#8217;s possibly the same kind of instant reward I get when I do manual tests in the test-last approach.</p><p>The delayed reward comes automatically in the test-first approach. Given that you have written the test, that will also benefit you in the future. Win-win.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QaFS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QaFS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 424w, https://substackcdn.com/image/fetch/$s_!QaFS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 848w, https://substackcdn.com/image/fetch/$s_!QaFS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 1272w, https://substackcdn.com/image/fetch/$s_!QaFS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QaFS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png" width="1456" height="1488" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1488,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:454865,&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_!QaFS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 424w, https://substackcdn.com/image/fetch/$s_!QaFS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 848w, https://substackcdn.com/image/fetch/$s_!QaFS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.png 1272w, https://substackcdn.com/image/fetch/$s_!QaFS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e3f0cd9-ebab-4445-92a1-b3c72fe9dc7c_1470x1502.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></p><h2>Conclusion</h2><p>When practising the test-last approach, the incentive from the intrinsic rewards perspective seems to disappear. Practice the test-first approach, and you may feel more rewarded when writing the test, both instantly and in the long run.</p><p>So far, in this series, I seem to have a strong bias towards the test-first approach regardless of how objective I tried to be, and I&#8217;m not happy with that. In the next essay, I&#8217;ll focus on one downside of the test-first approach.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-rewards-and-present-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-rewards-and-present-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-rewards-and-present-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Test First vs Last: Task Aversion and Confirmation Bias]]></title><description><![CDATA[How the sequence of writing tests may reduce the impact of confirmation bias.]]></description><link>https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias</link><guid isPermaLink="false">https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Wed, 13 Sep 2023 12:20:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fdIS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.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_!fdIS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fdIS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!fdIS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!fdIS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!fdIS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fdIS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png" width="1312" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1294564,&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_!fdIS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 424w, https://substackcdn.com/image/fetch/$s_!fdIS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 848w, https://substackcdn.com/image/fetch/$s_!fdIS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.png 1272w, https://substackcdn.com/image/fetch/$s_!fdIS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69f7fe26-c56a-4ae9-bbb6-4690b11bfd01_1312x928.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><em>This is the latest issue of my <a href="https://read.ceilfors.com/t/test-first-vs-last">newsletter series</a>, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/test-first-vs-last-introduction">introduction post</a>.</em></p><div><hr></div><p><em>Apologies for the inactivity, as I&#8217;ve been away for the summer holiday to spend more time with my family. I suspect that I&#8217;ll be pretty busy in the upcoming weeks. Therefore, your support will help me commit to my writing!</em></p><p>In my previous essay of this series, the <a href="https://read.ceilfors.com/p/test-first-vs-last-mere-exposure">Mere-Exposure Effect</a>, I wrote about how practising the test-first approach encourages me to pause, then makes me more deliberate on the subsequent steps. When I practise test-last, though, I don&#8217;t pause, and the test I wrote didn&#8217;t discover a bug. Why is that happening? In this essay, we&#8217;ll explore why the test-last approach often leads to less effective testing due to task aversion and confirmation bias.</p><h2>Four aversive scenarios</h2><p>My job as a software engineer is to deliver value to my customers, and this is primarily done by shipping changes. When I write tests last, the test I&#8217;m writing feels like a chore. If what I&#8217;m changing has been tested manually, I&#8217;ll probably dread writing the tests even more.</p><p>After all, I&#8217;m done with the change, why bother writing tests? Suddenly, when I saw the written code, I felt it was hard to write tests. Maybe it&#8217;s not worth the effort. Oh, and that test framework I haven&#8217;t learned properly, it will be tough writing the test. I&#8217;m experiencing task aversion.</p><p>Typically, four scenarios may happen in my mind:</p><ol><li><p>Experience aversion &#8594; Write superficial test &#8594; Ship code</p></li><li><p>Experience aversion &#8594; Write test &#8594; Threatened by red tests &#8594; Revert to scenario 3 or persevere</p></li><li><p>Experience aversion &#8594; Skip writing test &#8594; Ship code</p></li><li><p>Experience aversion &#8594; Write test &#8594; Ship code</p></li></ol><p>When I write the test last, I mostly fall under the scenario of 1, 2, or 3. In the subsequent sections, I&#8217;ll explain some of the terms I&#8217;ve used here.</p><p>If you feel that 100% of your time you get to scenario 4 without any bugs after you ship, this essay is not for you. If you&#8217;re a mere mortal like me, though, let&#8217;s carry on.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>Confirmation bias</h2><blockquote><p>Scenario 1: Experience aversion &#8594; Write superficial test &#8594; Ship code</p></blockquote><p>What I mean by a superficial test is the kind of test that covers the current behaviour instead of the expected behaviour. Given my aversion, I must rush and ship, and my biases take over. Under the influence of confirmation bias, my tests affirm that the code executes as I initially programmed it, ignoring whether or not the application satisfies user needs or handles edge cases effectively.</p><p>Confirmation bias is a type of cognitive bias where there is a tendency for people to find information to confirm their preconceptions. My preconception when I write the test last is that my code works. Therefore, my bias will lead me to write a test to cover that behaviour.</p><p>It&#8217;s an odd experience. The moment I have written my code, the code becomes my new expected behaviour, overriding what I had in my mind before I wrote my code.</p><p>Being aware that we have confirmation bias in all of us is a good first step in tackling this issue. We can deliberately spend time writing the tests and make sure we think about the expected behaviour&#8212;no more superficial tests.</p><p>Unfortunately, though, this is not the end of the problem caused by confirmation bias.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>Red tests become a threat</h2><blockquote><p>Scenario 2: Experience aversion &#8594; Write test &#8594; Threatened by red tests &#8594; Revert to scenario 3 or persevere</p></blockquote><p>I&#8217;m done with the code, pushed through my aversion, and now am writing the test rigorously, with the awareness of confirmation bias. This is the last mile of what I&#8217;m trying to deliver. I can see the end of the tunnel.</p><p>I wrote how I expected the code to behave&#8230; Oops, my tests are red. This is not what I expected, and I expected my code to work (confirmation bias at play). This can&#8217;t be my code.</p><p>These red tests are threatening my glory! A frustration and a conflict of interest began to crop up in my mind. Is this test worth writing? I&#8217;m feeling impatient. I expect to ship the change today, and I&#8217;ve told my team about this!</p><p>Sometimes, when this happens, I will revert to scenario 3, where I skip writing the test altogether. Sometimes, I persevere with rationality and a sense of identity and complete my work properly. When this happens, I write the test with a sense of rush and displeasure.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>We all have confirmation bias</h2><p>The feeling of threat comes from the conflict of information I perceive; my code works ready to be shipped, but the tests show otherwise. The sense of threat doesn&#8217;t only happen to software engineers because confirmation bias can occur to everyone.</p><p>Scientists, like anyone else, can feel threatened by information or results that contradict their expectations or existing work. A lot of emotional and intellectual investment has gone into scientific research, and negative evidence that contradicts their existing hypothesis can feel like a personal failure, which is further intensified by time pressure and limited funding.</p><p>Even the best thinkers experience confirmation bias. What sets them apart is their awareness of this bias and having strategies to combat it. Charles Darwin, for example, had a &#8220;golden rule&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> to actively note any information contradicting his current beliefs. This strategy requires a significant amount of discipline.</p><p>While this kind of discipline works, it requires much mental effort to persevere. What I&#8217;m interested in more is to have a system, a workflow, that can help me battle this bias without much mental effort.</p><p>If writing tests, an activity supposed to help us deliver software better, is becoming a threat to our work, it&#8217;s a sign that we have an ineffective approach to work.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>Reversing the sequence</h2><p>What I&#8217;ve found to be effective in tackling confirmation bias is simply reversing the sequence: writing test first.</p><p>It&#8217;s worth noting that I still experience task aversion when I take the test-first approach, even after decades of practising TDD. But once I get past the initial reluctance, the rest of the development becomes smoother.</p><p>I don&#8217;t experience the sense of conflict between getting things shipped and ensuring that tests are written. That&#8217;s because I know I haven&#8217;t delivered the expected value, the application code has not been written yet. It&#8217;s clear that there are still more things that I have to do. In contrast to the test-last approach, skipping the test or writing a superficial test is not a strong option on the table.</p><p>When I write a list of pending tests first, I also have a better expectation of what&#8217;s left in my work. As I began to write a test, more scenarios occurred in my head, and I started writing more of the pending tests.</p><p>And lastly, when I write tests first, the feeling of threat associated with failing tests is significantly decreased. I don&#8217;t see failing tests as conflicting information, given that I expect to see failing tests in the test-first approach. Red tests are happening by design.</p><h2>Conclusion</h2><p>As a software engineer, there are two points where confirmation bias will impact our work:</p><ol><li><p>Tests do not reflect the expected behaviour, but how the code currently behaves.</p></li><li><p>Failing test results are perceived as a threat to progress.</p></li></ol><p>Even the best thinkers experience confirmation bias. Therefore, we need to be aware and have an approach to tackle this bias. When tackling this bias with the test-last approach, you will require discipline and be ready to set your expectations when the test turns red.</p><p>Adopting the test-first approach, on the other hand, reduces the cognitive load and minimises the negative impact of confirmation bias, making it a more effective approach.</p><p>Up next: I&#8217;ll cover how the reward mechanism differs when we write test first vs last and how it affects us. Subscribe so it lands in your inbox.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-aversion-confirmation-bias?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><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>Charles Darwin&#8217;s golden rule: <a href="https://www.goodreads.com/quotes/177586-i-had-also-during-many-years-followed-a-golden-rule">Goodreads quote</a>.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Test First vs Last: Mere-exposure effect]]></title><description><![CDATA[How the sequence of writing tests affects our understanding of what should be built.]]></description><link>https://read.ceilfors.com/p/test-first-vs-last-mere-exposure</link><guid isPermaLink="false">https://read.ceilfors.com/p/test-first-vs-last-mere-exposure</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Wed, 02 Aug 2023 08:10:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!N5zo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_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_!N5zo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N5zo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!N5zo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!N5zo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!N5zo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N5zo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/684f468c-e4de-441b-890d-dd84e516c3f4_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;:2163448,&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_!N5zo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!N5zo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!N5zo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!N5zo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684f468c-e4de-441b-890d-dd84e516c3f4_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 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><em>This is the latest issue of my <a href="https://read.ceilfors.com/t/test-first-vs-last">newsletter series</a>, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/test-first-vs-last-introduction">introduction post</a>.</em></p><div><hr></div><p>My product manager reached out to me and told me that what I shipped was not what he had in mind. &#8220;What are you doing, Wisen? It seems like you didn&#8217;t read the ticket. I have written a lot there!&#8221;</p><h2>The day before</h2><p>Let&#8217;s transport ourselves to the day when I pick up the ticket. I picked up the ticket and looked at it:</p><blockquote><p>Title: Play next song if current song fails<br>Description: [&#8230; Lengthy description &#8230;]</p></blockquote><p>Simple, I thought. This is just a try-catch issue, and I don&#8217;t have to read the description. I quickly checked the code I&#8217;ve worked with before, yes, there&#8217;s a missing try-catch. I wrote the following code, added the test, and shipped it.</p><pre><code><code>try {
  playSong()
} catch (e) {
  playNext()
}</code></code></pre><p>Once the feature is shipped, users on a slow network keep moving to the next songs in their playlists indefinitely. I introduced a bug. I later discovered a separate error handling where the change should have been made. (Yes, pull requests, desk checks, and all the other processes could have caught this, but that&#8217;s not the point of this essay).</p><p>I didn&#8217;t read the ticket thoroughly, and I didn&#8217;t investigate the code. Rather than deliberately trying to understand what this ticket was all about, I jumped to a conclusion on what needed to be shipped based on what I was familiar with.</p><p>This situation is a classic example of how the mere-exposure effect affects a developer, leading us to prefer things just because they&#8217;re familiar. Let me explain quickly what this cognitive bias is about and how writing tests first can counteract this bias.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>Mistaking familiarity for understanding</h2><p>I&#8217;ll give you one simple way to know if you have experienced the mere-exposure effect in knowledge work. Think about the time when you have finished reading a non-fiction book. You nod along when you read it, thinking that you understand what you&#8217;re reading.</p><p>You later meet a friend and have a conversation.</p><p>&#8220;I just finished reading that book, and it&#8217;s so interesting.&#8221;<br>&#8221;Oh great. What have you learnt from it?"<br>&#8221;Hmmm&#8230; Err&#8230; Ahh&#8230;&#8221;</p><p>You were taken aback. You don&#8217;t seem to remember anything. You uttered two sentences. What else? Nothing. You thought you understood this book well.</p><p>You go back home, re-read the book, and you nod along again. You&#8217;re familiar with the topic, you feel like you know it, but you don&#8217;t. You mistake familiarity for understanding.</p><p>Just like reading a book, in software development, it's also possible to mistake familiarity with understanding.</p><h2>Elaboration tests your understanding</h2><p>The best way to distinguish familiarity and understanding is elaboration. Elaboration takes effort. This is why you were taken aback when your friend asked about that book. Your mental resources worked hard to answer what you learned from that book.</p><p>This is the process of elaboration. It&#8217;s slow and takes time, but it helps you test if you truly understand. Verbal conversation is one way to elaborate. Writing is another form of elaboration.</p><p>In software, writing tests is a good way to test your understanding.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>Writing tests is a form of elaboration</h2><p>Let&#8217;s replay the day I picked up the ticket, but this time I&#8217;m writing the test first.</p><p>I picked up the ticket. I thought, okay, just a try-catch issue. Easy. I start writing the test.</p><pre><code><code>it("plays the next song when ...</code></code></pre><p>When what? What kind of error should I throw in the test? Hang on, why am I writing a new test file? Maybe there&#8217;s a test that has already been written elsewhere? Is this the right place to test this thing?</p><p>I paused briefly because I had to elaborate on what I was about to test. This led me to re-read the ticket again and double-check if this was the right place to make a change. I broke my familiarity barrier and began seeking more understanding.</p><h2>Conclusion</h2><p>When writing tests last, we are more prone to the mere-exposure effect. This means we tend to build something and make changes in places we&#8217;re familiar with. Elaboration helps us reduce this effect of familiarity, leading us to ship better software.</p><p>Writing test first helps us elaborate, but elaboration itself is not foolproof. For example, you may go through the process of summarising a book you&#8217;ve read as a form of elaboration, but it doesn&#8217;t necessarily mean you will reach the right conclusion.</p><p>While the test-first approach is not a foolproof solution, resequencing our steps is a cheap way to mitigate this bias, making us less prone to the mere-exposure effect.</p><p>Yes, writing test helps us elaborate, but when I wrote the test last at the top of this essay, I didn&#8217;t have that brief pause of questioning what I was doing. Why does this happen? There&#8217;s another bias at play. I&#8217;ll cover that in the next post of this series.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-mere-exposure?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-mere-exposure?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-mere-exposure?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Stop flipping around, put them side-by-side]]></title><description><![CDATA[Pause and organise your screen estate to reduce your cognitive load.]]></description><link>https://read.ceilfors.com/p/stop-flipping-around-put-them-side</link><guid isPermaLink="false">https://read.ceilfors.com/p/stop-flipping-around-put-them-side</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Fri, 21 Jul 2023 16:06:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the bad habits I&#8217;ve been debating with my colleagues for years is how engineers flip their windows around when they work. They disagreed that I called this a bad habit, and I couldn&#8217;t articulate why this was bad for years. Recently I dove deeper into cognitive psychology, and I&#8217;ll try to articulate the reasons that way.</p><p>First, I&#8217;ll explain what I mean by flipping around, then why it isn&#8217;t good, propose an alternative, and end with some practical tips on what app to use.</p><h1>The flippant flipping</h1><p>To fully understand the issue, let&#8217;s first look at what I mean by flipping around. This gif illustrates creating an object in TypeScript based on Stripe&#8217;s documentation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZWsP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZWsP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 424w, https://substackcdn.com/image/fetch/$s_!ZWsP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 848w, https://substackcdn.com/image/fetch/$s_!ZWsP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 1272w, https://substackcdn.com/image/fetch/$s_!ZWsP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZWsP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif" width="1117" height="672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:672,&quot;width&quot;:1117,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216564,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&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_!ZWsP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 424w, https://substackcdn.com/image/fetch/$s_!ZWsP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 848w, https://substackcdn.com/image/fetch/$s_!ZWsP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 1272w, https://substackcdn.com/image/fetch/$s_!ZWsP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c681b61-89fc-42fb-84d0-da560b10c907_1117x672.gif 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>This habit of flipping windows around is not such a problem if you do it for a single window once or twice. The problem is when you&#8217;re doing it fairly frequently in your workflow. This is why I use the word flip, not switch or cycle. You&#8217;re literally flipping, very frequently, sometimes struggling to find the windows that you&#8217;re looking for. I also like this word because it reminds me of the word flippant; this habit seems clever and fast (it&#8217;s not).</p><p>Well, I see that some of you are giving me a tsk-tsk, creating an object structure based on documentation is so simple, you could have copy pasted that. This problem is not limited to object structure, some other examples:</p><ol><li><p>Flipping test code and production code when coding.</p></li><li><p>Flipping Figma and browser and CSS files when changing UIs.</p></li><li><p>Flipping IDE and terminal when running tests.</p></li><li><p>Flipping between existing code and currently written code for inspiration or examples.</p></li><li><p>Flipping between the issue tracker and test file when writing tests.</p></li></ol><p>Yes, what&#8217;s being flipped around is not limited to windows. You may flip tabs around in your IDE or the browser. You could also flip desktops, for example, in MacOS.</p><p>Addressing this simple habit seems difficult, yet I notice how it affects developer productivity. Whenever I watch someone doing this, it&#8217;s like watching someone trying to pull out the tablecloth fast without sending glasses flying, and every time I see those glasses shatter into pieces, just like their thoughts.</p><p>You may have a good reason to flip around if you have a small screen estate like a 13&#8221; monitor. But the problem is I frequently see engineers with big or dual monitors doing the same thing. We probably carry this habit because we&#8217;re used to flipping around smartphone apps? Nevertheless, we should utilise the available screen estate that we have.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h1>Self-inflicted cognitive load</h1><p>Now, let&#8217;s delve into the cognitive psychology behind this flippant flipping and why it burdens our heads. When you zoom in on this flipping phenomenon, you&#8217;ll realise that you&#8217;re rehearsing, trying to remember what you&#8217;re seeing, as if what you'll see will soon disappear. Think about the situation when someone handed you their phone number, you don&#8217;t have a notepad, and you attempt to remember that phone number, that&#8217;s rehearsing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!srQ9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!srQ9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 424w, https://substackcdn.com/image/fetch/$s_!srQ9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 848w, https://substackcdn.com/image/fetch/$s_!srQ9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 1272w, https://substackcdn.com/image/fetch/$s_!srQ9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!srQ9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png" width="514" height="435.9240506329114" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1206,&quot;width&quot;:1422,&quot;resizeWidth&quot;:514,&quot;bytes&quot;:399174,&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_!srQ9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 424w, https://substackcdn.com/image/fetch/$s_!srQ9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 848w, https://substackcdn.com/image/fetch/$s_!srQ9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 1272w, https://substackcdn.com/image/fetch/$s_!srQ9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe4adac-09e8-439f-bab0-33db0e2bfbaa_1422x1206.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you are flipping around, you&#8217;re rehearsing unnecessarily, because these windows won&#8217;t disappear like the phone number scenario, as long as you put them side-by-side! We, developers, dislike being interrupted by others, yet, we&#8217;re interrupting ourselves by doing this.</p><p>We also know that we have a limited working memory capacity. I notice that when I accidentally fall into the flipping trap, it also consumes my working memory capacity. Given that I needed to rehearse and remember, suddenly, all the high-level context I had in my head was gone, overridden by the tiniest detail I needed to rehearse.</p><p>Creating a view of what you need doesn&#8217;t take that long either, and once you do it more, you can do it fast, especially with keyboard shortcuts (I&#8217;ll cover that in the last section).</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h1>Side-by-side, input and output</h1><p>This constant flipping is a self-inflicted cognitive load that reduces our productivity. Pay attention to what&#8217;s happening in your mind when you flip things around. What was the CSS property I was trying to modify? Flip&#8230; flip&#8230; What was that JSON structure look like again? Flip&#8230; flip&#8230; Is it similar to Figma now? Flip&#8230; flip&#8230; When you catch yourself doing this, stop. Put them side-by-side.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pzgU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pzgU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 424w, https://substackcdn.com/image/fetch/$s_!pzgU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 848w, https://substackcdn.com/image/fetch/$s_!pzgU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 1272w, https://substackcdn.com/image/fetch/$s_!pzgU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pzgU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png" width="1456" height="883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:883,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:806494,&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_!pzgU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 424w, https://substackcdn.com/image/fetch/$s_!pzgU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 848w, https://substackcdn.com/image/fetch/$s_!pzgU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.png 1272w, https://substackcdn.com/image/fetch/$s_!pzgU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175f3fba-5339-46b4-8136-d1c27e90d7bc_2000x1213.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>Many of the tasks we have as software engineer is crunching information from one medium to another. What I&#8217;d like you to try instead is to pause and make all the information you need to execute your task visible on your screen.</p><p>If you have one large monitor, organise your windows or tabs, and put them side-by-side. If you have two monitors, with the same principle, put them side-by-side, even if they&#8217;re on a different monitor. If you work with only one small monitor, you need more screen estate to work effectively. As Jeff Atwood said, <a href="https://blog.codinghorror.com/does-more-than-one-monitor-improve-productivity/">choose your own path to happiness</a>:</p><blockquote><p>Choose own your path to happiness, whether it's upgrading to a single 30" display, dual 24" widescreen displays, or three standard 20" displays. As long as it results in more usable desktop space, it's a clear win.</p></blockquote><p>With the idea that we engineers are crunching information from one medium to another, you can frame that our head is processing an input and spitting an output. Put the input windows on the left and the output windows on the right. It looks like this on my large monitor.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I8e6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I8e6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 424w, https://substackcdn.com/image/fetch/$s_!I8e6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 848w, https://substackcdn.com/image/fetch/$s_!I8e6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 1272w, https://substackcdn.com/image/fetch/$s_!I8e6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I8e6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png" width="432" height="528.4285714285714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1781,&quot;width&quot;:1456,&quot;resizeWidth&quot;:432,&quot;bytes&quot;:2776936,&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_!I8e6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 424w, https://substackcdn.com/image/fetch/$s_!I8e6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 848w, https://substackcdn.com/image/fetch/$s_!I8e6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 1272w, https://substackcdn.com/image/fetch/$s_!I8e6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda4294f-9c01-4e8a-9da9-97ec325aaff0_2000x2447.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When working with a smaller monitor like 16&#8221;, I can bear writing on the left-hand side, but on a bigger monitor, I&#8217;ll have to turn my neck, and it&#8217;s uncomfortable.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h1>Use keyboard shortcuts</h1><p>Organising your windows can be painful because it is quite a mouse-heavy operation.</p><p>The following assumes the setup I&#8217;m currently having, which is on MacOS, have a 27&#8221; monitor, and uses VS Code, but you can apply the same idea to your setup too.</p><p>MacOS has a <a href="https://support.apple.com/en-gb/HT204948">built-in feature to put apps side-by-side</a>. However, I found this feature too slow and distracting for my workflow. To organise my windows, I use <a href="https://rectangleapp.com/">Rectangle</a>. There are only a few shortcuts that I use:</p><ul><li><p>Left Half</p></li><li><p>Right Half</p></li><li><p>Center Half</p></li></ul><p>That&#8217;s good enough when I only have two windows to manage, and that&#8217;s only three shortcuts to remember. I recently started to have three windows to work, then I use First Third, Center Third, and Last Third shortcuts in Rectangle.</p><p>When I use VS Code, there are only four essential shortcuts to remember:</p><ul><li><p>Toggle Primary Side Bar Visibility (Cmd + B)</p></li><li><p>Toggle Terminal Visibility (Cmd + J)</p></li><li><p>Split Editor Right (Cmd + \)</p></li><li><p>Sometimes, I press Cmd+Shift+P, then type &#8220;Split down&#8221; to have even more interfaces on my screen.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h1>Try it out</h1><p>Once you've mastered your shortcuts, it's time to test how well you&#8217;re organising your screen! I find the most effective way to try this is by pair programming. When my pair flipped things around, I instantly got lost. I don&#8217;t know what my pair is looking at. At the same time, we work better when we spend 1 minute reorganising our screen, creating a view where all the needed information is on the screen. This also surprisingly helps us pair better when our remote pairing setup turns laggy.</p><p>The next time you notice yourself flipping things around rapidly, pause and put those windows or tabs side-by-side. It&#8217;s a small thing to do, it doesn&#8217;t take more than 1 minute, and you&#8217;ll save that 1 minute fast. Try it, and let me know your thoughts!</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/stop-flipping-around-put-them-side?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Test First vs Last: False Positive]]></title><description><![CDATA[How test results can deceive us and how the sequence of writing tests affects it.]]></description><link>https://read.ceilfors.com/p/test-first-vs-last-false-positive</link><guid isPermaLink="false">https://read.ceilfors.com/p/test-first-vs-last-false-positive</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Wed, 12 Jul 2023 09:39:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!thEP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_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_!thEP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!thEP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!thEP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!thEP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!thEP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!thEP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d32d1112-757e-4582-b76b-5bca010a66b3_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;:1504059,&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_!thEP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!thEP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!thEP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!thEP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd32d1112-757e-4582-b76b-5bca010a66b3_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 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><em>This is the latest issue of my <a href="https://read.ceilfors.com/t/test-first-vs-last">newsletter series</a>, &#8216;Test First vs Last&#8217;, where we&#8217;ll explore how the sequence of writing tests affects our minds. The full context of this series can be found in the <a href="https://read.ceilfors.com/p/test-first-vs-last-introduction">introduction post</a>.</em></p><div><hr></div><p>I picked up a small feature to work on. It seemed simple at first, so I started to write the code. After a few hours, the production code was ready.</p><p>Being diligent, I ensure to write a test for the feature:</p><pre><code><code>it("must return truthy", () =&gt; {
  expect(newFeat())
    .resolves
    .toBeTruthy()
})</code></code></pre><p>The test result is green, my code works! I pushed the change to the deployment pipeline, which also indicates green for the newly written test. I call it a day, satisfied with my work.</p><p>The next day, our support team reached out and told me that many users had started using this new feature, but it didn&#8217;t work at all! Wait, I tested this, didn&#8217;t I? The test was green.</p><h2>Two green reasons</h2><p>As I dug into the issue, I discovered the new feature was indeed broken, but why did the test not fail? Apparently, I had missed including the &#8216;<code>await</code>&#8216; operator. Once I added the operator, my test failed. I experienced a <strong>false positive</strong> test.</p><pre><code>it("must return truthy", () =&gt; {
  <strong>await</strong> expect(newFeat())
    .resolves
    .toBeTruthy()
})</code></pre><p>Reflecting on my false positive test experience, I realised that there are two potential reasons why a test might show &#8220;green&#8221;:</p><ol><li><p>The code is working</p></li><li><p>The test is incorrect (false positive)</p></li></ol><p>When I write my test last, I often expect the code to work and overlook the possibility of the test being incorrect, which gives me a false sense of security.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><h2>Narrowing down to one reason</h2><p>To eliminate the risk of false positives, it&#8217;s important to see the test fail. You need to see the test red. To see a red test, you have to deliberately introduce a bug to your code, therefore breaking it. The steps might look like this:</p><ol><li><p>Write code</p></li><li><p>Write tests (green)</p></li><li><p>Break the code to make tests red</p></li><li><p>Change the code back to green</p></li></ol><p>If you compare these steps against writing tests first, the production code doesn&#8217;t exist yet when you write your test. The absence of the production code removes the possibility of the &#8220;code is working&#8221; reason when you see a green passing test. This means if your test is green, the only possible explanation is &#8220;the test is incorrect&#8221;. The steps for the test-first approach therefore are shorter:</p><ol><li><p>Write failing tests (red)</p></li><li><p>Write minimal code (red)</p></li><li><p>Make the test pass (green)</p></li></ol><p><em>2023-07-13 Edit:</em> <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Krishna Kumar&quot;,&quot;id&quot;:19148355,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84f34bfa-2d4b-440c-86a6-c149b2206192_1400x1400.jpeg&quot;,&quot;uuid&quot;:&quot;75a2e0f4-8c1d-4ab8-9f79-a65d33de7206&quot;}" data-component-name="MentionToDOM"></span> <em>has raised an important point in the comment, do read that and join the discussion if you have thoughts. I added &#8220;Write minimal code&#8221; as a step for the test-first approach, as otherwise, you&#8217;ll get false positives even in the test-first approach with this example! The minimal code may look like this </em><code>const newFeat = async () =&gt; {};</code><em> I have also removed &#8220;Refactoring&#8221; as irrelevant in this post.</em></p><p>Although the &#8216;test last&#8217; approach involves more steps and can be inefficient, you can be pretty fast in executing these steps once you get used to it. However, the challenge lies in the potential for human error, especially forgetting to deliberately introduce a bug. When you forget these steps, you increase the risk of encountering false positives.</p><p>In contrast, the &#8216;test first&#8217; approach means you have fewer things to remember, as it automatically prompts you with a failing test first. Having fewer things to remember is beneficial for us engineers (see my other essay: <a href="https://read.ceilfors.com/p/remove-duplication-to-deliberately-forget">Remove duplication to deliberately forget</a>).</p><p>While you might assume that the likelihood of encountering a false positive is low, it&#8217;s important to remember that these false positives can significantly impact developer productivity.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/test-first-vs-last-false-positive?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/test-first-vs-last-false-positive?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><h2>The impact on productivity</h2><p>The three dimensions of the DevEx framework highlight what we can focus on to improve developer productivity<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>: cognitive load, flow state, and feedback loop. When I experience a false positive test, all these dimensions could be affected:</p><ol><li><p>Flow state: When our reality doesn&#8217;t match what we expect, we experience negative emotions and frustrations, which is the antithesis of the state of flow and feelings of joy. In reality, I have tested the feature and expected the feature to work.</p></li><li><p>Feedback loop: A feedback loop containing a false positive means I don&#8217;t actually have feedback from the test. In this example, my feedback loop was from the support team, not the test.</p></li><li><p>Cognitive load: When I hear from the support team, I might have moved on to a different task. The need for a sudden context switch can lead to an increased cognitive load.</p></li></ol><h2>Conclusion</h2><p>So what does all this mean for the &#8216;Test First vs Last&#8221;? As we&#8217;ve seen, choosing the test-first approach makes you less likely to forget to eliminate false positives, given that the production code has not been written yet. The test-first approach provides shorter steps to eliminate false positives. Reducing the likelihood of false positives is important as they can affect developer productivity.</p><p>While fixing the broken feature, my product manager reached out to me and told me that what&#8217;s been built was not what he had in mind. That&#8217;s frustrating! In my next post, I&#8217;ll cover how testing first vs last may affect this scenario.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Quantum Steps! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="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 DevEx framework: <a href="https://queue.acm.org/detail.cfm?id=3595878">the paper</a>.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Test First vs Last: Introduction]]></title><description><![CDATA[A psychological comparison of writing test first and last.]]></description><link>https://read.ceilfors.com/p/test-first-vs-last-introduction</link><guid isPermaLink="false">https://read.ceilfors.com/p/test-first-vs-last-introduction</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Thu, 06 Jul 2023 11:53:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qNAy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The two essays I've recently published on Test-Driven Development (TDD) prompt familiar questions:</p><ol><li><p>Why should I switch to writing tests first if I&#8217;m already writing tests last?</p></li><li><p>Do you always do TDD, even in your startup?</p></li></ol><p>This post introduces my experiment on publishing a series in this newsletter containing smaller, more digestible insights. If you have similar questions to the ones above, follow along. Hopefully, they&#8217;ll be answered at some point.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Quantum Steps! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What is being compared?</h2><p>What&#8217;s going to be compared in this series will be the reduced version of Test-Driven Development (TDD) and Test-Last Development (TLD). I&#8217;ll be focusing solely on the difference in the sequence of writing tests, despite TDD containing more principles. I&#8217;ve hinted previously that the sequence of steps matters more than you might think, as explained in <a href="https://read.ceilfors.com/p/making-a-nice-cup-of-tdd">Making a Nice Cup of TDD</a>, and I plan to delve even deeper. Because of this focus, I&#8217;ve intentionally chosen not to name the series &#8220;TDD vs TLD&#8221;. Besides, these two acronyms are hard to distinguish with one letter difference.</p><p>Ultimately, we&#8217;ll be comparing writing tests first and tests last. We&#8217;ll assume that in both methodologies, engineers will have the discipline to refactor after.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qNAy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qNAy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 424w, https://substackcdn.com/image/fetch/$s_!qNAy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 848w, https://substackcdn.com/image/fetch/$s_!qNAy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 1272w, https://substackcdn.com/image/fetch/$s_!qNAy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qNAy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png" width="1456" height="650" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:217966,&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_!qNAy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 424w, https://substackcdn.com/image/fetch/$s_!qNAy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 848w, https://substackcdn.com/image/fetch/$s_!qNAy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.png 1272w, https://substackcdn.com/image/fetch/$s_!qNAy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2dc9-5db4-4ecb-b703-2a40adc582d8_1850x826.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>What you should expect from this comparison will be less about the code, as that&#8217;s been covered very often. Rather, I&#8217;ll compare what&#8217;s happening in my mind - the psychological experience in practising these two techniques. This follows my previous theme of exploring our cognitive limits and the DevEx framework in my other essay, <a href="https://read.ceilfors.com/p/tdd-productivity">Why TDD Enhances Developer Productivity</a>.</p><p>Having said that, you may wonder if my views are entirely objective or if there&#8217;s a preference for one technique over the other.</p><h2>Will this series contain a bias towards TDD?</h2><p>Short answer: Possibly.</p><p>However, in more depth, I attempt to be as objective as possible. I&#8217;m not really interested in siding in a certain technique, I&#8217;m more interested in understanding what to practice, when, and why, but inevitably I may conclude that one is better than the other.</p><p>I can be objective in this comparison because I have practised both writing test first and test last. Most TDD practitioners I know have practised writing tests last too before they learned about TDD, and that&#8217;s how they started. Writing test last was the default for me too.</p><p>I also coach teams to practice TDD. Therefore, I can see what engineers are noticing when they write tests last. When the emotion hits them hard, I can see it. They share a similar experience as when I practice writing tests last.</p><p>These aspects should hopefully maintain my objectivity throughout the series, so stay tuned!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Why TDD Enhances Developer Productivity]]></title><description><![CDATA[An exploration through the lens of the DevEx framework and cognitive psychology.]]></description><link>https://read.ceilfors.com/p/tdd-productivity</link><guid isPermaLink="false">https://read.ceilfors.com/p/tdd-productivity</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Tue, 20 Jun 2023 12:07:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U8Fe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.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_!U8Fe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U8Fe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 424w, https://substackcdn.com/image/fetch/$s_!U8Fe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 848w, https://substackcdn.com/image/fetch/$s_!U8Fe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!U8Fe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U8Fe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png" width="1426" height="1428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1428,&quot;width&quot;:1426,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:639214,&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_!U8Fe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 424w, https://substackcdn.com/image/fetch/$s_!U8Fe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 848w, https://substackcdn.com/image/fetch/$s_!U8Fe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!U8Fe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42d0dc2a-49c6-46d4-b5eb-bbcfac039362_1426x1428.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>Test-Driven Development (TDD) is a design technique involving a specific sequence of steps: writing a failing test, implementing the simplest possible code, and refactoring the code. While TDD is often perceived as a design technique, I propose a new perspective: viewing TDD as a productivity tool. Practising TDD, I argue, will improve your productivity.</p><p>Before diving into how TDD enhances productivity, it&#8217;s crucial to understand what productivity entails for developers. The idea of how to measure developer productivity has often been misunderstood. Fortunately, Noda et al. recently <a href="https://queue.acm.org/detail.cfm?id=3595878">published a paper</a> that provides a new perspective on developer productivity. The team who publishes the paper includes experts on developer productivity, including Nicole Forsgren (co-author of Accelerate) and Margaret-Anne Storey (co-author of SPACE).</p><p>The paper includes the proposal of the DevEx framework, which outlines the three dimensions that affect developer productivity: feedback loops, cognitive load, and flow state. Instead of summarising their findings, I will take the excerpt from <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Abi Noda&quot;,&quot;id&quot;:98623269,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/52563aeb-f45b-4398-bd96-947897fc3d59_1806x1865.png&quot;,&quot;uuid&quot;:&quot;87bdc4b7-da4e-48df-9a6b-e0732da092bb&quot;}" data-component-name="MentionToDOM"></span> &#8216;s <a href="https://newsletter.abinoda.com/p/measuring-developer-productivity">newsletter post</a>, which succinctly explains these three dimensions:</p><blockquote><p>1. <strong>Feedback loops </strong>refer to the speed and quality of responses to actions performed. Fast feedback loops allow developers to complete their work quickly with minimal friction. Slow feedback loops, by contrast, interrupt the development process, leading to frustration and delays as developers wait or decide to switch tasks. Organizations should shorten feedback loops by identifying areas in which development tools can be accelerated (e.g. build and test processes, development environment setup), or human hand-off processes improved.&nbsp;</p><p>2. <strong>Cognitive load </strong>encompasses the amount of mental processing required for a developer to perform a task. When cognitive load remains high as a result of problems such as poorly documented code or systems, developers need to devote extra time and effort to complete tasks and avoid mistakes. To improve developer experience, teams and organizations should aim to reduce cognitive load by finding ways to eliminate unnecessary hurdles in the development process.&nbsp;</p><p>3. <strong>Flow state </strong>is a mental state in which a person performing an activity is fully immersed in a feeling of energized focus, full involvement, and enjoyment. Frequent experiences of flow state at work lead to higher productivity, innovation, and employee development. Similarly, studies have shown that developers who enjoy their work perform better and produce higher quality products. Teams and organizations should focus on creating the optimal conditions for flow state.</p></blockquote><p>The three dimensions of the DevEx framework highlight the areas organisation can focus on to improve developer productivity. However, the limitation of this study is its focus on organisational or team-level change, which is externally focused from the developer&#8217;s point of view. There&#8217;s room to have a more internally focused point of view, drawing what we can learn from these dimensions into our own individual productivity.</p><p>To manage these dimensions effectively from an individual level, we need to understand what limits us from an individual perspective. What limits individuals are the process that goes in our head, our cognitive limits. Understanding our cognitive limits is beneficial as it allows us to see why adopting TDD can be helpful.</p><p>I don&#8217;t use a hammer because it&#8217;s a great tool to drive nails. It&#8217;s because I can&#8217;t drive nails without a hammer. Similar to our minds, we require mental tools to drive our cognitive tasks. Without tools, we may not visibly bleed, but we may experience an unproductive day filled with frustrations.</p><p>Based on my experiences, these are the developer-centric way of summarising our cognitive limits, the three Ws:</p><ol><li><p><strong>Wit</strong></p><p>Our mind operates in two systems: System 1 for fast, automatic, emotional thoughts, and System 2 for slower, more deliberate thinking<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. Developers tend to use System 1 by mistake to make important decisions. As a result, their quick wittiness will create a clever solution that doesn&#8217;t solve a problem. These clever solutions will increase the cognitive load on our future selves and others, and slow down our feedback loop when others review our work.</p></li><li><p><strong>Working memory</strong></p><p>Our working memory typically has a limit of four<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, measured in chunks<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. Developers handle diverse tasks that demand complex thinking, such as user needs, programming language, architecture, refactoring, testing, etc. With our working memory limits, simultaneously thinking about all these thoughts is not feasible. For example, thinking about user needs and refactoring simultaneously will introduce an unnecessary cognitive load.</p></li><li><p><strong>Willpower</strong></p><p>We have limited willpower that we can use in a day. When you&#8217;re about to start coding, the feeling of dread may happen when you have run out of your willpower. The constant use of willpower eventually depletes it, leading us to the loss of joy or flow state.</p></li></ol><p>These cognitive limits are hindering the dimensions outlined by the DevEx framework. Given this understanding, it&#8217;s clear that we need a mental tool to help with our productivity. Think about it: Usain Bolt, the greatest sprinter of all time, is slower than a domestic cat but faster if riding a bicycle.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/p/tdd-productivity?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/p/tdd-productivity?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div><p>The mental tool that we need to circumvent our cognitive limits is workflow. I&#8217;m not talking about an organisational workflow like how we pass on work to others. Rather, it&#8217;s an individual&#8217;s workflow, the sequence of steps of work that you do.</p><p>You might be surprised to hear how an individual&#8217;s workflow can circumvent our cognitive limits, so let&#8217;s consider a real-world example highlighting the importance of an effective workflow: the story of Niklas Luhmann. Luhmann authored more than 70 books and 400 articles on various subjects. His secret was a unique workflow called Zettelkasten, which enabled him to organise and connect his thoughts effectively. The amount of writing he had written is not only a matter of quantity but of quality. His workflow has given him abnormally impressive productivity.</p><p>Do you know why his workflow, Zettelkasten, is not widely adopted? When he shared Zettelkasten, the world of writing thought it was too simplistic to be true to adopt. Unconvinced writers believe that great outcome requires great effort, or a complex problem requires a complex solution, which is untrue.</p><p>In software development, we often fall into a similar trap as those sceptical of Luhmann&#8217;s Zettelkasten. The process of TDD may seem overly simplistic. Yet, we often neglect that this seemingly simple approach can circumvent our cognitive limits:</p><ol><li><p><strong>TDD forms a positive feedback loop</strong></p><p>Each of the changes in the test from red to green represents a feedback loop. When the test passes, we know our implementation works. This short feedback loop allows us to observe a sign of progress. The regular and fast signals of the progress we get are the best kind of feedback because it motivates us to carry on working, forming a virtuous cycle, and reducing our reliance on our limited willpower. </p></li><li><p><strong>TDD manages cognitive load</strong></p><p>What&#8217;s the simplest way to make this failing test green? That&#8217;s the question we hold when we move from red to green. This question forces us to use System 2, the more deliberate mode of our thinking, therefore circumventing the use of our wittiness by mistake.</p><p></p><p>TDD&#8217;s Red &gt; Green &gt; Refactor structure helps us form a chunk of the diverse knowledge we need to use, allowing us to pull the right knowledge into our working memory at the right time. This helps us manage our cognitive load. See the illustration below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gv_H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gv_H!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 424w, https://substackcdn.com/image/fetch/$s_!Gv_H!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 848w, https://substackcdn.com/image/fetch/$s_!Gv_H!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 1272w, https://substackcdn.com/image/fetch/$s_!Gv_H!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gv_H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png" width="1456" height="926" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:926,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1969807,&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_!Gv_H!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 424w, https://substackcdn.com/image/fetch/$s_!Gv_H!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 848w, https://substackcdn.com/image/fetch/$s_!Gv_H!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.png 1272w, https://substackcdn.com/image/fetch/$s_!Gv_H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78ed0310-a9cf-4ac4-88ef-85d98516ac23_2910x1850.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></p></li><li><p><strong>TDD promotes flow state</strong></p><p>Two prerequisites to experience flow state are clear goals and immediate feedback<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>. Compared to having a big goal, such as having a feature in the hands of the customer, the immediacy of feedback by practising TDD, such as seeing green passing tests, help satisfy these prerequisites for us to experience flow.</p></li></ol><p>In conclusion, TDD is a powerful tool that circumvents our cognitive limits, improving all the DevEx dimensions of productivity. I hope future studies around TDD will look into its productivity element through these three dimensions and developers&#8217; subjective experience.</p><p>Although this essay focuses on improving individual productivity with TDD, it&#8217;s important to stress that improving developer productivity through an organisational lens should also be a key consideration. Improving one or the other is not mutually exclusive.</p><p><strong>If you like this post, you may like my series <a href="https://read.ceilfors.com/t/test-first-vs-last">Test First vs Last</a>, where I explore how the sequence of writing tests affects our minds.</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p><p>Special thanks to my friend, who prefers to keep his name hidden, for thoroughly reviewing and criticising this essay.</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>Dual systems theory: <a href="https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow#Two_systems">Two systems</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://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two#Other_cognitive_numeric_limits">Magical number four</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><a href="https://en.wikipedia.org/wiki/Chunking_(psychology)">Chunking</a></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://en.wikipedia.org/wiki/Flow_(psychology)#Components">Components to experience flow</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[Making a Nice Cup of TDD]]></title><description><![CDATA[Test-first, or tea-first? Is the sequence of steps within a task merely a matter of preference?]]></description><link>https://read.ceilfors.com/p/making-a-nice-cup-of-tdd</link><guid isPermaLink="false">https://read.ceilfors.com/p/making-a-nice-cup-of-tdd</guid><dc:creator><![CDATA[Wisen Tanasa]]></dc:creator><pubDate>Mon, 12 Jun 2023 10:26:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zlgt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_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_!zlgt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zlgt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!zlgt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!zlgt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!zlgt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zlgt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b24b0efd-1a5a-46c0-97f5-09576e96852a_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;:1106575,&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_!zlgt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!zlgt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!zlgt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!zlgt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb24b0efd-1a5a-46c0-97f5-09576e96852a_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 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>A couple of weeks ago, <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Kent Beck&quot;,&quot;id&quot;:24333739,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/000da410-0ed6-4a25-80b1-6a46e964ae0b_242x242.jpeg&quot;,&quot;uuid&quot;:&quot;33d1f806-a553-4dd0-9df7-f11e245cf90b&quot;}" data-component-name="MentionToDOM"></span> tweeted <a href="https://twitter.com/KentBeck/status/1659570408314773505">this</a>:</p><blockquote><p>When did TDD become an identity? "I'm not a TDD person"--I heard this the other day. &#128533; It's not a genetic disposition, like cilantro tasting like soap. How did this happen? What can we do now?</p></blockquote><p>Intrigued by Kent&#8217;s last question, I am writing this essay hoping to change at least one mind. Therefore, If you&#8217;re &#8220;not a TDD person&#8221;, read on.</p><p>The view of &#8220;I&#8217;m not a TDD person&#8221; usually concludes that Test-Driven Development (TDD) is a matter of individuals&#8217; preferences, which I've noticed in various discussions, responses to tweets, and even some TDD threads I&#8217;ve written. Further, this view is typically shared against one single aspect of TDD. That is, it doesn&#8217;t matter whether a developer is doing the test-first or the test-after approach. The <strong>sequence of steps</strong> in a task doesn&#8217;t matter, because it&#8217;ll produce the same result.</p><p>After all, the sequence of steps in our daily life doesn&#8217;t usually matter. When you&#8217;re making a cup of tea, whether you put in the milk or tea first, the result is the same cup of tea. Is it the same cup of tea, though?</p><p>I grew up in Indonesia. In Indonesia, the most common way I used to drink tea is to take it plain, or with sugar. We don&#8217;t drink tea with milk in Indonesia, at least not commonly.</p><p>I moved to the UK nine years ago, and apparently, tea with milk is the default for my British friends. A friend of mine, George, came to my house one day. Immersing myself in the British culture best I could, I offered him a cup of tea. He said, &#8220;Yes, please, with milk.&#8221; Believe it or not, I&#8217;ve been practising making tea with milk. Simple enough, mix milk, a tea bag, and hot water, and I&#8217;m done.</p><p>George took a sip, his face cringed, disgusted, disapproving. Being polite, he didn&#8217;t say anything, until I asked if I had made the tea wrong. &#8220;It doesn&#8217;t taste right. Could you explain to me how you made it, please?&#8221; George asked politely. I explained to him that I took a cup, poured some milk into it, and then he interrupted me. &#8221;Stop, what? That&#8217;s not how you make a cup of tea! You put in the tea first, the milk last!&#8221;</p><p>This argument about how steps should be sequenced reminded me of TDD. So I got curious and asked him to come into the kitchen with me and show me all the steps he&#8217;d do, and with a big sigh, he agreed.</p><p>We entered the kitchen. I grabbed a cup, and to my surprise, George already interjected on this first step. He said, &#8220;Wrong, turn on your kettle first, then only ready the cup, tea bags, and milk. It&#8217;ll save you some time.&#8221; So I turned on my kettle, another interjection, &#8220;Wrong, you&#8217;re using too much water, you&#8217;re wasting your electricity, why did you make it too full?&#8221; All the minuscule, seemingly small things that I don&#8217;t quite care about, he commented on, until we reached the point where the water boiled. We now have to make a hard decision. Tea-first or milk-first?</p><p>George, being an expert in tea-making, explained to me, &#8220;Tea first because if you put the milk first, the boiling water&#8217;s temperature will drop quickly, leaving less time for the tea leaves to brew.&#8221;</p><p>It makes a lot of sense, I thought. As I poured the boiling water into the cup, my cup began to crack. I was shocked. Calmly, George said, &#8220;Well, if you want to enjoy a perfect cup of tea, you need a better cup!&#8221; Annoying, but I finally managed to make a cup of tea following his method.</p><p>It did taste nicer.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://read.ceilfors.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>In this seemingly simple task of making a cup of tea, the tiniest detail I hadn&#8217;t considered made an impact. When you zoom in on a specific task, you&#8217;ll discover that the sequence of steps to complete that task does make a difference. Similarly, when you zoom in closely at software development practices, the sequence of steps you execute can make a difference.</p><p>When I adopted the kettle-first approach and the tea-first approach, I saved time and made a better-tasting tea! In software development, test-first or test-after will make a difference. When I practice TDD, I&#8217;m more productive and produce better-quality software. There is evidence that others have gained similar results. (<em>I&#8217;ll expand on this thought in my next post)</em>.</p><p>Perhaps the question is, how much of this optimisation is worth doing? Maybe TDD only improves our productivity and quality by 1%. What&#8217;s the point of changing a habit to get a 1% improvement? It may seem too marginal to change your &#8220;preferences&#8221;.</p><p>But most of us struggle to grasp the power of tiny continuous improvements. A 1% improvement may seem marginal, but <a href="https://jamesclear.com/continuous-improvement">do it every day for one year you will improve 37x</a>! Better yet, once you adopt it as a default, you don&#8217;t need to think about making improvements because that new habit of the sequence we tweaked is already making those improvements.</p><p>Like most practices, TDD is not context-free. My cup broke when I tried the tea-first approach for the first time. If you&#8217;re a TDD practitioner, help others feel safe by remembering that context matters. Otherwise, you may be breaking lots of cups!</p><p>So does changing the sequence of steps matter at all? Consider what my wife told me as I write this essay, &#8220;When I cook an omelette, you can choose to put egg first or oil first in the pan. The sequence is obvious if you want a better-tasting omelette!&#8221; It becomes apparent that the sequence of steps in which we do things, whether in tea-making, software development, or cooking, can indeed yield significant differences in the result. </p><div><hr></div><p>Quantum Steps exists to transform our approach to work for the better. If you discovered something new or love what you&#8217;ve read, please do me a favour, and share this post with your friends. Thank you.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://read.ceilfors.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Quantum Steps! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>