<?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[At Least Once]]></title><description><![CDATA[This script has been run before. At least once. 
]]></description><link>https://www.atleastonce.sh</link><image><url>https://substackcdn.com/image/fetch/$s_!0Ylk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ae742f0-bd3f-47f2-959c-b72731797436_638x638.png</url><title>At Least Once</title><link>https://www.atleastonce.sh</link></image><generator>Substack</generator><lastBuildDate>Fri, 17 Apr 2026 05:22:53 GMT</lastBuildDate><atom:link href="https://www.atleastonce.sh/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Hrishi Dixit]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[atleastonce@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[atleastonce@substack.com]]></itunes:email><itunes:name><![CDATA[Hrishi Dixit]]></itunes:name></itunes:owner><itunes:author><![CDATA[Hrishi Dixit]]></itunes:author><googleplay:owner><![CDATA[atleastonce@substack.com]]></googleplay:owner><googleplay:email><![CDATA[atleastonce@substack.com]]></googleplay:email><googleplay:author><![CDATA[Hrishi Dixit]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Tell me a story]]></title><description><![CDATA[Putting the "story" in user story]]></description><link>https://www.atleastonce.sh/p/tell-me-a-story</link><guid isPermaLink="false">https://www.atleastonce.sh/p/tell-me-a-story</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Thu, 20 Feb 2025 14:01:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f768cbfa-31ee-48a7-86a2-1dd6cfa2386a_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is a bit of a continuation of an <a href="https://www.atleastonce.sh/p/eventually-things-will-be-consistent">earlier post</a> of mine which, in some sections, morphed into a sob-story about the marginalization of end users. I&#8217;ve been nursing those wounds for some time. So, I did a thought exercise a little while ago in an effort to come up some therapeutics for them: putting the <em>story </em>in a user story. </p><p>It was fun to write. I am not sure what impact it had on my intended audience back then, but I&#8217;ll try my luck again with this audience, with some mods on specifics without losing intent. </p><p>I&#8217;ll go back to the same <em><a href="https://www.atleastonce.sh/i/151561968/the-room-where-it-happens">FooStore</a> </em>from that earlier post (and yes, I really wish I had come up with something more creative than <em>foo), </em>and the same Janet who loves to buy <em>foo. </em></p><p>Here&#8217;s the twist: <em>foo</em>s<em> </em>are getting popular, and the store keeps running out of them. No amount of eventual consistency is going to help with <em>foo </em>inventories. Sure, a notification to users when new <em>foo </em>stock arrives is nice, but that ain&#8217;t cutting it. </p><p>So, Butterfield and others from <em>foo.ai </em>plan a new feature: <em>Autofoo. </em>A pre-order that&#8217;s paid for, and automatically fulfilled, on FIFO basis, as new stock comes in. </p><p>Here&#8217;s a standard-issue user story / epic for <em>Autofoo</em>: </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BCey!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BCey!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BCey!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BCey!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BCey!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BCey!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg" width="1128" height="1026" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1026,&quot;width&quot;:1128,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151511,&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_!BCey!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BCey!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BCey!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BCey!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81ade617-a42b-49cd-984f-a55aced8c05b_1128x1026.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><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ivul!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ivul!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ivul!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ivul!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ivul!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ivul!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg" width="1132" height="1030" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1030,&quot;width&quot;:1132,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:172359,&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;: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_!ivul!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ivul!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ivul!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ivul!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb59dc45-1c1e-4f1c-8a21-cb6cfebbb494_1132x1030.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is all useful and necessary to be sure. But I want my team to care, <em>deeply,</em> about Janet&#8217;s emotions. Here&#8217;s how I would prefer to tell the user story:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AbMQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AbMQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AbMQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AbMQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AbMQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AbMQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg" width="1143" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:1143,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:243114,&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_!AbMQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AbMQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AbMQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AbMQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa386405c-2333-4a2f-a69f-04d06567bc81_1143x718.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To wit: <em>Start with the user. </em></p><p>This is inordinately ornate to be sure, but the point was to make a point. It is also a trivial use case - the original one I wrote it for was significantly more complex. Furthermore, this is not intended to <em>replace </em>traditional epics and other artifacts. Rather, the hope is that every new feature or product <em>begins life </em>like this<em>: </em>with the  user at the center of things.  </p><p>As a perk: it&#8217;s a blast to write stuff like this (even if not as over-dramatized as this one), plus it gets the builders excited to build it. </p><p>I really do think screenwriters would make great product people!</p><p></p>]]></content:encoded></item><item><title><![CDATA[Make yourself redundant]]></title><description><![CDATA[An oft-overlooked KPI for the early-stage CTO]]></description><link>https://www.atleastonce.sh/p/make-yourself-redundant</link><guid isPermaLink="false">https://www.atleastonce.sh/p/make-yourself-redundant</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Mon, 06 Jan 2025 20:02:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/MiznKYpYvvU" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yup, that sounds weird: <em>make yourself redundant.</em></p><p>Is it really as self-destructive as it sounds? I think it is at some level the opposite. </p><p>Here&#8217;s the thing: the early-stage CTO is a bit of an odd beast. I am speaking for myself here for the most part but have at least part-validation from some other similar oddballs that are close friends.</p><p>At least 3 things are true for us:</p><ul><li><p>We like building products, especially from scratch</p></li><li><p>We don&#8217;t like building decks</p></li><li><p>We like early-stage equity</p></li></ul><p>Add those up, and the KPI really translates to <em>protecting your investment: </em> of time, blood, sweat, neurons, and other minerals involved in 0-to-1 builds. It aligns your success with that of the business. </p><p>In geekspeak, it&#8217;s the human version of all things we hold dear in system design: redundancy (<em>it says it, right there!)</em>, transparent failover, single points of failure, resiliency.  </p><p>I had a great chat recently with <a href="https://www.linkedin.com/in/joelbeasleyleader/">Joel Beasley </a>on the <a href="https://moderncto.io/hrishi-dixit/">Modern CTO</a> podcast about exactly this &#8212; hopefully you find it entertaining, and perhaps useful!</p><div id="youtube2-MiznKYpYvvU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;MiznKYpYvvU&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/MiznKYpYvvU?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>You can also catch it on <a href="https://open.spotify.com/episode/4SCAPgoyDDlOqmZLCC4uiI?si=LOaWsL3OQQiLfuLKyHCn5g">Spotify</a> and <a href="https://podcasts.apple.com/us/podcast/why-you-need-to-make-yourself-redundant-with-hrishi/id1325942361?i=1000682864246">Apple Podcasts</a> (among others). </p><p><em>TL;DR: <strong>Don&#8217;t be a single point of failure!</strong></em></p>]]></content:encoded></item><item><title><![CDATA[Will you approve this PR?]]></title><description><![CDATA[And other relevant questions for better technical screens]]></description><link>https://www.atleastonce.sh/p/will-you-approve-this-pr</link><guid isPermaLink="false">https://www.atleastonce.sh/p/will-you-approve-this-pr</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Fri, 03 Jan 2025 14:59:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2b4d1337-ae4a-47fa-84ef-03ea60e95bc5_3490x1988.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>First off, Happy New Year and all that. </p><p></p><p><em>&#8220;Can you write me the pseudocode for a depth-first search?&#8221;</em></p><p>This was a question posed to me in February 2003 by an insolent twerp of a coder at a now-defunct outfit called Random Walk Computing back in San Francisco. I&#8217;d been laid off twice<em> </em>in a span of 4 months. This was smack dab in the ember-shower of the dotcom inferno that had rendered the city, especially its SoMa neighborhood, a glass and concrete wasteland rather resembling a corporate version of <a href="https://wikiofthrones.com/everything-we-know-about-harrenhal">post-Aegon Harrenhal</a>. RWC was one of those &#8220;what have I got to lose&#8221; interview calls I took, preparing as I was to leave the city for good. (I didn&#8217;t for another 3 years, but that&#8217;s a different story.)</p><p>Anyway<em>, </em>straightforward as this piece of code is, I froze for a bit, trying to rehydrate dim CS 410 memories from almost a decade earlier (the last time I had to code up a fundamental algorithm). All the while, Insolent Twerp kept peering at me with his weird green glasses and highly unprofessional <em>schadenfreude. </em>I came this close to responding to him with <em>&#8220;Only if you write me the pseudocode for Dijkstra&#8217;s Algorithm while I do it, you bombastic asshat&#8221;.</em></p><p>I got the code, didn&#8217;t get the gig. Idiots. Good thing too, as the firm was <a href="https://mergr.com/transaction/accenture-acquires-random-walk-computing">devoured by Accenture</a> a few years later.</p><p>That&#8217;s when I decided that if I were to ever own the engineering hiring process at any place, I would never <em>ever </em>ask an interview candidate live coding questions. </p><p>See, I absolutely suck<em> </em>at live coding questions. I abhor them with a crimson passion. No doubt in large part because I suck at them, but more importantly because I believe that as a screening device, they are patently useless. They screen for the wrong skill. &#8220;Thinking on your feet&#8221;, while impressive, is not an imperative for a good software engineer. What are we trying to do here - write good software or defuse a bomb?</p><p>Besides, this approach racks up an impressive count of false negatives, ultimately making it a losing proposition for the hiring company. To add to that, it fails to give the <em>candidate </em>a good flavor of what it&#8217;s like to work on your team, something I believe is a key goal of the interview process. All it does is deliver a momentary synthetic dose of imperious adrenaline to Insolent Twerp (who shouldn&#8217;t be on your team anyway), to say nothing of an equally synthetic dose of homicidal impulse to the interviewee. Basically, this thing below, down to the blue hoodie:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bb7A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bb7A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bb7A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bb7A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bb7A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bb7A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg&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;:507268,&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_!bb7A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bb7A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bb7A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bb7A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6f48d92-d901-47a4-a116-88e6fbba99cb_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s also why books like <a href="https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850/ref=asc_df_0984782850">these</a> make me want to puke. I&#8217;m well aware this goes against the grain of everything Google and other haughty giants believe in, but really: there are better ways. </p><h2><strong>Better ways</strong></h2><p>So, what then, discuss the weather?</p><p>Of course not. Technical screens are critical. It&#8217;s just there is a <em>lot </em>more to the job than writing code. Coding, as I have often said, is the &#8220;easy&#8221; part. </p><p>My approach to this as a tech leader has been, at a 10K foot level, relatively simple: <em>Create as close to a real-life scenario as possible in the interview process. </em></p><p>There&#8217;s obviously a bunch of detail to unpack here (which I will, shortly), but it doesn&#8217;t change the fact that unless you&#8217;re writing kernel code or a search library (or of course CS 410), scratching up DFS code is unlikely to play any active role in your real programming life. And even if it does, it&#8217;s unlikely you will be doing it at gunpoint. </p><p>Logically the approach is simply a reframing of <em>Will they be good at doing the job they are being interviewed to do? </em>But it goes further: it gets the candidate thinking <em>Will I enjoy working here? </em>Fits go both ways.</p><p>Let&#8217;s look at a typical Day In The Life of a senior back-end engineer at, say, a fin-tech startup:</p><ul><li><p><em>0830-0900: Coffee, watercooler, email catchup (two emails in there about pending PR reviews), Ooh there&#8217;s donuts in the kitchen! </em></p></li><li><p><em>0900-0910: Pod daily standup</em></p></li><li><p><em>0915-1130: Working with teammate on a design for the new ledgering service. Meeting with tech architects tomorrow</em></p></li><li><p><em>1130-1230: (Alleged) lunch break, interrupted half-way through her fish taco at 1152 by the prod alert comes in: <strong>Web-hooks are failing on payment service listener, HELP!</strong> </em></p></li><li><p><em>1152-1311: Pair-troubleshooting with DevOps, devolving fish taco in hand, combing through Sentry logs to see what&#8217;s going on. Some array being indexed out of bounds. Code doesn&#8217;t look familiar, something weird going on. </em></p></li><li><p><em>1312-1320: Tracking down the PR that introduced that bit of bad code</em></p></li><li><p><em>1325-1400: Scanning the newly introduced code, working on hotfix (because bad PR author is in a different time zone and likely asleep)</em></p></li><li><p><em>1400-1420: Pushing hotfix to prod, writing post-mortem on issue, publishing to internal wiki. </em></p></li><li><p><em>1420-1430: A little venting on Slack, finish eating now-deconstructed fish taco. </em></p></li><li><p><em>1430-1450: Walking around the block to clear head</em></p></li><li><p><em>1500-1630: Back to ledgering service design - got the deck ready, shared with pod and tech architects </em></p></li><li><p><em>1630-1715: Meeting with pod lead and couple of stakeholders on some new features</em></p></li><li><p><em>1715-1745: Catching up with PR reviews, sent a couple back with comments</em></p></li><li><p><em>1800-1830: More email catchup (some gripes from marketing that new landing page doesn&#8217;t render right on mobile, need to look into that tomorrow). Wind down. </em></p></li></ul><p>Not an atypical day. You&#8217;ll notice that outside of the hotfix, which fixed someone <em>else&#8217;s</em> faulty code, there was hardly any net new coding during the day, let alone searching depth-first.</p><p>If this is the role you are looking to fill, what possible earthly signal did that binary search pseudocode on the whiteboard give you on your candidate, aside from some solid insights on her ability to write in a straight line on a whiteboard, and maybe her grace under pressure?</p><p>Make it a <em>real </em>technical screen. </p><h2><strong>Keepin&#8217; it real</strong></h2><p>Let&#8217;s try a more realistic spin. Drawing inspiration from Typical Day above, here&#8217;s a stab at a &#8220;real&#8221; technical screen for the above senior (L3) backend engineer candidate, framed as a set of technical challenges.</p><h4>Challenge 1: Can you help automate our reconciliation process?</h4><blockquote><p><em>We do a nightly reconciliation of our ledger with the ledger of our partner bank. The bank sends us a CSV file with all their transactions. Our transactions are stored in our MySQL database. Here is the &lt;csv-format&gt; and &lt;table-structure&gt;.</em></p><p><em>Currently this reconciliation is manually done by doing an export from our table and comparing it to the CSV received from the bank. We need to automate this to improve our operating efficiency. </em></p><p><em>Can you build a service with an endpoint that takes the CSV, runs the reconciliation and generates a report that looks like &lt;report-format&gt;.</em></p><p><em>You can use any language and/or framework you prefer, though Java or Python are preferred. Please state any assumptions you make clearly and provide a README to build and run your mini reconciliation engine. Bonus points if you Dockerize.</em></p></blockquote><h4>Challenge 2: Will you approve this PR?</h4><p>This one is particularly my favorite - hence the name of the post &#128578;</p><blockquote><p><em>Peer code reviews are a critical component of our shipping pipeline. Here is a Github pull request that was submitted by one of your teammates. The PR has some comments that attempt to explain what it is trying to do. </em></p><p><em>Based on the diffs and comments provided, will you approve this PR? If not, why not?</em></p></blockquote><p>Throw in some obvious and some subtle logic flaws, bugs and other issues in that sample PR. Style issues, null pointers, race conditions, infinite loops, that sort of thing. For more senior roles go deeper: throw in potential performance issues (e.g. double recursion without size-checking), security issues (e.g. unrestricted doc uploads without mime-type or size checks, unsalted password hashes, etc.)</p><p>(If it&#8217;s a front-end engineer role, I may throw in a Challenge 3 as well)</p><h4>Challenge 3: Did the FE get it right?</h4><blockquote><p><em>Two images of a new landing page we are building for our marketing team are attached. Image A is a PNG export of the design from our marketing design team, Image B is our front-end engineer&#8217;s realization of the design. </em></p><p><em>Did the engineer get it right?</em></p></blockquote><p>(Aka, testing the eye for pixel-perfectness).</p><p><strong>Finally (and this is key):</strong></p><blockquote><p><em><strong>You have 24 hours to work on these. Please email your solutions to &lt;insert-email-address&gt; by &lt;insert-date-and-time-here&gt;.</strong></em></p></blockquote><p>In other words, it&#8217;s a take-home challenge, with no Insolent Twerp eyes staring at you while you work. The posted solutions provide both the gating factor and the baseline material for the onsite technical screen. </p><p>To round this off, create a quantified rubric for the evaluation of solutions. Here is one I have crafted in the past for instance, for a senior back-end role:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kOpy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kOpy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kOpy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kOpy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kOpy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kOpy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg" width="1385" height="210" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:210,&quot;width&quot;:1385,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:98934,&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_!kOpy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kOpy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kOpy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kOpy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1a122a-6a10-4b59-afba-05adef9c73c7_1385x210.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Rank each on a scale of 1-5. If the overall score notches 3 or higher on a scale of 1-5, that could be a signal to bring in for an onsite screen.</p><h4>Onsite tech screen</h4><p>If the candidate clears the offsite challenge, the materials submitted provide a great baseline for the onsite screen. We use the time to discuss their solution, &#8220;collaboratively&#8221; make improvements to the coding solution, discuss alternative approaches, dig deeper into the code review, and many other things, for instance:</p><ul><li><p>Did she spot all the issues in the PR? How would she fix them?</p></li><li><p>How can we make the recon engine more scalable? What if the CSV is 22GB? What if other banks have different formats, how do we abstract this further?</p></li></ul><p>You would not only get a sense of the problem solving and raw code skills, but a good flavor of how she thinks, how she interacts with peers, how she takes feedback, or gives it. In other words - not just how good an engineer she is but how easy (or not) she is to work with. Is she &#8220;one of us&#8221;? Do you see her on our team?</p><p>And best part: <em>vice versa</em>. She gets a feel for work on your team too. If you really want to hire her, this is critical <em>and</em> invaluable. You owe that to your candidate, and it can actually be a great selling point too if you have a good engineering culture (more on culture in a future post). </p><p><em><strong>Aside</strong>: In our increasingly remote-friendly and distributed world, &#8220;onsite&#8221; is becoming more metaphorical than literal. Platforms like <a href="https://www.hackerrank.com/">HackerRank</a> and <a href="https://coderpad.io/">CoderPad</a> help bridge this gap quite effectively. We used the former quite productively at Yieldstreet. </em></p><h3>But ChatGPT&#8230;</h3><p>How would this pass muster in this era of AI-driven code generation? </p><p>Fair question, and to some extent unavoidable. But given that the posted solution is not the end of the story, rather simply the entry point to the technical screen, any &#8220;cheaters&#8221; would be relatively easy to sniff out in the onsite tech screen, where we dig deeper into their solution live. It is not easy to comment intelligently on &#8220;your&#8221; solution if &#8220;you&#8221; didn&#8217;t actually write it. </p><h2><strong>The aftertaste</strong></h2><p>We instituted a close flavor of this at Yieldstreet to great success - I was proud of the caliber of the talent we assembled there, the bar we set was exceedingly high. So much so that we actually received compliments, even from candidates that <em>didn&#8217;t </em>make the cut, saying how much they enjoyed the interview process. That&#8217;s a good feeling, to have left a pleasant aftertaste for the candidate. </p><p>Only one thing can sour it now - not getting back to the candidate in time. I was <em>militant </em>about communicating our decision to the candidate within no more than 2 business days <em>either way. </em>It is in exceedingly bad and unprofessional taste to ghost a candidate after an interview. It is actually unforgivable. </p><p>Now, write me some code for a doubly linked list. Go!</p>]]></content:encoded></item><item><title><![CDATA[You shall know our velocity]]></title><description><![CDATA[But we have no idea when this will ship]]></description><link>https://www.atleastonce.sh/p/you-shall-know-our-velocity</link><guid isPermaLink="false">https://www.atleastonce.sh/p/you-shall-know-our-velocity</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Thu, 12 Dec 2024 18:18:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CJWa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>First off, apologies to <a href="https://daveeggers.net/dave-eggers">Dave Eggers </a>for borrowing the title of one of his <a href="https://www.goodreads.com/book/show/4954.You_Shall_Know_Our_Velocity_?ac=1&amp;from_search=true&amp;qid=1aXNvSH87k&amp;rank=1">best works</a>. Highly<em> </em>recommended!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CJWa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CJWa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CJWa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CJWa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CJWa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CJWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3030285,&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_!CJWa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CJWa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CJWa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CJWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dda1cde-0d1a-4647-b25a-f47fbbbbd70e_4032x3024.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>This is a post of exasperation. It may also be one of my shorter ones. </p><p>In a nutshell: that word, <em>velocity</em><strong>, </strong>is killing me. </p><p>And somehow, within the sample space of product and tech leaders, I don&#8217;t think I&#8217;m alone in feeling this. </p><p>Thought experiment: here&#8217;s 3 fictional graphs:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o_x_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o_x_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o_x_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o_x_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o_x_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o_x_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg" width="879" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:451,&quot;width&quot;:879,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23257,&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;: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_!o_x_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o_x_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o_x_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o_x_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c91096-552e-47fc-9b50-2d7b72cb3f6c_879x451.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>All parameters held constant (same team, same toolchain, etc.), which one is your favorite?</p><p>I daresay many people would go with B. <em>Up and to the right, </em>right? Mostly?</p><p>For me it is C. And to be repetitive, within the sample space of product and tech leaders, I don&#8217;t think I&#8217;m alone in this. </p><p>Why? It&#8217;s the unit systems. </p><h2>Unit economics</h2><p>Before being swayed by the trends in these plots, it&#8217;s worth looking at the axis labels. It&#8217;s <em>story points </em>vs <em>week </em>(or some measure of time, like <em>sprint</em>). </p><p>This is the first source of my semantic frustration, and where the word <em>velocity </em>wreaks its unique brand of havoc. Per the Encyclopedia Brittanica, <em>velocity </em>is:</p><div class="pullquote"><p>a quantity that designates how fast and in what direction a point is moving.</p></div><p><strong>Units</strong>: meters per second, miles per hour, furlongs per fortnight<em>: <strong>distance</strong> over <strong>time</strong></em></p><p>So, armed with an unshakeable recall of high-school Newtonian mechanics, the powers-that-be seamlessly map &#8220;velocity&#8221; to &#8220;speed&#8221;. Improving velocity this becomes about shipping faster. Missed deadlines mean your team has a sub-optimal velocity. <em>Le-sigh.</em></p><p>On the other hand, regarding &#8220;sprint velocity&#8221;, the<a href="https://www.agilealliance.org/glossary/velocity/"> Agile Alliance</a> says:</p><div class="pullquote"><p>At the end of each iteration, the team adds up effort <strong><a href="https://www.agilealliance.org/glossary/estimation/">estimates</a></strong> associated with <strong><a href="https://www.agilealliance.org/glossary/user-stories/">user stories</a></strong> that were <strong><a href="http://guide.agilealliance.org/guide/sashimi.html">completed</a></strong> during that iteration. This total is called velocity.</p></div><p><strong>Units</strong>: story points per week, story points per sprint: <em><strong>volume</strong> over <strong>time</strong></em></p><p>In other words, putting aside the <a href="https://xevix.medium.com/why-story-points-dont-work-5f10c5d5a0f0">delightfully ambiguous voodoo </a>of &#8220;story points&#8221;, it is a quantification of the team&#8217;s <em>output capacity.</em></p><p><em>Aside: It&#8217;s worth noting here that the &#8220;volume&#8221; here is not necessarily code volume, but rather an abstraction representing functionality or complexity. A &#8220;5 point&#8221; story may take 5 hours of brainwork and yield less than 50 lines of brilliant code written in less than 25 minutes. That&#8217;s still a big &#8220;volume&#8221;. Yeah, it IS voodoo.</em></p><p>Either way, it has little to do with <em>shipping speed. </em>This is where Agile blew it on jargon. While these two have a (somewhat tenuous) correlation, they are not the same, at all.  They answer different questions. Velocity answers &#8220;<em>how much software can your team produce in time X&#8221;, </em>as opposed to shipping speed, which answers <em>&#8220;how fast can your team launch Y to production&#8221;. </em>A bad question to begin with, but more on that later. </p><p><em>Tries </em>to answer anyway: sprint velocity by itself is woefully inadequate to answer anything, being as it is but one of many <em>many </em>variables in the bizarro multivariate Markov Chain or Martingale or whatever Sorcery it is that attempts to make software estimation &#8220;predictable&#8221;. Channeling the old SAT/GRE prep days: <code>Predictability:Stakeholder::Pipeweed:Hobbit</code></p><p>We <em>love </em>predictability, however illusory it may be. Works wonders for board decks. </p><h2>The Illusion of Predictability</h2><p>Swinging back to those velocity charts from before, this probably clarifies why I prefer C. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dSqN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dSqN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dSqN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dSqN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dSqN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dSqN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg" width="1456" height="828" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:828,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:280442,&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_!dSqN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dSqN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dSqN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dSqN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F985775fa-29bc-43bf-83c4-755b4b2955ba_3440x1956.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Unlike most other flatlines, this particular one is delicious. It implies consistency. Consistency breeds the fabled predictability. Flatlining tells a comforting story, that the team is finding its rhythm, working well together. That the <em>people </em>variable in the Markov chain is stabilizing, and we can look at other obstacular variables. Yeah, there&#8217;s no such word as <em>obstacular, </em>but there should be. </p><p><em>Aside: At this point I should apologize to all pure and applied mathematicians specializing in stochastic calculus for abusing Martingales and Markov Chains. </em></p><p>Let&#8217;s take this further, while we&#8217;re wandering in our Holy Grail fevered dreams. Here&#8217;s an even more idealized graph, with the team held constant:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MZFk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MZFk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 424w, https://substackcdn.com/image/fetch/$s_!MZFk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 848w, https://substackcdn.com/image/fetch/$s_!MZFk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 1272w, https://substackcdn.com/image/fetch/$s_!MZFk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MZFk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png" width="1456" height="951" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:951,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90102,&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_!MZFk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 424w, https://substackcdn.com/image/fetch/$s_!MZFk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 848w, https://substackcdn.com/image/fetch/$s_!MZFk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.png 1272w, https://substackcdn.com/image/fetch/$s_!MZFk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F917e52de-ac34-421a-9d93-bb5a76df747e_1686x1101.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>Now my comforting story from earlier has become a heartwarming Christmas miracle tale that would make Frank Capra feel like Orson Welles. A healthy, predictable <em>improvement</em> in velocity over time. I&#8217;m positively salivating. I&#8217;m desperate to know what obstacles we removed that enabled the same team to produce more<em>. </em></p><p>But here&#8217;s the catch: <strong>none </strong>of these.. velocitations.. will help me answer a common inbound question of the shape: &#8220;How long will it take us to ship X?&#8221;. Yeah, there is no such word as <em>velocitation, </em>but there should be.</p><p>My answer would still be the one that triggers white-knuckled fury in the listener aka stakeholder: </p><blockquote><p><em>I can&#8217;t really say</em></p></blockquote><p>Or if I wanted to temper it, sand it down, couch it, or apply some other metallurgical softening to it:</p><blockquote><p><em>It depends. </em></p></blockquote><p>&#8220;Depends on what?&#8221; they say. &#8220;Well, there&#8217;s a lot of other variables&#8221; I say. </p><p>At this point the battle is lost. <em>Engineering is the bottleneck. Our velocity sucks.</em> It&#8217;s the same story, over and over. Everywhere. No team is immune. </p><p>And it will continue being so. Why? Two main reasons:</p><ul><li><p>There are, as I said, other variables </p></li><li><p>It&#8217;s the wrong question</p></li></ul><h2>Other Variables</h2><p>Team capacity tells me <em>how much, </em>but not <em>what. </em>In a perfect world, Team A working on Problem X is wholly, solely, completely, consummately, uninterruptedly working on <em>nothing else but Problem X, </em>with no distractions and no external dependencies. </p><p>Except the last time that sort of focus happened was probably that term project for CS412 in your senior year (maybe), or the thesis you worked on in grad school, or, more recently, the MVP your 3-person Delta Force built in the garage to take you from 0 to launch and land your Series A. </p><p>In the messy real world of scaled commercial software development, your team <em>will</em> be yanked non-isotropically in several directions, often concurrently:</p><ul><li><p><strong>Context switches.</strong> Production issues, emergency hotfixes, no-one-else-knows this-better-than-me-so-I-gotta-fixit (which is a different problem for a later post). The more senior you are, in tenure and experience, the more likely you&#8217;ll be yanked in this particular direction. This is unavoidable, and <em>the most disruptive yank of them all.</em> </p></li><li><p><strong>Debt, and unintended consequences. </strong>Touched briefly upon this in <a href="https://www.atleastonce.sh/p/all-tech-is-debt">tech debt</a>. The bigger the platform footprint, and older the codebase, the bigger this issue gets. Software is entropic. Something here will almost surely cause a weirdness over <em>there</em>. And you can&#8217;t estimate that upfront, it&#8217;s an unknowable.</p></li><li><p><strong>Internal dependencies. &#8220;</strong>Still waiting for greenlight on designs from Cassandra in Compliance&#8221;. &#8220;Ebenezar in email marketing is on parental leave, no one else knows what the dynamic variables for this email are.&#8221; &#8220;Pollyanna is still redlining the MSA&#8221;. Ring familiar?</p><ul><li><p>Software creation is not the only activity that ships software products. Yet it&#8217;s the only one quantified and measured and held accountable. I&#8217;d like to see velocity charts for marketing or legal too someday. Or more ideally, a chart that tracks the work of the <em>whole </em>Problem X team. </p></li></ul></li><li><p><strong>External dependencies. </strong>Yeah, <em>you </em>try and speed up the work of that<a href="https://www.explainxkcd.com/wiki/index.php/2347:_Dependency"> guy in Nebraska</a> (again). There are parts of the build we simply don&#8217;t have control over. &#8216;Nuff sed. </p><ul><li><p>I really do like that meme, sums up &#8220;external dependencies&#8221; beautifully.</p></li></ul></li><li><p><strong>Toolchain and process efficiency.</strong> Velocity measurements often end at <code>Ticket.status = Closed</code>.  There is a good bit of journey left for code to travel before it hits production. And even more before it reaches <em>everyone </em>(if you&#8217;re doing things right with feature flags and blue-green deployments). Here&#8217;s a sprinkling of things to look at:</p><ul><li><p>How efficient is your development environment? </p></li><li><p>How accurately does it reflect prod? </p></li><li><p>How fast can you run end to end tests? Regressions? </p></li><li><p>How long does it take to do a full build? </p></li><li><p>How quickly can DevOps provision a new cluster? </p></li><li><p>How efficient and automated is your shipping (CI/CD) pipeline?</p></li><li><p>How well are all the parties involved in the creation and promotion communicating with each other? </p></li></ul></li></ul><p>Bottomline: Velocity isn&#8217;t everything. Your team may be consistently outputting same volume, but it may be in service of 7 different things in addition to the one thing you&#8217;re trying to launch. Look at the whole pipeline for diagnosis and <em>look beyond product and engineering. </em></p><h2>Wrong Question</h2><p>There&#8217;s the rub. No software team or leader has escaped being at the receiving end of &#8220;How long will it take to ship this?&#8221;</p><p><em><strong>It&#8217;s the wrong question. </strong></em></p><p>On so many fronts. It is inefficient, demoralizing, and ultimately unanswerable in any meaningful way. </p><ol><li><p><strong>It&#8217;s inefficient. </strong>Boxing the <em>what </em>and figuring out the <em>how long </em>is a losing game. All it breeds is exasperated exchanges that waste time and raise tempers. </p><ol><li><p>Plus you miss out on what software engineers do best. Hint: it isn&#8217;t coding.</p></li><li><p>Dreading to tread into <a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month">mythical man-month </a>territory here (box, Pandora, etc.), but the refrain that often follows close on the heels of it is &#8220;<em>can&#8217;t we put some more people on it?"&#8220;</em></p></li></ol></li><li><p><strong>It&#8217;s demoralizing. </strong>The question is transactional, not collaborative. Your tech team is not an agency bidding for the project. They are a part of a team that solves problems and moves the business forward. This framing makes them feel like code monkeys taking orders from stakeholders. No one likes working like that.  </p></li><li><p><strong>It&#8217;s unanswerable. </strong>Software, beyond a trivial point, is inherently inestimable. Any answer in the form of a timeline is either a massively buffered <a href="https://en.wikipedia.org/wiki/Scientific_wild-ass_guess">SWAG</a> or a bare-faced lie (because <em>Other Variables </em>above). And yeah, the agency above is swagging and buffering as well, but they don&#8217;t have a choice.</p><ol><li><p>This is why I was never a fan of farming out bits of dev work to an agency, outside of well-bounded, well-boxed efforts that have a beginning and an end. Grudgingly at that. </p></li></ol></li></ol><p>So, <em>is</em> there a &#8220;right&#8221; question? Or is it all just wtf-land over here?</p><p>There is &#128526;. In fact, I mentioned it earlier in this post, in passing. Just turn things around a bit: </p><blockquote><p><em>What can you build in N weeks?</em></p></blockquote><p>To decorate it a bit more:</p><blockquote><p><em>We want to build a product or feature to do X, or test theory Y, or improve KPI Z. Here are some initial thoughts on a feature. What do you think? What can we ship in N weeks so we can start testing and refine?</em> </p></blockquote><p>Here&#8217;s what this reframing does: </p><ul><li><p>You boxed <em>time</em>, not <em>product. </em>This makes actual<em> </em>mathematical use of that mythical velocity you&#8217;ve been measuring. </p></li><li><p>You turned your software engineers into problem-solvers, because that is what they do best, not coding. Coding&#8217;s the easy part.</p></li><li><p>You unified your product, design, and tech (and ideally other) teams into one problem-solving SWAT unit by bringing the tech team to the table. That is an empowering <a href="https://www.atleastonce.sh/i/151561968/concurrent-engineering">concurrent engineering </a>move. Everyone is engaged, excited, collaborative, non-transactional. </p></li><li><p><em>This was the whole damn point of measuring sprint velocity to begin with!</em></p></li></ul><p>You have a much higher probability now of actually shipping something in the time box, or damn near close to it, because the engineers played a role in defining the <em>what. </em>While this may not immediately deliver results right off the bat, it will be the beginning of a much healthier and collaborative process. And it will define an engagement template that, if sustained, is virtually guaranteed to keep improving delivery timelines and quality. </p><h2>Improving speed and velocity</h2><p>Returning to the velocitous (another word that doesn&#8217;t exist but should) theme of this post, can we improve it? Can we get a given team, all things held constant, to produce more software over a given time? Aka can we get to that Christmas-miracle-tale velocity plot? And can we improve the <em>speed </em>with which we ship stuff?</p><p>Yes. Yes. And yes.</p><p>Let&#8217;s assume you have the right team assembled. Talented, team players, like each other, work well with each other, engaged, motivated, all that jazz. (If not, well there&#8217;s your problem.)</p><p>Once you have that team:</p><ul><li><p>Give them a problem to solve.</p></li><li><p>Give them air cover.</p></li><li><p>Get out of their way. </p></li></ul><p>Over time, they will:</p><ul><li><p>Get better acquainted with the software and the toolchain</p></li><li><p>Get better acquainted with each other, and find their rhythm</p></li><li><p>Get more experienced individually (this is what career growth is for - it&#8217;s the most symbiotic phenomenon in a work environment).</p></li><li><p>Get better acquainted with <em>you, </em>their leader(s). They will tell you what&#8217;s impeding them, what&#8217;s holding them back. They will tell you about the &#8220;other variables&#8221;. </p></li></ul><p>Now just solve for the other variables &#128521;. </p><p>In all seriousness, <em>this </em>is actually where speed improvements come from once you have the right team and team dynamics. And while those are not easy problems to solve, they have proven solutions that just need a will and commitment (and often a budget) to execute on. </p><p>Specifically, in my experience, the single biggest disruptor to shipping speed is context switches. There&#8217;s enough there to merit a separate post, but the more you are able to enable uninterrupted focus, and channel your stabilizing velocity towards fewer things. the exponentially more you improve your odds of improving your shipping speed. </p><p><em><strong>Which is not the same thing as velocity, dagnabit!</strong></em></p><h2>Post Factum</h2><p>I guess the post wasn&#8217;t so short after all. </p><p>On a pseudorandom note, wanted to share a line in the book quoted above (who&#8217;s title I have borrowed for this post), circled it in #<code>00d05c</code> 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_!yGlT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yGlT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yGlT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yGlT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yGlT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yGlT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg" width="1576" height="1218" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1218,&quot;width&quot;:1576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:631738,&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_!yGlT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yGlT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yGlT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yGlT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd86f815-00d1-4f12-a535-0b26d3bcc8b5_1576x1218.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Reminds me of a dialogue I have had way too often with stakeholders:</p><blockquote><p>SH: <em>When will it be done?<br></em>Me: <em>We haven&#8217;t started yet. </em></p></blockquote><p></p>]]></content:encoded></item><item><title><![CDATA[Eventually things will be consistent]]></title><description><![CDATA[But that may be too late.]]></description><link>https://www.atleastonce.sh/p/eventually-things-will-be-consistent</link><guid isPermaLink="false">https://www.atleastonce.sh/p/eventually-things-will-be-consistent</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Tue, 19 Nov 2024 14:30:45 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/710c0920-17e7-4d9f-9a04-62f7a35849a0_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is not a post about eventual consistency. </p><p>Well, it is. But not <em>just </em>about that.</p><p>It&#8217;s more about the delicate waltz between software complexity and user experience - which often lapses into a violent tango, or whatever Patrick Swayze was doing in <em>Dirty Dancing. </em> And it is about something I <em>wish </em>I had done better in my many refactor initiatives over the years. </p><p>A few years ago, a pitch deck landed in my inbox. It was for a fixed-income investment platform: very specific, very niche, very confusing. Nothing was built yet; it was an aspirational deck (though <em>perspirational </em>is probably a better word for it). One of the slides in it had a proposed architecture diagram for the platform that looked roughly like 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_!hzXo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hzXo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hzXo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hzXo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hzXo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hzXo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:895186,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hzXo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hzXo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hzXo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hzXo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80d1ae15-2978-4f50-9f4a-96a210b9136f_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>Ok fine, I coaxed that one out of <a href="https://openai.com/index/dall-e-3/">Dall-E</a> (hence the typos). But it is directionally aligned with what I saw. There were about 7 sub-systems, each containing north of 10 microservices, I think I counted about 19 data-stores, and a dizzying array of arrows that presumably represented data flows or message exchanges. And I&#8217;m sitting there wondering:</p><ul><li><p>Where do I begin?</p></li><li><p>What if there is an error? Where in the name of Donald Knuth would you even <em>start</em> looking? </p></li><li><p>What would happen if <em>that </em>went down? &#8220;<em>That"&#8220;:</em> any random arrow up there. </p></li><li><p>Is there a wall large enough to contain the <a href="https://www.ibm.com/topics/single-pane-of-glass">SPOG</a> that tells you wtf is going on at any given time? </p></li><li><p>Most importantly, how do you ensure a smooth user experience with a back-end architecture that would make Rube Goldberg blush?</p></li></ul><p>I am not<em> </em>getting into a <em>monolith vs microservices</em> polemic here. For one, enough has been written on this topic. More to the point, I actually don&#8217;t have strong convictions either way, for the simple reason that I have seen both approaches work beautifully in some situations, and bomb with a theatrical flourish in others. The best I can say on which architecture I prefer is <em>It depends. </em>Or more succinctly: &#175;\_(&#12484;)_/&#175;</p><p>But what I <em>do </em>have adamant views on, is <em>user experience</em> - and how that somehow starts taking a backseat as platforms get retooled for scale, a sacrificial lamb at the Altar of the Refactor Gods. And monolith &#8594; microservice refactors are most commonly deployed in service of scale.  </p><h3>SiaS</h3><p>That&#8217;s not SaaS with a typo. That&#8217;s an actual acronym. It is now, anyway: </p><p><em>Software <strong>is</strong> a Service. <br></em></p><p>Software is a tool, a means to provide a service to some user or stakeholder. It is not the end. End users don&#8217;t see the wizardry of your architecture or the elegance of your code, and even if they could, they don&#8217;t <em>care. </em>If their experience sucks, your work sucks. And their experience is all that matters. Period. </p><p>Somewhere along the way of growth, we often tend to lose sight of that. This is particularly<em> </em>endemic in monolith refactors, inherently a very back-end heavy endeavor. An all-too-common narrative: startups grow, sometimes exponentially. Audiences grow, teams grow. To support all this hockey-stickage, the platform tries to scale, often awkwardly. Cracks start showing up in key flows. Inevitably, <a href="https://www.atleastonce.sh/i/150852987/appendix-i-organically-bad-debt">tech debt </a>bat signals start flashing, fingers start pointing to &#8220;that monolith&#8221;, and a blueprint emerges to retool the platform for horizontal scalability by breaking it down.</p><p>This is all very good. I have been in these discussions many <em>many</em> times, often led them, and I have been consistently humbled by the engineering magic that happens in the room. </p><p>My main concern is: who <em>else </em>is in the room where it happens? </p><h3>The room where it happens</h3><p>Here&#8217;s a scenario. </p><p>The <em>Buy Foo </em>flow in your <em>foo.com</em> (or <em>foo.ai</em> probably, these days) has been keeling over a tad too often. That blocking call on the pricing API is bricking performance, the request backlog is piling up your Postgres connections, capping you at 500 concurrent <em>foo </em>purchases. Hardly <a href="https://youtu.be/b2F-DItXtZs">web-scale</a>.</p><p>So, a RefactorMoot is planned to make <em>Buy Foo </em>horizontally<em> </em>scalable. A legion of bright minds gathers in a room. A glance at the whiteboard in the room shows a dense graffiti of arrowheads and boxen and zigs representing module boundaries, and zags representing network boundaries, a bunch of cylinders for data stores. Something like this (or more):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1VGG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1VGG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1VGG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1VGG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1VGG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1VGG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg" width="1200" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:400317,&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_!1VGG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1VGG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1VGG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1VGG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7917d1b-9c54-41af-be4b-31c082de71b3_1200x1600.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You look around the room and see this collective, armed with coffee and Red Bull and sometimes stronger stuff, engaged in passionate debate, geekspeak flying  around like verbal butterflies: &#8220;The <em>foo</em> purchase is massively I/O bound&#8221;, &#8220;Does it <em>need </em>to be strongly consistent?&#8221;, &#8220;Postgres is the bottleneck&#8221; (yes, it usually is), &#8220;Let&#8217;s split this out into a <code>foo-payment</code> service with a local projection&#8221;, &#8220;at least once delivery should be good&#8221; (shameless plug for this publication&#8217;s name). </p><p>Heady stuff. But then you look around the room again, and wonder: <em>Where&#8217;s the front-end engineer who built the Buy Foo flow? The product designer who Figma-ed it? What about the product owner for the Storefront, was she looped in?</em></p><p>Most of all, <em>is anyone here thinking of <strong>Janet</strong> over there, who&#8217;s waiting to buy some foo? </em></p><p>Almost all refactors for scale, microservices or not, involve the introduction of things like statelessness and async processing. Thread and network boundaries are introduced. Real-time is relaxed to &#8220;near-real-time&#8221;, a nice non-committal promise. Interactions are morphed from API calls to pub-sub event emissions. Eventual consistency is an almost-imperative for handling scale. </p><p>It is also, in my experience, one of the most difficult constructs to design good user experiences around. The back-end toolchain has gotten so rich and sophisticated, with concepts and frameworks like the actor systems, Kafka, auto-scaling, serverless, distributed tracing, and so on, that the realization of this refactor is not <em>conceptually</em> hard in that layer of the stack (execution is another thing). But retooling the UX in the wake of a scale-driven refactor without violently violating <a href="https://en.wikipedia.org/wiki/Principle_of_least_astonishment">POLA</a> remains stubbornly, infuriatingly challenging. (Aside: I love the acronyms in our industry. SPOG, <a href="https://www.techtarget.com/searchdatacenter/definition/Single-point-of-failure-SPOF">SPOF</a>, POLA&#8230; someone recently introduced me to <em><a href="http://blog.kfish.org/2010/04/git-lola.html">git lola</a></em>.) </p><p>See, when Janet clicks that <em>Complete foo purchase</em> button, she expects to see a shiny <em>foo </em>in her pending orders on the next screen. Strong consistency promises that. Eventual consistency promises <em>not </em>that: it literally says <em>it will</em> <em>eventually show up. </em>I have done multiple Google searches for things like &#8220;designing for eventual consistency&#8221; or &#8220;UX for eventually consistent flows&#8221; and have been, er, consistently disappointed with the results. </p><p>The point of all this is not to knock eventual consistency. I have nothing against it, it&#8217;s one of the many tools in the toolbox, a great one at that. My lament is the fact that Janet above is often an afterthought in this refactoring charrette. And by the time the ripple reaches her, it&#8217;s often too late. While the back-end hums along in its modularized emancipation, and Grafana hums along in the comforting greenspace of passing health checks, Janet proceeds to get a mild coronary on clicking that <em>Complete Foo Purchase </em>button, because she&#8217;s just been deposited on her <em>My Orders </em>page and where the hell is the <em>foo </em>she just bought? Or she is rightfully peeved with a confirmation page that displays something like<code> Order ID 9a3dfcf9-1d1b-423c-8f43-96e25fee73a7 submitted</code><strong>,</strong><code> </code>above the fold, and a <code>Check status</code> button she has to keep clicking. All because that&#8217;s all you had time to shoehorn in after the scale refactor made that flow eventually consistent, and <em>you never did loop in the front-end engineer did you!</em> </p><p>In other words, few people seem to be giving an indented hoot about changes to Janet&#8217;s new post-refactor <em>foo</em>-buying experience. </p><p>I really need to stop saying <em>foo </em>soon<em>, </em>but bear with me a bit. </p><h3>Concurrent engineering</h3><p>So, what do we do?</p><p>I was planning to write about <a href="https://en.wikipedia.org/wiki/Concurrent_engineering">concurrent engineering</a> in a later post, perhaps the only meaningful crossover from my grad school research into my professional career. But worth introducing here. It&#8217;s an engineering practice that emphasizes concurrent consideration of multiple aspects in the design of a product by giving voice to multiple perspectives at once.</p><p>Put simply: <em>Get all the right people in the room!</em></p><p>Get the front-end devs, get the designers, get product, get QA. Treat the refactor like the new product build that it is, up and down the stack. Most importantly, <strong>start the discussion with Janet</strong>. <em>How does this affect Janet&#8217;s foo-buying experience? What will change? What can we do to make it not suck for Janet?</em></p><p>Because remember, you&#8217;re doing this refactor for Janet. Not for <em>anyone else. </em></p><p>The scene unfolding in the room looks different now. Channeling my movie geekdom, let&#8217;s try this as a 2-minute short. Any WGA format non-compliance is unintentional, and casting is left as a thought exercise for the reader.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!h4TU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!h4TU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h4TU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h4TU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h4TU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!h4TU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg" width="765" height="989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:989,&quot;width&quot;:765,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136558,&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_!h4TU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 424w, https://substackcdn.com/image/fetch/$s_!h4TU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 848w, https://substackcdn.com/image/fetch/$s_!h4TU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!h4TU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f6aa42c-d11a-4cae-9246-133e3dec5ba6_765x989.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Jvp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Jvp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0Jvp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0Jvp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0Jvp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Jvp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg" width="763" height="989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:989,&quot;width&quot;:763,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:125371,&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_!0Jvp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0Jvp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0Jvp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0Jvp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc575007e-8298-4d76-93a1-e6a921092173_763x989.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s a movie I&#8217;d like to see. Wish I had done more of that. </p><p>Mercifully, this is the point where I stop saying <em>foo. </em></p><h3>Elegance, not perfection</h3><p>At Yieldstreet, we had our own set of core values that I drafted for the Engineering org, additive to the company-level ones. One of those was 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_!YEFa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YEFa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YEFa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YEFa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YEFa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YEFa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg" width="1456" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:344366,&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_!YEFa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YEFa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YEFa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YEFa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d334b74-14c3-42aa-914c-c950a0179e5d_2798x1430.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This summarizes my hard-earned lessons on too many refactor efforts over my time, especially that last bullet. There was a lot of heartburn over the years, across multiple startups. It had to be codified. </p><p><em>Aside: our values all had this &#8220;X, not Y&#8221; syntax, because why not. For those curious, this was the full set:</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dvbI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dvbI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dvbI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dvbI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dvbI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dvbI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg" width="1252" height="926" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:926,&quot;width&quot;:1252,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123651,&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_!dvbI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dvbI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dvbI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dvbI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76ef9f25-339f-4a84-ae3f-36c31605b0e8_1252x926.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Post scriptum</h3><p>My search for elegant UX paradigms for eventually consistent systems goes on. Would love to know what <em>you </em>have done, or come across, that addresses this gracefully. </p><p>It is also quite true that not all refactors, for scale or otherwise, have a direct impact on end human experience. Not all software even <em>has </em>a user interface - API plays for one (though I would argue that the idea holds true in some form there as well). Conversely, there may other refactors, not involving eventual consistency, not related to scale, that may still have a UX impact. </p><p>The point is to <em>start refactoring discussions with the consideration of end user experience impacts,</em> even if to establish right up front that there aren&#8217;t any. And that requires getting all the right people in the room where it happens. </p>]]></content:encoded></item><item><title><![CDATA[Stop calling it "offshore"]]></title><description><![CDATA[And work forward from there]]></description><link>https://www.atleastonce.sh/p/stop-calling-it-offshore</link><guid isPermaLink="false">https://www.atleastonce.sh/p/stop-calling-it-offshore</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Sun, 10 Nov 2024 01:55:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/98e0a5b1-2eb4-4a48-ad27-bcce1c5c5fa8_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most startups offshore their early (and often even later) builds, and for good reason.</p><p>It&#8217;s a pretty common cost-saving measure in those early cash-strapped days. Nothing wrong with that &#8212; the planet is studded with talent-rich geolocations like Latin America, Eastern Europe, South Asia, where you can get a seasoned Python geek for an annualized cost of KKR&#8217;s weekly budget for Post-Its. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.atleastonce.sh/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 At Least Once! 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>But it seems most of these startups, while they notch material $-savings with these &#8220;offshore teams&#8221;, can&#8217;t seem to stop unspooling into jeremiads of why it isn&#8217;t working for them. &#8220;Communication is a nightmare&#8221;, &#8220;Shipping is delayed&#8221;, &#8220;Keep losing team members&#8221;, &#8220;They just don&#8217;t get it&#8221;, &#8220;Gotta deal with all this <a href="https://www.atleastonce.sh/p/all-tech-is-debt">tech debt</a> now&#8221;. Not all of these laments are misplaced either. I have seen it <em>not </em>working more often than working, my own experiences included. </p><p>So: is there a point here, or am I just adding my voice to the irritated chorus?</p><p>A bit, yes. But with a counterpoint: when it works, it is <em>magical. </em></p><p>More on that soon but let me start with an instance of one of my groaners on this.</p><p>San Francisco, 2004. I was working for a fintech startup called <strong>Finaplex</strong> (a name who&#8217;s <em>I&#8217;m Feeling Lucky </em>goog-hit<em> </em>invariably pulled up a <a href="https://www.drugs.com/vet/finaplix-h.html">bovine steroid</a>, along with a "<em>Do you mean..?&#8221; </em>rider), in what would roughly be the Mesozoic era of fintech. Finaplex was really a trailblazer. The <em>Finaplex Wealth </em>product was a sprawling white-label wealth management platform for bulge-bracket financial institutions. Our clients included Lehman Brothers, Bear Stearns, First Republic, to name a few (all coincidences are coincidental). <em>My</em> client at the time was an online brokerage called HarrisDirect, which was subsequently acquired by an online brokerage called E*Trade, which was subsequently acquired by an on/off/every-other-line brokerage called Morgan Stanley. </p><p>But that&#8217;s beside the point.</p><p>The Harris project was <em>huh-yooge. </em>It had about 17 sub-projects, for account aggregation, IVR, proposal generation, market-data integration, portfolio accounting, and many more. At one point, Finaplex decided to work with an &#8220;offshore&#8221; firm in India, whose name shall remain hidden (mainly because I&#8217;ve forgotten it, so let&#8217;s call it Y, to not confuse it with <a href="http://x.com">X</a>). </p><p><em>That. Was. A. Nightmare. </em></p><p>For one, Y had a tendency to deploy a mid-sized republic of engineers on efforts that 2-3 senior engineers could have easily brought home. Compounding that there was a large set of revolving doors, so we could never get any notion of continuity across the 37-odd engineers let loose on, say, a reporting tool.</p><p>Secondly, there was literally <em>zero </em>overlap in working hours between San Francisco and Hyderabad. Word docs or titanic PDFs were hurtled back and forth across 13 time zones, multiple times a day. This was pre-Slack/Teams/Zoom/all-other-RT-collaboration tools. </p><p>But most importantly, there was the Mothership Syndrome. Overlords in San Francisco delegating to legions of offshore minions. Mostly (but not always) intentionally, mostly (but not always) subconsciously.</p><p>In aggregate, this was a nightmare, a bucket of worry for all - so much so that our friend and colleague <a href="https://www.linkedin.com/in/jgeerdink/">Jochem</a>, front-end dev to the stars, morphed the Finaplex logo into a new one called <em>Chintaplex </em>(<em>chinta </em>being the Hindi word for <em>worry</em>).</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HTbU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HTbU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 424w, https://substackcdn.com/image/fetch/$s_!HTbU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 848w, https://substackcdn.com/image/fetch/$s_!HTbU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 1272w, https://substackcdn.com/image/fetch/$s_!HTbU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HTbU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png" width="607" height="101" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:101,&quot;width&quot;:607,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15166,&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_!HTbU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 424w, https://substackcdn.com/image/fetch/$s_!HTbU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 848w, https://substackcdn.com/image/fetch/$s_!HTbU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 1272w, https://substackcdn.com/image/fetch/$s_!HTbU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcd9a9c0-e4cf-4e91-ac30-322e2f58ff52_607x101.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So that sucked. </p><p>But the counterpoint&#8230;</p><p>One of my most thrilling experiences as a tech leader has been building and managing what by conventional definition would be considered an &#8220;offshore&#8221; engineering team, spread across 4 countries and 3 continents: our team at <a href="http://yieldstreet.com">Yieldstreet</a>: New York, Brazil, Argentina, Malta (and eventually Utah, Oklahoma, and Boston as well). And, for the most part, this collective worked together like a multi-lingual cross-cultural symphony that rarely if ever devolved into cacophony and built some of the most amazing software I&#8217;ve seen.   </p><p>So why did this work, whereas Y above (and a few after that) didn&#8217;t (quite)? In theory it was simple: we engaged with them <em>exactly </em>as we did with our NYC-based engineers. </p><p>I believe the reason many if not most traditional outsourcing models falter is rarely that the offshore engineers or their companies suck. Y had good engineers, as did most of the non-US based teams I worked with over my time. In fact, more than good, <em>brilliant </em>engineers, from whom I learned a lot. </p><p>The fault, more often than not, lies in the hiring company. Or rather, the space between, aka the engagement protocol. An implicit pecking order grows unchecked, an us-and-them divide. Little or no agency is given to non-local teams. <em>Just do it as you&#8217;re told, </em>if not the actual words deployed, is often the covert (sometimes overt) sentiment.  As the corporate platitude goes, they are not set up for success. </p><p>This in fact ends up doing a disservice to the business as well. We miss out on all that this pool of talent has to offer by reducing it to a code-monkey army. I mean, your technical architect in Buenos Aires may draw the same <em>comp</em> as your analyst in New York, but that doesn&#8217;t make<em> </em>her an actual analyst. So why would you limit her responsibility scope to that role? Don&#8217;t you <em>want </em>to let her brilliant architect brain loose on your tech challenges?</p><p>This is what worked for us at Yieldstreet: avoiding <em>that. </em></p><p>There are many details in this ongoing experiment, but it really boils down to 5 things, that all coalesce into one idea: <em>They are us. We&#8217;re one team. </em></p><h3>1. We stopped calling it <em>offshore</em></h3><p>That was Step 0. We just banished that word (and adjacent ones, like <em>outsourced</em>) from our vocabulary. Decades of sub-optimal engagement style has actually morphed these terms into borderline pejoratives due to the implicit pecking order they&#8217;ve come to suggest, if not enforce. </p><p>These were our <em>global teams. </em>Any us-vs-them reference, however oblique, from <em>anyone, </em>was not tolerated. This seems like superficial verbal fluff, but it&#8217;s not. It was a very important distinction, and required unlearning of old habits, <em>on both sides. </em></p><p>And it wasn&#8217;t just words. We meant it. </p><h3>2. We integrated the teams  </h3><p>In every way possible. An engineer is an engineer is an engineer. Regardless of where she is located. </p><ul><li><p>All pods have a geographical mix of team members, tailored for the pod&#8217;s charter and needs. Aka the mix is merit-based. </p></li><li><p>Roles are similarly distributed on merit: pod leads, technical architects, manager, all others. Again: merit-based. We even had cross-office reporting structures, though there is some benefit in keeping those as local as possible.</p></li><li><p>Everyone has agency. Everyone plays a role in shaping what is built and is not just building what they are told. Everyone is encouraged, even <em>required </em>to ask questions, including the most fundamental question often denied to traditional offshore teams: <em>Why? </em></p></li><li><p>Team members, regardless of office location, interact with other parts of the org as needed - especially internal users of the products they work on: marketing, customer support, operations. </p></li></ul><p>One thing to watch out for here is time zones. The whole &#8220;24-hour dev cycle by getting a team in Asia&#8221; thing is an effing mirage. You need a meaningful overlap window in your workday for this to work well. </p><h3>3. We folded them into our HR processes</h3><p>This was key. All team members, agnostic to their location, were on the same career development plan, had the same L&amp;D opportunities, same review process, same bonus schedules, same recruiting process, same responsibilities based on their role, same social ceremonies - holiday parties, summer outings, dunk tanks, that sort of stuff. We even provided them with healthcare benefits.</p><p>Each location had Yieldstreet offices where these teams worked, following the same hybrid schedule, and complete with company branding, protein bars, and, well, other kinds of bars. </p><h3>4. We gave them skin in the game</h3><p>A specific innovation that built on #3: <em>They have equity in the company</em>. They are on the same ISO plan like all other employees. This is the first time I have seen this done, props to <a href="https://www.linkedin.com/in/milindmehere/">Milind</a>, one of Yieldstreet&#8217;s co-founders, for instituting that. Same grant brackets, same vesting schedules, same incentive, as everyone else. </p><h3>5. We enabled frequent facetimes</h3><p>We put in a cross-office travel budget; a mere fraction of the &#8220;savings&#8221; achieved by the geo-distribution of our talent. Multiple times a year, cohorts travel across our offices for a week or two, work side by side, eat and drink side by side, and actually have an enriching bonding experience and cultural cross-pollination. </p><p>Trust me, if you haven&#8217;t heard Maltese spoken with a Portuguese accent at the tail end of 4 pints of <a href="https://www.cisk.com/">Cisk</a>, you haven&#8217;t lived. </p><p>What&#8217;s more, these are now, I hope. friends for life, on both sides of the Atlantic. And they carry a strong identity of being a &#8220;Yieldstreeter&#8221;.</p><h3>Caveats</h3><p>I guess in hindsight I could have just reduced this whole post to one line: <em>Treat your non-local teams the same way you treat your local teams.</em> </p><p>That said, I do realize there may be legitimate gating factors to this: company policy may not allow full integration, regulatory guardrails or internal governance policies may limit data sharing etc. You will need to tailor the specifics to your context. But that doesn&#8217;t change the underlying spirit of the idea, which is human and behavioral: <em>one team.</em>  </p><p>It also requires the right<em> </em>kind of offshore partner, one that is open and flexible to adapt to your desired working model, whose business strategy is not volumetric, where 5 engineers are deployed to move a button 5 pixels to the left. I&#8217;ve been lucky in this regard to find good partners. (Y was not one of them.) </p><p>Of course, all this presumes you treat your local &#8220;FTE&#8221; teams well. I hope you do. </p><p><em>PS This journey was not always easy. There were definitely speed bumps. Cultural nuances and language barriers sometimes triggered misunderstandings. Pecking orders did evolve despite best attempts to avoid them. And it is still an experiment in progress. Like most everything else. But it has worked better than any distributed model I have seen or managed. And it keeps getting better every day.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.atleastonce.sh/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 At Least Once! 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[All tech is debt]]></title><description><![CDATA[About that old chestnut]]></description><link>https://www.atleastonce.sh/p/all-tech-is-debt</link><guid isPermaLink="false">https://www.atleastonce.sh/p/all-tech-is-debt</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Mon, 28 Oct 2024 18:03:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e94a7e33-ae53-48b5-9971-22666421235c_1000x1000.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s start this with a story.&nbsp;</p><p>Back in June 2000, I was writing some software for the Private Placement Division of a merchant bank called <a href="https://en.wikipedia.org/wiki/Thomas_Weisel_Partners">Thomas Weisel Partners</a> in San Francisco. JDK 1.3.1 if I remember right. I was quite proud of the stuff I built there, especially some third-party integrations with vendors like FedEx and Siebel (remember them?) - all this before things (or even terms) like &#8220;API&#8221; existed, let alone REST.&nbsp;</p><p>But one piece of code I was particularly proud of was a multipart file uploader, which I pretty much wrote from scratch over an all-nighter by reading and implementing the <a href="https://www.rfc-editor.org/rfc/rfc1867">original RFC</a> for it. Because there was nothing already available to do it - or rather, there was no Stack Overflow to check if there was. It was probably not very elegant, but the damn thing worked - on the first try. And Private Placement moved a lot of docs around, so it was &#8220;mission-critical&#8221;, and needed to be maintained.&nbsp;</p><p>A few months later I discovered <a href="https://struts.apache.org/">Struts</a> and realized I could have slept in the night I wrote it. &#175;\_(&#12484;)_/&#175;. We never got around to moving that functionality over. It&#8217;s probably still being maintained by some <a href="https://xkcd.com/2347/">poor schmuck in Nebraska</a>. (I&#8217;m still proud of that bit of coding though &#128578;).</p><p>Point of all this dorkage? <em><strong>All tech is debt</strong>.</em> It&#8217;s only a matter of time.&nbsp;</p><p>&#8220;Tech Debt&#8221; is the eternal bugaboo of startup-land. Pegged as the ultimate velocity killer (more on &#8220;velocity&#8221; in a later post), the persistent itch in the build-and-ship pipeline that just can&#8217;t get enough scratch, the receiving end of most accusatory fingers when bugs happen, the one thing standing in the way of continuous delivery utopia. Techies underscore it to clamor for sprint-space to do their beloved refactors (I&#8217;ve done it), rationalize missed deadlines (more on &#8220;deadlines&#8221; in a later post), and warn of dire unintended consequences and collateral damage if it isn&#8217;t addressed<em> <strong>now</strong>. </em>Business is confounded by it, and rightly so.</p><p>The way I have written the above paragraph makes it seem like it&#8217;s all resplendent baloney. It&#8217;s not. Tech debt is a real thing, and left unattended, it <em>can </em>cause all of that above. I have personally experienced this pain, at least twice. I just believe there is more nuance to it than the blanket statements I have seen hurled at it.&nbsp;</p><p>Here&#8217;s three things I have come to believe:</p><ol><li><p>Tech debt is inevitable.&nbsp;</p></li><li><p>There&#8217;s good tech debt and bad tech debt</p></li><li><p>Good debt can decay into bad &#8592; this is where the shyte goes down</p></li></ol><h3>Tech debt is inevitable</h3><p>Probably a good place to provide at least my definition of tech debt. In the broadest sense of the term:&nbsp;</p><p><em>Any piece of software that has to be maintained over time is, technically speaking, tech debt.&nbsp;</em></p><p>AKA:</p><p><em>All tech is debt</em></p><p>Software ages fast. And unlike many cheeses, mostly not well.&nbsp;</p><p>To be sure, there&#8217;s the voluntarily incurred debt, stemming from things like shortcuts on one end to over-engineering on the other, or &#8220;organic debt&#8221; in the extreme (<em><a href="https://www.atleastonce.sh/i/150852987/appendix-i-organically-bad-debt">Appendix I</a></em>). But even if you avoid all of these traps with your spectacular foresight and craft that perfect async service, that distributed framework you built your service on top of may be EOL-ed (or worse, licensed &#8211; true story), rendering your gumdrop software elegance into a mass of debt with a ticking clock inside it. Or the use case you architected for is no longer relevant, and you&#8217;re stuck with 4 microservices, 3 Kafka topics, and 11 events to update a user profile, which felt right at the time, but a CRUD endpoint would now do just fine.&nbsp;</p><p>Ergo: tech debt is inevitable. That&#8217;s just the way it goes. </p><p>(Except maybe for that use-once-and-toss data migration script you whipped up in Rust, that no one will ever see or inherit.)</p><h3>There&#8217;s good debt and bad debt</h3><p>Tech debt gets a bad rap, because &#8220;debt&#8221;.&nbsp;</p><p>But if you&#8217;re not voluntarily incurring a little tech debt in your startup journey, you&#8217;re most likely not moving fast enough. Or, as the bromide goes, &#8220;perfect is the enemy of good&#8221;. If a little bit of hardcoding (with a plan to abstract it out in the next couple of sprints) gets you to market sooner, or beat the competition to that launch, that&#8217;s the win. You don&#8217;t want to end up writing the best piece of software that no one uses.&nbsp;</p><p>There are of course, empirically bad slabs of debt often incurred by startups in early stages. I mean, don&#8217;t build your entire platform in Clojure, for Pete&#8217;s sake &#8211; where will you find the developers? </p><p>However, a small manageable piece of debt, voluntarily incurred to move the business forward faster, is a good thing. <em>However, </em>it is only as good as the payment plan built in to work that debt down. If you&#8217;re smelling a credit card debt analogy here, it&#8217;s coming soon, as this segues well into the next point.</p><h3>Good debt can decay into bad</h3><p>Almost all bad cases of tech debt I have seen, encountered, dealt with, even created, have been, in some shape, a case of &#8220;good debt&#8221; devolved into &#8220;bad debt&#8221;. This is the kind that causes a newly hired CTO to beg for &#8220;3 months to clean it all up&#8221;. And what early-stage startup has that kind of time?</p><p>Cue the credit card debt analogy. We all build debt monthly on our cards. It helps build our FICO scores and credit history. And the financially well-behaved among us pay the statements down in full every month. Conversely, if left unattended it can <em>rapidly </em>become untenable.&nbsp;</p><p>And so it goes with tech debt - the paydown plan is not put into place <em>as the debt is being created. </em>Or it is created but not followed. Or attempts to follow it are shot down. Or all of the above. So, more debt is created on top of old debt. And the debt-stack Jenga continues until the only solution is filing for bankruptcy. Aka the dreaded &#8220;full rewrite&#8221; - which causes engineers to salivate and business to hyperventilate in equal measure, both for good reasons.&nbsp;</p><p>If there&#8217;s one thing I&#8217;ve learnt, the hard way, it&#8217;s this: Good debt without a paydown plan will inevitably go bad. <em>Keep working the debt down every sprint, bit by bit, even as you accumulate new bits of debt.</em></p><h3>Where do we go from here</h3><p>I promised not to be very prescriptive in these ramblings. I won&#8217;t. Also, because historically, I have had limited success in managing this particular challenge. So, what follows here is really commentary on what I tried to do to contain it, or what I wish I had done sooner. </p><p>First off, avoid <a href="https://www.atleastonce.sh/i/150852987/appendix-i-organically-bad-debt">organically bad debt</a>. A good tech leader/CTO will do this by default: stack selection, foundational architecture, etc. I won&#8217;t spend too much time on that here for now.&nbsp;</p><p>Most importantly: Build a payment plan along with the debt. This can take several shapes but is mostly about habit creation and expectation management.&nbsp;</p><ol><li><p>For every ticket you create in a sprint that is &#8220;tech-debt-y&#8221; (say a declarative hardcoding for something) create a companion ticket for Sprint N+1 (or 2) to refactor to something less crude.&nbsp;</p></li><li><p>Fold debt reduction into ongoing enhancements. It will always be &#8220;faster&#8221; in the short term to ship something by stacking debt. Instead, price in a couple of extra hours to work that old debt down. Best way to shave tech debt is in the process of building something new.&nbsp;&nbsp;&nbsp;</p></li><li><p>Planned obsolescence. Remember I said all code eventually becomes debt? A large maintenance surface area can cause serious drag on shipping speed and increase the chance of unintended consequences. Keep measuring what&#8217;s being used and what isn&#8217;t, sunset old bits of code on a regular basis. A key prerequisite here is to measure use and adoption of everything new you build of course - but good product orgs do this by default.&nbsp;</p></li><li><p>Despite all best efforts, it is quite likely some corner of your platform may morph into a Golgothan over time that needs to be neutralized. It is more likely than not to happen. Define a quantified framework (complete with OKRs) to rationalize taking on this larger tech debt work. E.g. in the past, I have formulated a &#8220;<a href="https://www.atleastonce.sh/i/150852987/appendix-ii-the-pbsd-framework">PBSD Framework</a>&#8221; for greenlighting and scoping large-format debt reduction work. It helped - at least to make the case for it. &nbsp;</p></li></ol><p>I could go on and on about this, but I should stop here. It&#8217;s already gotten too long. If there&#8217;s interest, maybe there&#8217;s a part deux here someday.&nbsp;</p><p>But TL;DR here: don&#8217;t knock tech debt. It&#8217;s not all bad, and it&#8217;s not your fault. Just keep the Golgothan away. </p><div><hr></div><h3>Appendix I: Organically bad debt</h3><p>I don&#8217;t know what else to call it, but this refers to debt that&#8217;s bad from the get-go, unlike &#8220;good debt&#8221; gone bad over time.</p><ul><li><p>Prototype Becomes Product. Very common, sadly. And has happened to me, twice. The little proto you built to demo to VCs for your seed round? That&#8217;s <em>not your final product. </em>Use the proceeds from the seed to build it for real. </p><ul><li><p>This is an extreme case of &#8220;good debt gone bad&#8221;, and in absence of good tech leadership from the get-go, will almost certainly require a full rewrite.&nbsp;</p></li></ul></li><li><p>Obscure Stack Debt. Mentioned before: don&#8217;t go Erlang or Clojure or (shudder) Scala.&nbsp; Stick to well-understood, well-supported, talent-available languages and stacks for your core platform. Or you will have to rewrite it anyway. There&#8217;s always peripheral stuff you build to try out new cool tech.&nbsp;</p></li><li><p>Complexity Debt, aka over-engineering. Simple is beautiful, Microservices aren&#8217;t all that. Start with the simplest flow, complexify from there <em>if needed </em>(and in most cases isn&#8217;t). Making a complex distributed architecture simple is often harder than incrementally layering complexity with the right foundational architectural decisions.&nbsp;</p></li><li><p><em>I&#8217;m sure there are many more. These are the ones I ran into the most. Would love to hear about yours!</em></p></li></ul><h3>Appendix II: The PBSD Framework</h3><p>I&#8217;ve used this in the past to both analyze/greenlight and then measure the impact of large-format tech-debt initiatives, like major refactors or full rewrites. This was the PBSD rubric:</p><ul><li><p><strong>P</strong>erformance - is it slowing stuff down?</p></li><li><p><strong>B</strong>ug frequency - is it causing too many bugs?</p></li><li><p><strong>S</strong>calability - is it causing bottlenecks under traffic?</p></li><li><p><strong>D</strong>ev velocity - is it slowing down dev/ship velocity?</p></li></ul><p>For each proposed tech debt work, make it mandatory to publish a PBSD memo for discussion:</p><blockquote><p><strong>Function</strong></p><p>&lt;describe the function supported by this bit of software&gt;</p><p><strong>Cost of debt:&nbsp;</strong></p><p>&lt;some PBSD score, e.g. &#8220;PS&#8221;, to indicate the debt was impacting performance and scalability, along with some description of how&gt;</p><p><strong>Complexity</strong>: &lt;numerical score from 1 to 5, increasing with level of complexity&gt;</p><p><strong>Debt reduction path</strong></p><p>&lt;a bulleted list of proposed path to work down the debt&gt;</p><p><strong>Success metrics</strong></p><p>&lt;how would we measure success &#8211; OKRs, in effect&gt;</p></blockquote>]]></content:encoded></item><item><title><![CDATA[It's happened at least once before]]></title><description><![CDATA[Learning from scars, stumbles, and the occasional triumph in startup land]]></description><link>https://www.atleastonce.sh/p/at-least-once</link><guid isPermaLink="false">https://www.atleastonce.sh/p/at-least-once</guid><dc:creator><![CDATA[Hrishi Dixit]]></dc:creator><pubDate>Thu, 24 Oct 2024 12:55:04 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43274703-4a66-4075-a414-0d2082c3a6ea_820x575.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back-end geeks will likely grok the <a href="https://docs.confluent.io/kafka/design/delivery-semantics.html">Kafka-esque subtext</a> in the name of this blog. Yeah, the other Kafka, the broker guy, not the cockroach guy. Because, well, I am a back-end geek. </p><p>It&#8217;s catchy. Always a good thing. But there&#8217;s something to parse in there beyond delivery semantics. It&#8217;s a, well, catchy lede for what I am thinking of rambling about here - tech challenges in early and scale-stage startups. Because whatever challenge (or few) you may be running into, it&#8217;s very likely I have run into it&#8230; <em>at least once</em>. </p><p>See, I&#8217;ve spent the last 20+ years in #techstartupland - mostly in fintech (but that&#8217;s parenthetical) - but entirely as a geek: a software engineer, an architect, an engineering manager, a tech advisor, angel investor, and particularly, over the last 15+ years, as an early-to-scale-up stage CTO. </p><p>That&#8217;s a chunk of time to stumble, scratch, burn, recover, get bricked again, recover again. And learn, at every tumble, stumble, topple, slip, pick-your-fall-verb. </p><p>The learning never stops. </p><p>I may not have too many answers (also pontification is not my thing, nor is prescription), but I sure will enjoy sharing my experience on specific problems which, across my time in tech, I&#8217;ve realized are ubiquitous. domain-agnostic, and in most cases,  portable&#8230; as are some of the remedies that worked for me.</p><p>So that&#8217;s the idea. To bloviate about (stop me if any of these give you deja-vu) tech debt, engineering culture, offshoring, the infamous &#8220;productivity&#8221; mystery, strange new-age-y (for me) buzzwords like &#8220;full-stack&#8221;, stuff like that. </p><p>It&#8217;s likely you&#8217;ve run into at least one of these, at least once. </p>]]></content:encoded></item></channel></rss>